blob: 4f300e7a2adf51aab353048d4f768d1628c88f65 [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
Alex Light5098a612018-11-29 17:12:15 -0800787func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800788 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800789 apex {
790 name: "myapex",
791 key: "myapex.key",
792 payload_type: "zip",
793 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000794 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800795 }
796
797 apex_key {
798 name: "myapex.key",
799 public_key: "testkey.avbpubkey",
800 private_key: "testkey.pem",
801 }
802
803 cc_library {
804 name: "mylib",
805 srcs: ["mylib.cpp"],
806 shared_libs: ["mylib2"],
807 system_shared_libs: [],
808 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000809 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800810 }
811
812 cc_library {
813 name: "mylib2",
814 srcs: ["mylib.cpp"],
815 system_shared_libs: [],
816 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000817 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800818 }
819 `)
820
Sundong Ahnabb64432019-10-22 13:58:29 +0900821 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800822 copyCmds := zipApexRule.Args["copy_commands"]
823
824 // Ensure that main rule creates an output
825 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
826
827 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700828 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800829
830 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700831 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800832
833 // Ensure that both direct and indirect deps are copied into apex
834 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
835 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900836}
837
838func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800839 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900840 apex {
841 name: "myapex",
842 key: "myapex.key",
843 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900844 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000845 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900846 }
847
848 apex_key {
849 name: "myapex.key",
850 public_key: "testkey.avbpubkey",
851 private_key: "testkey.pem",
852 }
853
854 cc_library {
855 name: "mylib",
856 srcs: ["mylib.cpp"],
857 shared_libs: ["mylib2", "mylib3"],
858 system_shared_libs: [],
859 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000860 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900861 }
862
863 cc_library {
864 name: "mylib2",
865 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900866 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900867 system_shared_libs: [],
868 stl: "none",
869 stubs: {
870 versions: ["1", "2", "3"],
871 },
872 }
873
874 cc_library {
875 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900876 srcs: ["mylib.cpp"],
877 shared_libs: ["mylib4"],
878 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900879 stl: "none",
880 stubs: {
881 versions: ["10", "11", "12"],
882 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000883 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900884 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900885
886 cc_library {
887 name: "mylib4",
888 srcs: ["mylib.cpp"],
889 system_shared_libs: [],
890 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000891 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900892 }
Jiyong Park105dc322021-06-11 17:22:09 +0900893
894 rust_binary {
895 name: "foo.rust",
896 srcs: ["foo.rs"],
897 shared_libs: ["libfoo.shared_from_rust"],
898 prefer_rlib: true,
899 apex_available: ["myapex"],
900 }
901
902 cc_library_shared {
903 name: "libfoo.shared_from_rust",
904 srcs: ["mylib.cpp"],
905 system_shared_libs: [],
906 stl: "none",
907 stubs: {
908 versions: ["10", "11", "12"],
909 },
910 }
911
Jiyong Park25fc6a92018-11-18 18:02:45 +0900912 `)
913
Sundong Ahnabb64432019-10-22 13:58:29 +0900914 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900915 copyCmds := apexRule.Args["copy_commands"]
916
917 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800918 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919
920 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800921 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900922
923 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800924 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900925
Colin Crossaede88c2020-08-11 12:17:01 -0700926 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900927
928 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900929 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900930 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900931 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900932
933 // 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 -0700934 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900935 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700936 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900937
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700938 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
939 // is replaced by sharing of "cFlags" in cc/builder.go.
940 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
941 // module variable representing "cflags". So it was not detected by ensureNotContains.
942 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
943 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
944 // including the original cflags's "-include mylib.h".
945 //
Jiyong Park64379952018-12-13 18:37:29 +0900946 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700947 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
948 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900949
Jiyong Park85cc35a2022-07-17 11:30:47 +0900950 // Ensure that genstub for platform-provided lib is invoked with --systemapi
951 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
952 // Ensure that genstub for apex-provided lib is invoked with --apex
953 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900954
Jooyung Hana57af4a2020-01-23 05:36:59 +0000955 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900956 "lib64/mylib.so",
957 "lib64/mylib3.so",
958 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900959 "bin/foo.rust",
960 "lib64/libc++.so", // by the implicit dependency from foo.rust
961 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900962 })
Jiyong Park105dc322021-06-11 17:22:09 +0900963
964 // Ensure that stub dependency from a rust module is not included
965 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
966 // The rust module is linked to the stub cc library
967 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
968 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
969 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900970
971 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
972 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900973}
974
Jiyong Park1bc84122021-06-22 20:23:05 +0900975func TestApexCanUsePrivateApis(t *testing.T) {
976 ctx := testApex(t, `
977 apex {
978 name: "myapex",
979 key: "myapex.key",
980 native_shared_libs: ["mylib"],
981 binaries: ["foo.rust"],
982 updatable: false,
983 platform_apis: true,
984 }
985
986 apex_key {
987 name: "myapex.key",
988 public_key: "testkey.avbpubkey",
989 private_key: "testkey.pem",
990 }
991
992 cc_library {
993 name: "mylib",
994 srcs: ["mylib.cpp"],
995 shared_libs: ["mylib2"],
996 system_shared_libs: [],
997 stl: "none",
998 apex_available: [ "myapex" ],
999 }
1000
1001 cc_library {
1002 name: "mylib2",
1003 srcs: ["mylib.cpp"],
1004 cflags: ["-include mylib.h"],
1005 system_shared_libs: [],
1006 stl: "none",
1007 stubs: {
1008 versions: ["1", "2", "3"],
1009 },
1010 }
1011
1012 rust_binary {
1013 name: "foo.rust",
1014 srcs: ["foo.rs"],
1015 shared_libs: ["libfoo.shared_from_rust"],
1016 prefer_rlib: true,
1017 apex_available: ["myapex"],
1018 }
1019
1020 cc_library_shared {
1021 name: "libfoo.shared_from_rust",
1022 srcs: ["mylib.cpp"],
1023 system_shared_libs: [],
1024 stl: "none",
1025 stubs: {
1026 versions: ["10", "11", "12"],
1027 },
1028 }
1029 `)
1030
1031 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1032 copyCmds := apexRule.Args["copy_commands"]
1033
1034 // Ensure that indirect stubs dep is not included
1035 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1036 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1037
1038 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1039 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001040 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001041 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1042 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Parkd4a00632022-04-12 12:23:20 +09001043 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001044 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1045 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1046}
1047
Colin Cross7812fd32020-09-25 12:35:10 -07001048func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1049 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001050 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001051 apex {
1052 name: "myapex",
1053 key: "myapex.key",
1054 native_shared_libs: ["mylib", "mylib3"],
1055 min_sdk_version: "29",
1056 }
1057
1058 apex_key {
1059 name: "myapex.key",
1060 public_key: "testkey.avbpubkey",
1061 private_key: "testkey.pem",
1062 }
1063
1064 cc_library {
1065 name: "mylib",
1066 srcs: ["mylib.cpp"],
1067 shared_libs: ["mylib2", "mylib3"],
1068 system_shared_libs: [],
1069 stl: "none",
1070 apex_available: [ "myapex" ],
1071 min_sdk_version: "28",
1072 }
1073
1074 cc_library {
1075 name: "mylib2",
1076 srcs: ["mylib.cpp"],
1077 cflags: ["-include mylib.h"],
1078 system_shared_libs: [],
1079 stl: "none",
1080 stubs: {
1081 versions: ["28", "29", "30", "current"],
1082 },
1083 min_sdk_version: "28",
1084 }
1085
1086 cc_library {
1087 name: "mylib3",
1088 srcs: ["mylib.cpp"],
1089 shared_libs: ["mylib4"],
1090 system_shared_libs: [],
1091 stl: "none",
1092 stubs: {
1093 versions: ["28", "29", "30", "current"],
1094 },
1095 apex_available: [ "myapex" ],
1096 min_sdk_version: "28",
1097 }
1098
1099 cc_library {
1100 name: "mylib4",
1101 srcs: ["mylib.cpp"],
1102 system_shared_libs: [],
1103 stl: "none",
1104 apex_available: [ "myapex" ],
1105 min_sdk_version: "28",
1106 }
1107 `)
1108
1109 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1110 copyCmds := apexRule.Args["copy_commands"]
1111
1112 // Ensure that direct non-stubs dep is always included
1113 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1114
1115 // Ensure that indirect stubs dep is not included
1116 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1117
1118 // Ensure that direct stubs dep is included
1119 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1120
1121 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1122
Jiyong Park55549df2021-02-26 23:57:23 +09001123 // Ensure that mylib is linking with the latest version of stub for mylib2
1124 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001125 // ... and not linking to the non-stub (impl) variant of mylib2
1126 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1127
1128 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1129 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1130 // .. and not linking to the stubs variant of mylib3
1131 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1132
1133 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001134 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001135 ensureNotContains(t, mylib2Cflags, "-include ")
1136
Jiyong Park85cc35a2022-07-17 11:30:47 +09001137 // Ensure that genstub is invoked with --systemapi
1138 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001139
1140 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1141 "lib64/mylib.so",
1142 "lib64/mylib3.so",
1143 "lib64/mylib4.so",
1144 })
1145}
1146
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001147func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1148 t.Parallel()
1149 // myapex (Z)
1150 // mylib -----------------.
1151 // |
1152 // otherapex (29) |
1153 // libstub's versions: 29 Z current
1154 // |
1155 // <platform> |
1156 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001157 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001158 apex {
1159 name: "myapex",
1160 key: "myapex.key",
1161 native_shared_libs: ["mylib"],
1162 min_sdk_version: "Z", // non-final
1163 }
1164
1165 cc_library {
1166 name: "mylib",
1167 srcs: ["mylib.cpp"],
1168 shared_libs: ["libstub"],
1169 apex_available: ["myapex"],
1170 min_sdk_version: "Z",
1171 }
1172
1173 apex_key {
1174 name: "myapex.key",
1175 public_key: "testkey.avbpubkey",
1176 private_key: "testkey.pem",
1177 }
1178
1179 apex {
1180 name: "otherapex",
1181 key: "myapex.key",
1182 native_shared_libs: ["libstub"],
1183 min_sdk_version: "29",
1184 }
1185
1186 cc_library {
1187 name: "libstub",
1188 srcs: ["mylib.cpp"],
1189 stubs: {
1190 versions: ["29", "Z", "current"],
1191 },
1192 apex_available: ["otherapex"],
1193 min_sdk_version: "29",
1194 }
1195
1196 // platform module depending on libstub from otherapex should use the latest stub("current")
1197 cc_library {
1198 name: "libplatform",
1199 srcs: ["mylib.cpp"],
1200 shared_libs: ["libstub"],
1201 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001202 `,
1203 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1204 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1205 variables.Platform_sdk_final = proptools.BoolPtr(false)
1206 variables.Platform_version_active_codenames = []string{"Z"}
1207 }),
1208 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001209
Jiyong Park55549df2021-02-26 23:57:23 +09001210 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001211 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001212 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001213 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001214 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001215
1216 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1217 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1218 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1219 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1220 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1221}
1222
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001223func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001224 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001225 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001226 name: "myapex2",
1227 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001228 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001229 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001230 }
1231
1232 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001233 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001234 public_key: "testkey.avbpubkey",
1235 private_key: "testkey.pem",
1236 }
1237
1238 cc_library {
1239 name: "mylib",
1240 srcs: ["mylib.cpp"],
1241 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001242 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001243 system_shared_libs: [],
1244 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001245 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001246 }
1247
1248 cc_library {
1249 name: "libfoo",
1250 srcs: ["mylib.cpp"],
1251 shared_libs: ["libbar"],
1252 system_shared_libs: [],
1253 stl: "none",
1254 stubs: {
1255 versions: ["10", "20", "30"],
1256 },
1257 }
1258
1259 cc_library {
1260 name: "libbar",
1261 srcs: ["mylib.cpp"],
1262 system_shared_libs: [],
1263 stl: "none",
1264 }
1265
Jiyong Park678c8812020-02-07 17:25:49 +09001266 cc_library_static {
1267 name: "libbaz",
1268 srcs: ["mylib.cpp"],
1269 system_shared_libs: [],
1270 stl: "none",
1271 apex_available: [ "myapex2" ],
1272 }
1273
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001274 `)
1275
Jiyong Park83dc74b2020-01-14 18:38:44 +09001276 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001277 copyCmds := apexRule.Args["copy_commands"]
1278
1279 // Ensure that direct non-stubs dep is always included
1280 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1281
1282 // Ensure that indirect stubs dep is not included
1283 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1284
1285 // Ensure that dependency of stubs is not included
1286 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1287
Colin Crossaede88c2020-08-11 12:17:01 -07001288 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001289
1290 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001291 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001292 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001293 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001294
Jiyong Park3ff16992019-12-27 14:11:47 +09001295 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001296
1297 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1298 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001299
Artur Satayeva8bd1132020-04-27 18:07:06 +01001300 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001301 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001302
Artur Satayeva8bd1132020-04-27 18:07:06 +01001303 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001304 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001305}
1306
Jooyung Hand3639552019-08-09 12:57:43 +09001307func TestApexWithRuntimeLibsDependency(t *testing.T) {
1308 /*
1309 myapex
1310 |
1311 v (runtime_libs)
1312 mylib ------+------> libfoo [provides stub]
1313 |
1314 `------> libbar
1315 */
Colin Cross1c460562021-02-16 17:55:47 -08001316 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001317 apex {
1318 name: "myapex",
1319 key: "myapex.key",
1320 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001321 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001322 }
1323
1324 apex_key {
1325 name: "myapex.key",
1326 public_key: "testkey.avbpubkey",
1327 private_key: "testkey.pem",
1328 }
1329
1330 cc_library {
1331 name: "mylib",
1332 srcs: ["mylib.cpp"],
1333 runtime_libs: ["libfoo", "libbar"],
1334 system_shared_libs: [],
1335 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001336 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001337 }
1338
1339 cc_library {
1340 name: "libfoo",
1341 srcs: ["mylib.cpp"],
1342 system_shared_libs: [],
1343 stl: "none",
1344 stubs: {
1345 versions: ["10", "20", "30"],
1346 },
1347 }
1348
1349 cc_library {
1350 name: "libbar",
1351 srcs: ["mylib.cpp"],
1352 system_shared_libs: [],
1353 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001354 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001355 }
1356
1357 `)
1358
Sundong Ahnabb64432019-10-22 13:58:29 +09001359 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001360 copyCmds := apexRule.Args["copy_commands"]
1361
1362 // Ensure that direct non-stubs dep is always included
1363 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1364
1365 // Ensure that indirect stubs dep is not included
1366 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1367
1368 // Ensure that runtime_libs dep in included
1369 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1370
Sundong Ahnabb64432019-10-22 13:58:29 +09001371 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001372 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1373 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001374
1375}
1376
Paul Duffina02cae32021-03-09 01:44:06 +00001377var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1378 cc.PrepareForTestWithCcBuildComponents,
1379 PrepareForTestWithApexBuildComponents,
1380 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001381 apex {
1382 name: "com.android.runtime",
1383 key: "com.android.runtime.key",
1384 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001385 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001386 }
1387
1388 apex_key {
1389 name: "com.android.runtime.key",
1390 public_key: "testkey.avbpubkey",
1391 private_key: "testkey.pem",
1392 }
Paul Duffina02cae32021-03-09 01:44:06 +00001393 `),
1394 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1395)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001396
Paul Duffina02cae32021-03-09 01:44:06 +00001397func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001398 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001399 cc_library {
1400 name: "libc",
1401 no_libcrt: true,
1402 nocrt: true,
1403 stl: "none",
1404 system_shared_libs: [],
1405 stubs: { versions: ["1"] },
1406 apex_available: ["com.android.runtime"],
1407
1408 sanitize: {
1409 hwaddress: true,
1410 }
1411 }
1412
1413 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001414 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001415 no_libcrt: true,
1416 nocrt: true,
1417 stl: "none",
1418 system_shared_libs: [],
1419 srcs: [""],
1420 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001421 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001422
1423 sanitize: {
1424 never: true,
1425 },
Paul Duffina02cae32021-03-09 01:44:06 +00001426 } `)
1427 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001428
1429 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1430 "lib64/bionic/libc.so",
1431 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1432 })
1433
Colin Cross4c4c1be2022-02-10 11:41:18 -08001434 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001435
1436 installed := hwasan.Description("install libclang_rt.hwasan")
1437 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1438
1439 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1440 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1441 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1442}
1443
1444func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001445 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001446 prepareForTestOfRuntimeApexWithHwasan,
1447 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1448 variables.SanitizeDevice = []string{"hwaddress"}
1449 }),
1450 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001451 cc_library {
1452 name: "libc",
1453 no_libcrt: true,
1454 nocrt: true,
1455 stl: "none",
1456 system_shared_libs: [],
1457 stubs: { versions: ["1"] },
1458 apex_available: ["com.android.runtime"],
1459 }
1460
1461 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001462 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001463 no_libcrt: true,
1464 nocrt: true,
1465 stl: "none",
1466 system_shared_libs: [],
1467 srcs: [""],
1468 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001469 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001470
1471 sanitize: {
1472 never: true,
1473 },
1474 }
Paul Duffina02cae32021-03-09 01:44:06 +00001475 `)
1476 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001477
1478 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1479 "lib64/bionic/libc.so",
1480 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1481 })
1482
Colin Cross4c4c1be2022-02-10 11:41:18 -08001483 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001484
1485 installed := hwasan.Description("install libclang_rt.hwasan")
1486 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1487
1488 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1489 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1490 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1491}
1492
Jooyung Han61b66e92020-03-21 14:21:46 +00001493func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1494 testcases := []struct {
1495 name string
1496 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001497 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001498 shouldLink string
1499 shouldNotLink []string
1500 }{
1501 {
Jiyong Park55549df2021-02-26 23:57:23 +09001502 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001503 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001504 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001505 shouldLink: "current",
1506 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001507 },
1508 {
Jiyong Park55549df2021-02-26 23:57:23 +09001509 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001510 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001511 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001512 shouldLink: "current",
1513 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001514 },
1515 }
1516 for _, tc := range testcases {
1517 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001518 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001519 apex {
1520 name: "myapex",
1521 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001522 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001523 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001524 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001525 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001526
Jooyung Han61b66e92020-03-21 14:21:46 +00001527 apex_key {
1528 name: "myapex.key",
1529 public_key: "testkey.avbpubkey",
1530 private_key: "testkey.pem",
1531 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001532
Jooyung Han61b66e92020-03-21 14:21:46 +00001533 cc_library {
1534 name: "mylib",
1535 srcs: ["mylib.cpp"],
1536 vendor_available: true,
1537 shared_libs: ["libbar"],
1538 system_shared_libs: [],
1539 stl: "none",
1540 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001541 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001542 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001543
Jooyung Han61b66e92020-03-21 14:21:46 +00001544 cc_library {
1545 name: "libbar",
1546 srcs: ["mylib.cpp"],
1547 system_shared_libs: [],
1548 stl: "none",
1549 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001550 llndk: {
1551 symbol_file: "libbar.map.txt",
1552 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001553 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001554 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001555 withUnbundledBuild,
1556 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001557
Jooyung Han61b66e92020-03-21 14:21:46 +00001558 // Ensure that LLNDK dep is not included
1559 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1560 "lib64/mylib.so",
1561 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001562
Jooyung Han61b66e92020-03-21 14:21:46 +00001563 // Ensure that LLNDK dep is required
1564 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1565 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1566 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001567
Steven Moreland2c4000c2021-04-27 02:08:49 +00001568 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1569 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001570 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001571 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001572 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001573
Steven Moreland2c4000c2021-04-27 02:08:49 +00001574 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001575 ver := tc.shouldLink
1576 if tc.shouldLink == "current" {
1577 ver = strconv.Itoa(android.FutureApiLevelInt)
1578 }
1579 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001580 })
1581 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001582}
1583
Jiyong Park25fc6a92018-11-18 18:02:45 +09001584func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001585 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001586 apex {
1587 name: "myapex",
1588 key: "myapex.key",
1589 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001590 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001591 }
1592
1593 apex_key {
1594 name: "myapex.key",
1595 public_key: "testkey.avbpubkey",
1596 private_key: "testkey.pem",
1597 }
1598
1599 cc_library {
1600 name: "mylib",
1601 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001602 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001603 shared_libs: ["libdl#27"],
1604 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001605 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001606 }
1607
1608 cc_library_shared {
1609 name: "mylib_shared",
1610 srcs: ["mylib.cpp"],
1611 shared_libs: ["libdl#27"],
1612 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001613 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001614 }
1615
1616 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001617 name: "libBootstrap",
1618 srcs: ["mylib.cpp"],
1619 stl: "none",
1620 bootstrap: true,
1621 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001622 `)
1623
Sundong Ahnabb64432019-10-22 13:58:29 +09001624 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001625 copyCmds := apexRule.Args["copy_commands"]
1626
1627 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001628 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001629 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1630 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001631
1632 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001633 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001634
Colin Crossaede88c2020-08-11 12:17:01 -07001635 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1636 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1637 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001638
1639 // For dependency to libc
1640 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001641 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001642 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001643 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001644 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001645 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1646 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001647
1648 // For dependency to libm
1649 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001650 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001651 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001652 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001653 // ... and is not compiling with the stub
1654 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1655 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1656
1657 // For dependency to libdl
1658 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001659 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001660 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001661 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1662 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001663 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001664 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001665 // ... Cflags from stub is correctly exported to mylib
1666 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1667 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001668
1669 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001670 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1671 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1672 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1673 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001674}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001675
Jooyung Han749dc692020-04-15 11:03:39 +09001676func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001677 // there are three links between liba --> libz.
1678 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001679 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001680 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001681 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001682 apex {
1683 name: "myapex",
1684 key: "myapex.key",
1685 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001686 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001687 }
1688
1689 apex {
1690 name: "otherapex",
1691 key: "myapex.key",
1692 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001693 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001694 }
1695
1696 apex_key {
1697 name: "myapex.key",
1698 public_key: "testkey.avbpubkey",
1699 private_key: "testkey.pem",
1700 }
1701
1702 cc_library {
1703 name: "libx",
1704 shared_libs: ["liba"],
1705 system_shared_libs: [],
1706 stl: "none",
1707 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001708 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001709 }
1710
1711 cc_library {
1712 name: "liby",
1713 shared_libs: ["liba"],
1714 system_shared_libs: [],
1715 stl: "none",
1716 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001717 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001718 }
1719
1720 cc_library {
1721 name: "liba",
1722 shared_libs: ["libz"],
1723 system_shared_libs: [],
1724 stl: "none",
1725 apex_available: [
1726 "//apex_available:anyapex",
1727 "//apex_available:platform",
1728 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001729 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001730 }
1731
1732 cc_library {
1733 name: "libz",
1734 system_shared_libs: [],
1735 stl: "none",
1736 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001737 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001738 },
1739 }
Jooyung Han749dc692020-04-15 11:03:39 +09001740 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001741
1742 expectLink := func(from, from_variant, to, to_variant string) {
1743 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1744 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1745 }
1746 expectNoLink := func(from, from_variant, to, to_variant string) {
1747 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1748 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1749 }
1750 // platform liba is linked to non-stub version
1751 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001752 // liba in myapex is linked to current
1753 expectLink("liba", "shared_apex29", "libz", "shared_current")
1754 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001755 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001756 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001757 // liba in otherapex is linked to current
1758 expectLink("liba", "shared_apex30", "libz", "shared_current")
1759 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001760 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1761 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001762}
1763
Jooyung Hanaed150d2020-04-02 01:41:41 +09001764func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001765 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001766 apex {
1767 name: "myapex",
1768 key: "myapex.key",
1769 native_shared_libs: ["libx"],
1770 min_sdk_version: "R",
1771 }
1772
1773 apex_key {
1774 name: "myapex.key",
1775 public_key: "testkey.avbpubkey",
1776 private_key: "testkey.pem",
1777 }
1778
1779 cc_library {
1780 name: "libx",
1781 shared_libs: ["libz"],
1782 system_shared_libs: [],
1783 stl: "none",
1784 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001785 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001786 }
1787
1788 cc_library {
1789 name: "libz",
1790 system_shared_libs: [],
1791 stl: "none",
1792 stubs: {
1793 versions: ["29", "R"],
1794 },
1795 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001796 `,
1797 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1798 variables.Platform_version_active_codenames = []string{"R"}
1799 }),
1800 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001801
1802 expectLink := func(from, from_variant, to, to_variant string) {
1803 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1804 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1805 }
1806 expectNoLink := func(from, from_variant, to, to_variant string) {
1807 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1808 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1809 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001810 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1811 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001812 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1813 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001814}
1815
Jooyung Han4c4da062021-06-23 10:23:16 +09001816func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1817 testApex(t, `
1818 apex {
1819 name: "myapex",
1820 key: "myapex.key",
1821 java_libs: ["libx"],
1822 min_sdk_version: "S",
1823 }
1824
1825 apex_key {
1826 name: "myapex.key",
1827 public_key: "testkey.avbpubkey",
1828 private_key: "testkey.pem",
1829 }
1830
1831 java_library {
1832 name: "libx",
1833 srcs: ["a.java"],
1834 apex_available: [ "myapex" ],
1835 sdk_version: "current",
1836 min_sdk_version: "S", // should be okay
1837 }
1838 `,
1839 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1840 variables.Platform_version_active_codenames = []string{"S"}
1841 variables.Platform_sdk_codename = proptools.StringPtr("S")
1842 }),
1843 )
1844}
1845
Jooyung Han749dc692020-04-15 11:03:39 +09001846func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001847 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001848 apex {
1849 name: "myapex",
1850 key: "myapex.key",
1851 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001852 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001853 }
1854
1855 apex_key {
1856 name: "myapex.key",
1857 public_key: "testkey.avbpubkey",
1858 private_key: "testkey.pem",
1859 }
1860
1861 cc_library {
1862 name: "libx",
1863 shared_libs: ["libz"],
1864 system_shared_libs: [],
1865 stl: "none",
1866 apex_available: [ "myapex" ],
1867 }
1868
1869 cc_library {
1870 name: "libz",
1871 system_shared_libs: [],
1872 stl: "none",
1873 stubs: {
1874 versions: ["1", "2"],
1875 },
1876 }
1877 `)
1878
1879 expectLink := func(from, from_variant, to, to_variant string) {
1880 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1881 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1882 }
1883 expectNoLink := func(from, from_variant, to, to_variant string) {
1884 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1885 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1886 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001887 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001888 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001889 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001890 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001891}
1892
Jiyong Park5df7bd32021-08-25 16:18:46 +09001893func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1894 ctx := testApex(t, `
1895 apex {
1896 name: "myapex",
1897 key: "myapex.key",
1898 native_shared_libs: ["mylib"],
1899 updatable: false,
1900 vendor: true,
1901 min_sdk_version: "29",
1902 }
1903
1904 apex_key {
1905 name: "myapex.key",
1906 public_key: "testkey.avbpubkey",
1907 private_key: "testkey.pem",
1908 }
1909
1910 cc_library {
1911 name: "mylib",
1912 vendor_available: true,
1913 system_shared_libs: [],
1914 stl: "none",
1915 apex_available: [ "myapex" ],
1916 min_sdk_version: "29",
1917 }
1918 `)
1919
1920 vendorVariant := "android_vendor.29_arm64_armv8-a"
1921
1922 // First check that the correct variant of crtbegin_so is used.
1923 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1924 crtBegin := names(ldRule.Args["crtBegin"])
1925 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1926
1927 // Ensure that the crtbegin_so used by the APEX is targeting 29
1928 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1929 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1930}
1931
Jooyung Han03b51852020-02-26 22:45:42 +09001932func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001933 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001934 apex {
1935 name: "myapex",
1936 key: "myapex.key",
1937 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001938 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001939 }
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: "libx",
1949 system_shared_libs: [],
1950 stl: "none",
1951 apex_available: [ "myapex" ],
1952 stubs: {
1953 versions: ["1", "2"],
1954 },
1955 }
1956
1957 cc_library {
1958 name: "libz",
1959 shared_libs: ["libx"],
1960 system_shared_libs: [],
1961 stl: "none",
1962 }
1963 `)
1964
1965 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001966 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001967 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1968 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1969 }
1970 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001971 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001972 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1973 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1974 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001975 expectLink("libz", "shared", "libx", "shared_current")
1976 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001977 expectNoLink("libz", "shared", "libz", "shared_1")
1978 expectNoLink("libz", "shared", "libz", "shared")
1979}
1980
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001981var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1982 func(variables android.FixtureProductVariables) {
1983 variables.SanitizeDevice = []string{"hwaddress"}
1984 },
1985)
1986
Jooyung Han75568392020-03-20 04:29:24 +09001987func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001988 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001989 apex {
1990 name: "myapex",
1991 key: "myapex.key",
1992 native_shared_libs: ["libx"],
1993 min_sdk_version: "29",
1994 }
1995
1996 apex_key {
1997 name: "myapex.key",
1998 public_key: "testkey.avbpubkey",
1999 private_key: "testkey.pem",
2000 }
2001
2002 cc_library {
2003 name: "libx",
2004 shared_libs: ["libbar"],
2005 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002006 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002007 }
2008
2009 cc_library {
2010 name: "libbar",
2011 stubs: {
2012 versions: ["29", "30"],
2013 },
2014 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002015 `,
2016 prepareForTestWithSantitizeHwaddress,
2017 )
Jooyung Han03b51852020-02-26 22:45:42 +09002018 expectLink := func(from, from_variant, to, to_variant string) {
2019 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2020 libFlags := ld.Args["libFlags"]
2021 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2022 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002023 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002024}
2025
Jooyung Han75568392020-03-20 04:29:24 +09002026func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002027 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002028 apex {
2029 name: "myapex",
2030 key: "myapex.key",
2031 native_shared_libs: ["libx"],
2032 min_sdk_version: "29",
2033 }
2034
2035 apex_key {
2036 name: "myapex.key",
2037 public_key: "testkey.avbpubkey",
2038 private_key: "testkey.pem",
2039 }
2040
2041 cc_library {
2042 name: "libx",
2043 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002044 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002045 }
Jooyung Han75568392020-03-20 04:29:24 +09002046 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002047
2048 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002049 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002050 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002051 // note that platform variant is not.
2052 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002053 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002054}
2055
Jooyung Han749dc692020-04-15 11:03:39 +09002056func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2057 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002058 apex {
2059 name: "myapex",
2060 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002061 native_shared_libs: ["mylib"],
2062 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002063 }
2064
2065 apex_key {
2066 name: "myapex.key",
2067 public_key: "testkey.avbpubkey",
2068 private_key: "testkey.pem",
2069 }
Jooyung Han749dc692020-04-15 11:03:39 +09002070
2071 cc_library {
2072 name: "mylib",
2073 srcs: ["mylib.cpp"],
2074 system_shared_libs: [],
2075 stl: "none",
2076 apex_available: [
2077 "myapex",
2078 ],
2079 min_sdk_version: "30",
2080 }
2081 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002082
2083 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2084 apex {
2085 name: "myapex",
2086 key: "myapex.key",
2087 native_shared_libs: ["libfoo.ffi"],
2088 min_sdk_version: "29",
2089 }
2090
2091 apex_key {
2092 name: "myapex.key",
2093 public_key: "testkey.avbpubkey",
2094 private_key: "testkey.pem",
2095 }
2096
2097 rust_ffi_shared {
2098 name: "libfoo.ffi",
2099 srcs: ["foo.rs"],
2100 crate_name: "foo",
2101 apex_available: [
2102 "myapex",
2103 ],
2104 min_sdk_version: "30",
2105 }
2106 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002107
2108 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2109 apex {
2110 name: "myapex",
2111 key: "myapex.key",
2112 java_libs: ["libfoo"],
2113 min_sdk_version: "29",
2114 }
2115
2116 apex_key {
2117 name: "myapex.key",
2118 public_key: "testkey.avbpubkey",
2119 private_key: "testkey.pem",
2120 }
2121
2122 java_import {
2123 name: "libfoo",
2124 jars: ["libfoo.jar"],
2125 apex_available: [
2126 "myapex",
2127 ],
2128 min_sdk_version: "30",
2129 }
2130 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002131}
2132
2133func TestApexMinSdkVersion_Okay(t *testing.T) {
2134 testApex(t, `
2135 apex {
2136 name: "myapex",
2137 key: "myapex.key",
2138 native_shared_libs: ["libfoo"],
2139 java_libs: ["libbar"],
2140 min_sdk_version: "29",
2141 }
2142
2143 apex_key {
2144 name: "myapex.key",
2145 public_key: "testkey.avbpubkey",
2146 private_key: "testkey.pem",
2147 }
2148
2149 cc_library {
2150 name: "libfoo",
2151 srcs: ["mylib.cpp"],
2152 shared_libs: ["libfoo_dep"],
2153 apex_available: ["myapex"],
2154 min_sdk_version: "29",
2155 }
2156
2157 cc_library {
2158 name: "libfoo_dep",
2159 srcs: ["mylib.cpp"],
2160 apex_available: ["myapex"],
2161 min_sdk_version: "29",
2162 }
2163
2164 java_library {
2165 name: "libbar",
2166 sdk_version: "current",
2167 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002168 static_libs: [
2169 "libbar_dep",
2170 "libbar_import_dep",
2171 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002172 apex_available: ["myapex"],
2173 min_sdk_version: "29",
2174 }
2175
2176 java_library {
2177 name: "libbar_dep",
2178 sdk_version: "current",
2179 srcs: ["a.java"],
2180 apex_available: ["myapex"],
2181 min_sdk_version: "29",
2182 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002183
2184 java_import {
2185 name: "libbar_import_dep",
2186 jars: ["libbar.jar"],
2187 apex_available: ["myapex"],
2188 min_sdk_version: "29",
2189 }
Jooyung Han03b51852020-02-26 22:45:42 +09002190 `)
2191}
2192
Colin Cross8ca61c12022-10-06 21:00:14 -07002193func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2194 // Tests that an apex dependency with min_sdk_version higher than the
2195 // min_sdk_version of the apex is allowed as long as the dependency's
2196 // min_sdk_version is less than or equal to the api level that the
2197 // architecture was introduced in. In this case, arm64 didn't exist
2198 // until api level 21, so the arm64 code will never need to run on
2199 // an api level 20 device, even if other architectures of the apex
2200 // will.
2201 testApex(t, `
2202 apex {
2203 name: "myapex",
2204 key: "myapex.key",
2205 native_shared_libs: ["libfoo"],
2206 min_sdk_version: "20",
2207 }
2208
2209 apex_key {
2210 name: "myapex.key",
2211 public_key: "testkey.avbpubkey",
2212 private_key: "testkey.pem",
2213 }
2214
2215 cc_library {
2216 name: "libfoo",
2217 srcs: ["mylib.cpp"],
2218 apex_available: ["myapex"],
2219 min_sdk_version: "21",
2220 stl: "none",
2221 }
2222 `)
2223}
2224
Artur Satayev8cf899a2020-04-15 17:29:42 +01002225func TestJavaStableSdkVersion(t *testing.T) {
2226 testCases := []struct {
2227 name string
2228 expectedError string
2229 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002230 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002231 }{
2232 {
2233 name: "Non-updatable apex with non-stable dep",
2234 bp: `
2235 apex {
2236 name: "myapex",
2237 java_libs: ["myjar"],
2238 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002239 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002240 }
2241 apex_key {
2242 name: "myapex.key",
2243 public_key: "testkey.avbpubkey",
2244 private_key: "testkey.pem",
2245 }
2246 java_library {
2247 name: "myjar",
2248 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002249 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002250 apex_available: ["myapex"],
2251 }
2252 `,
2253 },
2254 {
2255 name: "Updatable apex with stable dep",
2256 bp: `
2257 apex {
2258 name: "myapex",
2259 java_libs: ["myjar"],
2260 key: "myapex.key",
2261 updatable: true,
2262 min_sdk_version: "29",
2263 }
2264 apex_key {
2265 name: "myapex.key",
2266 public_key: "testkey.avbpubkey",
2267 private_key: "testkey.pem",
2268 }
2269 java_library {
2270 name: "myjar",
2271 srcs: ["foo/bar/MyClass.java"],
2272 sdk_version: "current",
2273 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002274 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002275 }
2276 `,
2277 },
2278 {
2279 name: "Updatable apex with non-stable dep",
2280 expectedError: "cannot depend on \"myjar\"",
2281 bp: `
2282 apex {
2283 name: "myapex",
2284 java_libs: ["myjar"],
2285 key: "myapex.key",
2286 updatable: true,
2287 }
2288 apex_key {
2289 name: "myapex.key",
2290 public_key: "testkey.avbpubkey",
2291 private_key: "testkey.pem",
2292 }
2293 java_library {
2294 name: "myjar",
2295 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002296 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002297 apex_available: ["myapex"],
2298 }
2299 `,
2300 },
2301 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002302 name: "Updatable apex with non-stable legacy core platform dep",
2303 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2304 bp: `
2305 apex {
2306 name: "myapex",
2307 java_libs: ["myjar-uses-legacy"],
2308 key: "myapex.key",
2309 updatable: true,
2310 }
2311 apex_key {
2312 name: "myapex.key",
2313 public_key: "testkey.avbpubkey",
2314 private_key: "testkey.pem",
2315 }
2316 java_library {
2317 name: "myjar-uses-legacy",
2318 srcs: ["foo/bar/MyClass.java"],
2319 sdk_version: "core_platform",
2320 apex_available: ["myapex"],
2321 }
2322 `,
2323 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2324 },
2325 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002326 name: "Updatable apex with non-stable transitive dep",
2327 // This is not actually detecting that the transitive dependency is unstable, rather it is
2328 // detecting that the transitive dependency is building against a wider API surface than the
2329 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002330 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002331 bp: `
2332 apex {
2333 name: "myapex",
2334 java_libs: ["myjar"],
2335 key: "myapex.key",
2336 updatable: true,
2337 }
2338 apex_key {
2339 name: "myapex.key",
2340 public_key: "testkey.avbpubkey",
2341 private_key: "testkey.pem",
2342 }
2343 java_library {
2344 name: "myjar",
2345 srcs: ["foo/bar/MyClass.java"],
2346 sdk_version: "current",
2347 apex_available: ["myapex"],
2348 static_libs: ["transitive-jar"],
2349 }
2350 java_library {
2351 name: "transitive-jar",
2352 srcs: ["foo/bar/MyClass.java"],
2353 sdk_version: "core_platform",
2354 apex_available: ["myapex"],
2355 }
2356 `,
2357 },
2358 }
2359
2360 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002361 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2362 continue
2363 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002364 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002365 errorHandler := android.FixtureExpectsNoErrors
2366 if test.expectedError != "" {
2367 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002368 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002369 android.GroupFixturePreparers(
2370 java.PrepareForTestWithJavaDefaultModules,
2371 PrepareForTestWithApexBuildComponents,
2372 prepareForTestWithMyapex,
2373 android.OptionalFixturePreparer(test.preparer),
2374 ).
2375 ExtendWithErrorHandler(errorHandler).
2376 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002377 })
2378 }
2379}
2380
Jooyung Han749dc692020-04-15 11:03:39 +09002381func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2382 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2383 apex {
2384 name: "myapex",
2385 key: "myapex.key",
2386 native_shared_libs: ["mylib"],
2387 min_sdk_version: "29",
2388 }
2389
2390 apex_key {
2391 name: "myapex.key",
2392 public_key: "testkey.avbpubkey",
2393 private_key: "testkey.pem",
2394 }
2395
2396 cc_library {
2397 name: "mylib",
2398 srcs: ["mylib.cpp"],
2399 shared_libs: ["mylib2"],
2400 system_shared_libs: [],
2401 stl: "none",
2402 apex_available: [
2403 "myapex",
2404 ],
2405 min_sdk_version: "29",
2406 }
2407
2408 // indirect part of the apex
2409 cc_library {
2410 name: "mylib2",
2411 srcs: ["mylib.cpp"],
2412 system_shared_libs: [],
2413 stl: "none",
2414 apex_available: [
2415 "myapex",
2416 ],
2417 min_sdk_version: "30",
2418 }
2419 `)
2420}
2421
2422func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2423 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2424 apex {
2425 name: "myapex",
2426 key: "myapex.key",
2427 apps: ["AppFoo"],
2428 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002429 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002430 }
2431
2432 apex_key {
2433 name: "myapex.key",
2434 public_key: "testkey.avbpubkey",
2435 private_key: "testkey.pem",
2436 }
2437
2438 android_app {
2439 name: "AppFoo",
2440 srcs: ["foo/bar/MyClass.java"],
2441 sdk_version: "current",
2442 min_sdk_version: "29",
2443 system_modules: "none",
2444 stl: "none",
2445 static_libs: ["bar"],
2446 apex_available: [ "myapex" ],
2447 }
2448
2449 java_library {
2450 name: "bar",
2451 sdk_version: "current",
2452 srcs: ["a.java"],
2453 apex_available: [ "myapex" ],
2454 }
2455 `)
2456}
2457
2458func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002459 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002460 apex {
2461 name: "myapex",
2462 key: "myapex.key",
2463 native_shared_libs: ["mylib"],
2464 min_sdk_version: "29",
2465 }
2466
2467 apex_key {
2468 name: "myapex.key",
2469 public_key: "testkey.avbpubkey",
2470 private_key: "testkey.pem",
2471 }
2472
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002473 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002474 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2475 cc_library {
2476 name: "mylib",
2477 srcs: ["mylib.cpp"],
2478 shared_libs: ["mylib2"],
2479 system_shared_libs: [],
2480 stl: "none",
2481 apex_available: ["myapex", "otherapex"],
2482 min_sdk_version: "29",
2483 }
2484
2485 cc_library {
2486 name: "mylib2",
2487 srcs: ["mylib.cpp"],
2488 system_shared_libs: [],
2489 stl: "none",
2490 apex_available: ["otherapex"],
2491 stubs: { versions: ["29", "30"] },
2492 min_sdk_version: "30",
2493 }
2494
2495 apex {
2496 name: "otherapex",
2497 key: "myapex.key",
2498 native_shared_libs: ["mylib", "mylib2"],
2499 min_sdk_version: "30",
2500 }
2501 `)
2502 expectLink := func(from, from_variant, to, to_variant string) {
2503 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2504 libFlags := ld.Args["libFlags"]
2505 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2506 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002507 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002508 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002509}
2510
Jooyung Haned124c32021-01-26 11:43:46 +09002511func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002512 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2513 func(variables android.FixtureProductVariables) {
2514 variables.Platform_sdk_codename = proptools.StringPtr("S")
2515 variables.Platform_version_active_codenames = []string{"S"}
2516 },
2517 )
Jooyung Haned124c32021-01-26 11:43:46 +09002518 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2519 apex {
2520 name: "myapex",
2521 key: "myapex.key",
2522 native_shared_libs: ["libfoo"],
2523 min_sdk_version: "S",
2524 }
2525 apex_key {
2526 name: "myapex.key",
2527 public_key: "testkey.avbpubkey",
2528 private_key: "testkey.pem",
2529 }
2530 cc_library {
2531 name: "libfoo",
2532 shared_libs: ["libbar"],
2533 apex_available: ["myapex"],
2534 min_sdk_version: "29",
2535 }
2536 cc_library {
2537 name: "libbar",
2538 apex_available: ["myapex"],
2539 }
2540 `, withSAsActiveCodeNames)
2541}
2542
2543func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002544 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2545 variables.Platform_sdk_codename = proptools.StringPtr("S")
2546 variables.Platform_version_active_codenames = []string{"S", "T"}
2547 })
Colin Cross1c460562021-02-16 17:55:47 -08002548 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002549 apex {
2550 name: "myapex",
2551 key: "myapex.key",
2552 native_shared_libs: ["libfoo"],
2553 min_sdk_version: "S",
2554 }
2555 apex_key {
2556 name: "myapex.key",
2557 public_key: "testkey.avbpubkey",
2558 private_key: "testkey.pem",
2559 }
2560 cc_library {
2561 name: "libfoo",
2562 shared_libs: ["libbar"],
2563 apex_available: ["myapex"],
2564 min_sdk_version: "S",
2565 }
2566 cc_library {
2567 name: "libbar",
2568 stubs: {
2569 symbol_file: "libbar.map.txt",
2570 versions: ["30", "S", "T"],
2571 },
2572 }
2573 `, withSAsActiveCodeNames)
2574
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002575 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002576 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2577 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002578 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002579}
2580
Jiyong Park7c2ee712018-12-07 00:42:25 +09002581func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002582 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002583 apex {
2584 name: "myapex",
2585 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002586 native_shared_libs: ["mylib"],
2587 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002588 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002589 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002590 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002591 }
2592
2593 apex_key {
2594 name: "myapex.key",
2595 public_key: "testkey.avbpubkey",
2596 private_key: "testkey.pem",
2597 }
2598
2599 prebuilt_etc {
2600 name: "myetc",
2601 src: "myprebuilt",
2602 sub_dir: "foo/bar",
2603 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002604
2605 cc_library {
2606 name: "mylib",
2607 srcs: ["mylib.cpp"],
2608 relative_install_path: "foo/bar",
2609 system_shared_libs: [],
2610 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002611 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002612 }
2613
2614 cc_binary {
2615 name: "mybin",
2616 srcs: ["mylib.cpp"],
2617 relative_install_path: "foo/bar",
2618 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002619 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002620 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002621 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002622 `)
2623
Sundong Ahnabb64432019-10-22 13:58:29 +09002624 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002625 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002626
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002627 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002628 ensureContains(t, cmd, "/etc ")
2629 ensureContains(t, cmd, "/etc/foo ")
2630 ensureContains(t, cmd, "/etc/foo/bar ")
2631 ensureContains(t, cmd, "/lib64 ")
2632 ensureContains(t, cmd, "/lib64/foo ")
2633 ensureContains(t, cmd, "/lib64/foo/bar ")
2634 ensureContains(t, cmd, "/lib ")
2635 ensureContains(t, cmd, "/lib/foo ")
2636 ensureContains(t, cmd, "/lib/foo/bar ")
2637 ensureContains(t, cmd, "/bin ")
2638 ensureContains(t, cmd, "/bin/foo ")
2639 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002640}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002641
Jooyung Han35155c42020-02-06 17:33:20 +09002642func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002643 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002644 apex {
2645 name: "myapex",
2646 key: "myapex.key",
2647 multilib: {
2648 both: {
2649 native_shared_libs: ["mylib"],
2650 binaries: ["mybin"],
2651 },
2652 },
2653 compile_multilib: "both",
2654 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002655 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002656 }
2657
2658 apex_key {
2659 name: "myapex.key",
2660 public_key: "testkey.avbpubkey",
2661 private_key: "testkey.pem",
2662 }
2663
2664 cc_library {
2665 name: "mylib",
2666 relative_install_path: "foo/bar",
2667 system_shared_libs: [],
2668 stl: "none",
2669 apex_available: [ "myapex" ],
2670 native_bridge_supported: true,
2671 }
2672
2673 cc_binary {
2674 name: "mybin",
2675 relative_install_path: "foo/bar",
2676 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002677 stl: "none",
2678 apex_available: [ "myapex" ],
2679 native_bridge_supported: true,
2680 compile_multilib: "both", // default is "first" for binary
2681 multilib: {
2682 lib64: {
2683 suffix: "64",
2684 },
2685 },
2686 }
2687 `, withNativeBridgeEnabled)
2688 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2689 "bin/foo/bar/mybin",
2690 "bin/foo/bar/mybin64",
2691 "bin/arm/foo/bar/mybin",
2692 "bin/arm64/foo/bar/mybin64",
2693 "lib/foo/bar/mylib.so",
2694 "lib/arm/foo/bar/mylib.so",
2695 "lib64/foo/bar/mylib.so",
2696 "lib64/arm64/foo/bar/mylib.so",
2697 })
2698}
2699
Jooyung Han85d61762020-06-24 23:50:26 +09002700func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002701 result := android.GroupFixturePreparers(
2702 prepareForApexTest,
2703 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2704 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002705 apex {
2706 name: "myapex",
2707 key: "myapex.key",
2708 binaries: ["mybin"],
2709 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002710 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002711 }
2712 apex_key {
2713 name: "myapex.key",
2714 public_key: "testkey.avbpubkey",
2715 private_key: "testkey.pem",
2716 }
2717 cc_binary {
2718 name: "mybin",
2719 vendor: true,
2720 shared_libs: ["libfoo"],
2721 }
2722 cc_library {
2723 name: "libfoo",
2724 proprietary: true,
2725 }
2726 `)
2727
Colin Crossc68db4b2021-11-11 18:59:15 -08002728 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002729 "bin/mybin",
2730 "lib64/libfoo.so",
2731 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2732 "lib64/libc++.so",
2733 })
2734
Colin Crossc68db4b2021-11-11 18:59:15 -08002735 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2736 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002737 name := apexBundle.BaseModuleName()
2738 prefix := "TARGET_"
2739 var builder strings.Builder
2740 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002741 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002742 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002743 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002744
Colin Crossc68db4b2021-11-11 18:59:15 -08002745 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002746 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2747 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002748}
2749
Jooyung Hanc5a96762022-02-04 11:54:50 +09002750func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2751 testApexError(t, `Trying to include a VNDK library`, `
2752 apex {
2753 name: "myapex",
2754 key: "myapex.key",
2755 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2756 vendor: true,
2757 use_vndk_as_stable: true,
2758 updatable: false,
2759 }
2760 apex_key {
2761 name: "myapex.key",
2762 public_key: "testkey.avbpubkey",
2763 private_key: "testkey.pem",
2764 }`)
2765}
2766
Jooyung Handf78e212020-07-22 15:54:47 +09002767func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002768 // myapex myapex2
2769 // | |
2770 // mybin ------. mybin2
2771 // \ \ / |
2772 // (stable) .---\--------` |
2773 // \ / \ |
2774 // \ / \ /
2775 // libvndk libvendor
2776 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002777 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002778 apex {
2779 name: "myapex",
2780 key: "myapex.key",
2781 binaries: ["mybin"],
2782 vendor: true,
2783 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002784 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002785 }
2786 apex_key {
2787 name: "myapex.key",
2788 public_key: "testkey.avbpubkey",
2789 private_key: "testkey.pem",
2790 }
2791 cc_binary {
2792 name: "mybin",
2793 vendor: true,
2794 shared_libs: ["libvndk", "libvendor"],
2795 }
2796 cc_library {
2797 name: "libvndk",
2798 vndk: {
2799 enabled: true,
2800 },
2801 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002802 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002803 }
2804 cc_library {
2805 name: "libvendor",
2806 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002807 stl: "none",
2808 }
2809 apex {
2810 name: "myapex2",
2811 key: "myapex.key",
2812 binaries: ["mybin2"],
2813 vendor: true,
2814 use_vndk_as_stable: false,
2815 updatable: false,
2816 }
2817 cc_binary {
2818 name: "mybin2",
2819 vendor: true,
2820 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002821 }
2822 `)
2823
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002824 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002825
Jooyung Han91f92032022-02-04 12:36:33 +09002826 for _, tc := range []struct {
2827 name string
2828 apexName string
2829 moduleName string
2830 moduleVariant string
2831 libs []string
2832 contents []string
2833 requireVndkNamespace bool
2834 }{
2835 {
2836 name: "use_vndk_as_stable",
2837 apexName: "myapex",
2838 moduleName: "mybin",
2839 moduleVariant: vendorVariant + "_apex10000",
2840 libs: []string{
2841 // should link with vendor variants of VNDK libs(libvndk/libc++)
2842 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2843 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2844 // unstable Vendor libs as APEX variant
2845 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2846 },
2847 contents: []string{
2848 "bin/mybin",
2849 "lib64/libvendor.so",
2850 // VNDK libs (libvndk/libc++) are not included
2851 },
2852 requireVndkNamespace: true,
2853 },
2854 {
2855 name: "!use_vndk_as_stable",
2856 apexName: "myapex2",
2857 moduleName: "mybin2",
2858 moduleVariant: vendorVariant + "_myapex2",
2859 libs: []string{
2860 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2861 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2862 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2863 // unstable vendor libs have "merged" APEX variants
2864 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2865 },
2866 contents: []string{
2867 "bin/mybin2",
2868 "lib64/libvendor.so",
2869 // VNDK libs are included as well
2870 "lib64/libvndk.so",
2871 "lib64/libc++.so",
2872 },
2873 requireVndkNamespace: false,
2874 },
2875 } {
2876 t.Run(tc.name, func(t *testing.T) {
2877 // Check linked libs
2878 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2879 libs := names(ldRule.Args["libFlags"])
2880 for _, lib := range tc.libs {
2881 ensureListContains(t, libs, lib)
2882 }
2883 // Check apex contents
2884 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002885
Jooyung Han91f92032022-02-04 12:36:33 +09002886 // Check "requireNativeLibs"
2887 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2888 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2889 if tc.requireVndkNamespace {
2890 ensureListContains(t, requireNativeLibs, ":vndk")
2891 } else {
2892 ensureListNotContains(t, requireNativeLibs, ":vndk")
2893 }
2894 })
2895 }
Jooyung Handf78e212020-07-22 15:54:47 +09002896}
2897
Justin Yun13decfb2021-03-08 19:25:55 +09002898func TestProductVariant(t *testing.T) {
2899 ctx := testApex(t, `
2900 apex {
2901 name: "myapex",
2902 key: "myapex.key",
2903 updatable: false,
2904 product_specific: true,
2905 binaries: ["foo"],
2906 }
2907
2908 apex_key {
2909 name: "myapex.key",
2910 public_key: "testkey.avbpubkey",
2911 private_key: "testkey.pem",
2912 }
2913
2914 cc_binary {
2915 name: "foo",
2916 product_available: true,
2917 apex_available: ["myapex"],
2918 srcs: ["foo.cpp"],
2919 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002920 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2921 variables.ProductVndkVersion = proptools.StringPtr("current")
2922 }),
2923 )
Justin Yun13decfb2021-03-08 19:25:55 +09002924
2925 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002926 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002927 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2928 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2929 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2930 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2931}
2932
Jooyung Han8e5685d2020-09-21 11:02:57 +09002933func TestApex_withPrebuiltFirmware(t *testing.T) {
2934 testCases := []struct {
2935 name string
2936 additionalProp string
2937 }{
2938 {"system apex with prebuilt_firmware", ""},
2939 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2940 }
2941 for _, tc := range testCases {
2942 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002943 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002944 apex {
2945 name: "myapex",
2946 key: "myapex.key",
2947 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002948 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002949 `+tc.additionalProp+`
2950 }
2951 apex_key {
2952 name: "myapex.key",
2953 public_key: "testkey.avbpubkey",
2954 private_key: "testkey.pem",
2955 }
2956 prebuilt_firmware {
2957 name: "myfirmware",
2958 src: "myfirmware.bin",
2959 filename_from_src: true,
2960 `+tc.additionalProp+`
2961 }
2962 `)
2963 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2964 "etc/firmware/myfirmware.bin",
2965 })
2966 })
2967 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002968}
2969
Jooyung Hanefb184e2020-06-25 17:14:25 +09002970func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002971 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002972 apex {
2973 name: "myapex",
2974 key: "myapex.key",
2975 vendor: true,
2976 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002977 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002978 }
2979
2980 apex_key {
2981 name: "myapex.key",
2982 public_key: "testkey.avbpubkey",
2983 private_key: "testkey.pem",
2984 }
2985
2986 cc_library {
2987 name: "mylib",
2988 vendor_available: true,
2989 }
2990 `)
2991
2992 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002993 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002994 name := apexBundle.BaseModuleName()
2995 prefix := "TARGET_"
2996 var builder strings.Builder
2997 data.Custom(&builder, name, prefix, "", data)
2998 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00002999 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 +09003000}
3001
Jooyung Han2ed99d02020-06-24 23:26:26 +09003002func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003003 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003004 apex {
3005 name: "myapex",
3006 key: "myapex.key",
3007 vintf_fragments: ["fragment.xml"],
3008 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003009 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003010 }
3011 apex_key {
3012 name: "myapex.key",
3013 public_key: "testkey.avbpubkey",
3014 private_key: "testkey.pem",
3015 }
3016 cc_binary {
3017 name: "mybin",
3018 }
3019 `)
3020
3021 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003022 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003023 name := apexBundle.BaseModuleName()
3024 prefix := "TARGET_"
3025 var builder strings.Builder
3026 data.Custom(&builder, name, prefix, "", data)
3027 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003028 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003029 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003030}
3031
Jiyong Park16e91a02018-12-20 18:18:08 +09003032func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003033 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003034 apex {
3035 name: "myapex",
3036 key: "myapex.key",
3037 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003038 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003039 }
3040
3041 apex_key {
3042 name: "myapex.key",
3043 public_key: "testkey.avbpubkey",
3044 private_key: "testkey.pem",
3045 }
3046
3047 cc_library {
3048 name: "mylib",
3049 srcs: ["mylib.cpp"],
3050 system_shared_libs: [],
3051 stl: "none",
3052 stubs: {
3053 versions: ["1", "2", "3"],
3054 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003055 apex_available: [
3056 "//apex_available:platform",
3057 "myapex",
3058 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003059 }
3060
3061 cc_binary {
3062 name: "not_in_apex",
3063 srcs: ["mylib.cpp"],
3064 static_libs: ["mylib"],
3065 static_executable: true,
3066 system_shared_libs: [],
3067 stl: "none",
3068 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003069 `)
3070
Colin Cross7113d202019-11-20 16:39:12 -08003071 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003072
3073 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003074 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003075}
Jiyong Park9335a262018-12-24 11:31:58 +09003076
3077func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003078 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003079 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003080 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003081 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003082 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003083 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003084 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003085 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003086 }
3087
3088 cc_library {
3089 name: "mylib",
3090 srcs: ["mylib.cpp"],
3091 system_shared_libs: [],
3092 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003093 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003094 }
3095
3096 apex_key {
3097 name: "myapex.key",
3098 public_key: "testkey.avbpubkey",
3099 private_key: "testkey.pem",
3100 }
3101
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003102 android_app_certificate {
3103 name: "myapex.certificate",
3104 certificate: "testkey",
3105 }
3106
3107 android_app_certificate {
3108 name: "myapex.certificate.override",
3109 certificate: "testkey.override",
3110 }
3111
Jiyong Park9335a262018-12-24 11:31:58 +09003112 `)
3113
3114 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003115 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003116
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003117 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3118 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003119 "vendor/foo/devkeys/testkey.avbpubkey")
3120 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003121 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3122 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003123 "vendor/foo/devkeys/testkey.pem")
3124 }
3125
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003126 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003127 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003128 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003129 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003130 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003131 }
3132}
Jiyong Park58e364a2019-01-19 19:24:06 +09003133
Jooyung Hanf121a652019-12-17 14:30:11 +09003134func TestCertificate(t *testing.T) {
3135 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003136 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003137 apex {
3138 name: "myapex",
3139 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003140 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003141 }
3142 apex_key {
3143 name: "myapex.key",
3144 public_key: "testkey.avbpubkey",
3145 private_key: "testkey.pem",
3146 }`)
3147 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3148 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3149 if actual := rule.Args["certificates"]; actual != expected {
3150 t.Errorf("certificates should be %q, not %q", expected, actual)
3151 }
3152 })
3153 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003154 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003155 apex {
3156 name: "myapex_keytest",
3157 key: "myapex.key",
3158 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003159 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003160 }
3161 apex_key {
3162 name: "myapex.key",
3163 public_key: "testkey.avbpubkey",
3164 private_key: "testkey.pem",
3165 }
3166 android_app_certificate {
3167 name: "myapex.certificate.override",
3168 certificate: "testkey.override",
3169 }`)
3170 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3171 expected := "testkey.override.x509.pem testkey.override.pk8"
3172 if actual := rule.Args["certificates"]; actual != expected {
3173 t.Errorf("certificates should be %q, not %q", expected, actual)
3174 }
3175 })
3176 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003177 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003178 apex {
3179 name: "myapex",
3180 key: "myapex.key",
3181 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003182 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003183 }
3184 apex_key {
3185 name: "myapex.key",
3186 public_key: "testkey.avbpubkey",
3187 private_key: "testkey.pem",
3188 }
3189 android_app_certificate {
3190 name: "myapex.certificate",
3191 certificate: "testkey",
3192 }`)
3193 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3194 expected := "testkey.x509.pem testkey.pk8"
3195 if actual := rule.Args["certificates"]; actual != expected {
3196 t.Errorf("certificates should be %q, not %q", expected, actual)
3197 }
3198 })
3199 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003200 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003201 apex {
3202 name: "myapex_keytest",
3203 key: "myapex.key",
3204 file_contexts: ":myapex-file_contexts",
3205 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003206 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003207 }
3208 apex_key {
3209 name: "myapex.key",
3210 public_key: "testkey.avbpubkey",
3211 private_key: "testkey.pem",
3212 }
3213 android_app_certificate {
3214 name: "myapex.certificate.override",
3215 certificate: "testkey.override",
3216 }`)
3217 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3218 expected := "testkey.override.x509.pem testkey.override.pk8"
3219 if actual := rule.Args["certificates"]; actual != expected {
3220 t.Errorf("certificates should be %q, not %q", expected, actual)
3221 }
3222 })
3223 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003224 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003225 apex {
3226 name: "myapex",
3227 key: "myapex.key",
3228 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003229 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003230 }
3231 apex_key {
3232 name: "myapex.key",
3233 public_key: "testkey.avbpubkey",
3234 private_key: "testkey.pem",
3235 }`)
3236 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3237 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3238 if actual := rule.Args["certificates"]; actual != expected {
3239 t.Errorf("certificates should be %q, not %q", expected, actual)
3240 }
3241 })
3242 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003243 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003244 apex {
3245 name: "myapex_keytest",
3246 key: "myapex.key",
3247 file_contexts: ":myapex-file_contexts",
3248 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003249 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003250 }
3251 apex_key {
3252 name: "myapex.key",
3253 public_key: "testkey.avbpubkey",
3254 private_key: "testkey.pem",
3255 }
3256 android_app_certificate {
3257 name: "myapex.certificate.override",
3258 certificate: "testkey.override",
3259 }`)
3260 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3261 expected := "testkey.override.x509.pem testkey.override.pk8"
3262 if actual := rule.Args["certificates"]; actual != expected {
3263 t.Errorf("certificates should be %q, not %q", expected, actual)
3264 }
3265 })
3266}
3267
Jiyong Park58e364a2019-01-19 19:24:06 +09003268func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003269 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003270 apex {
3271 name: "myapex",
3272 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003273 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003274 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003275 }
3276
3277 apex {
3278 name: "otherapex",
3279 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003280 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003281 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003282 }
3283
3284 apex_key {
3285 name: "myapex.key",
3286 public_key: "testkey.avbpubkey",
3287 private_key: "testkey.pem",
3288 }
3289
3290 cc_library {
3291 name: "mylib",
3292 srcs: ["mylib.cpp"],
3293 system_shared_libs: [],
3294 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003295 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003296 "myapex",
3297 "otherapex",
3298 ],
Jooyung Han24282772020-03-21 23:20:55 +09003299 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003300 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003301 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003302 cc_library {
3303 name: "mylib2",
3304 srcs: ["mylib.cpp"],
3305 system_shared_libs: [],
3306 stl: "none",
3307 apex_available: [
3308 "myapex",
3309 "otherapex",
3310 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003311 static_libs: ["mylib3"],
3312 recovery_available: true,
3313 min_sdk_version: "29",
3314 }
3315 cc_library {
3316 name: "mylib3",
3317 srcs: ["mylib.cpp"],
3318 system_shared_libs: [],
3319 stl: "none",
3320 apex_available: [
3321 "myapex",
3322 "otherapex",
3323 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003324 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003325 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003326 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003327 `)
3328
Jooyung Hanc87a0592020-03-02 17:44:33 +09003329 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003330 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003331 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003332
Vinh Tranf9754732023-01-19 22:41:46 -05003333 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003334 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003335 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003336
Vinh Tranf9754732023-01-19 22:41:46 -05003337 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003338 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003339 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003340
Colin Crossaede88c2020-08-11 12:17:01 -07003341 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3342 // each variant defines additional macros to distinguish which apex variant it is built for
3343
3344 // non-APEX variant does not have __ANDROID_APEX__ defined
3345 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3346 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3347
Vinh Tranf9754732023-01-19 22:41:46 -05003348 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003349 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3350 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003351
Jooyung Hanc87a0592020-03-02 17:44:33 +09003352 // non-APEX variant does not have __ANDROID_APEX__ defined
3353 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3354 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3355
Vinh Tranf9754732023-01-19 22:41:46 -05003356 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003357 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003358 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003359}
Jiyong Park7e636d02019-01-28 16:16:54 +09003360
3361func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003362 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003363 apex {
3364 name: "myapex",
3365 key: "myapex.key",
3366 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003367 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003368 }
3369
3370 apex_key {
3371 name: "myapex.key",
3372 public_key: "testkey.avbpubkey",
3373 private_key: "testkey.pem",
3374 }
3375
3376 cc_library_headers {
3377 name: "mylib_headers",
3378 export_include_dirs: ["my_include"],
3379 system_shared_libs: [],
3380 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003381 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003382 }
3383
3384 cc_library {
3385 name: "mylib",
3386 srcs: ["mylib.cpp"],
3387 system_shared_libs: [],
3388 stl: "none",
3389 header_libs: ["mylib_headers"],
3390 export_header_lib_headers: ["mylib_headers"],
3391 stubs: {
3392 versions: ["1", "2", "3"],
3393 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003394 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003395 }
3396
3397 cc_library {
3398 name: "otherlib",
3399 srcs: ["mylib.cpp"],
3400 system_shared_libs: [],
3401 stl: "none",
3402 shared_libs: ["mylib"],
3403 }
3404 `)
3405
Colin Cross7113d202019-11-20 16:39:12 -08003406 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003407
3408 // Ensure that the include path of the header lib is exported to 'otherlib'
3409 ensureContains(t, cFlags, "-Imy_include")
3410}
Alex Light9670d332019-01-29 18:07:33 -08003411
Jiyong Park7cd10e32020-01-14 09:22:18 +09003412type fileInApex struct {
3413 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003414 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003415 isLink bool
3416}
3417
Jooyung Han1724d582022-12-21 10:17:44 +09003418func (f fileInApex) String() string {
3419 return f.src + ":" + f.path
3420}
3421
3422func (f fileInApex) match(expectation string) bool {
3423 parts := strings.Split(expectation, ":")
3424 if len(parts) == 1 {
3425 match, _ := path.Match(parts[0], f.path)
3426 return match
3427 }
3428 if len(parts) == 2 {
3429 matchSrc, _ := path.Match(parts[0], f.src)
3430 matchDst, _ := path.Match(parts[1], f.path)
3431 return matchSrc && matchDst
3432 }
3433 panic("invalid expected file specification: " + expectation)
3434}
3435
Jooyung Hana57af4a2020-01-23 05:36:59 +00003436func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003437 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003438 module := ctx.ModuleForTests(moduleName, variant)
3439 apexRule := module.MaybeRule("apexRule")
3440 apexDir := "/image.apex/"
3441 if apexRule.Rule == nil {
3442 apexRule = module.Rule("zipApexRule")
3443 apexDir = "/image.zipapex/"
3444 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003445 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003446 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003447 for _, cmd := range strings.Split(copyCmds, "&&") {
3448 cmd = strings.TrimSpace(cmd)
3449 if cmd == "" {
3450 continue
3451 }
3452 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003453 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003454 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003455 switch terms[0] {
3456 case "mkdir":
3457 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003458 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003459 t.Fatal("copyCmds contains invalid cp command", cmd)
3460 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003461 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003462 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003463 isLink = false
3464 case "ln":
3465 if len(terms) != 3 && len(terms) != 4 {
3466 // ln LINK TARGET or ln -s LINK TARGET
3467 t.Fatal("copyCmds contains invalid ln command", cmd)
3468 }
3469 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003470 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003471 isLink = true
3472 default:
3473 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3474 }
3475 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003476 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003477 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003478 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003479 }
Jooyung Han1724d582022-12-21 10:17:44 +09003480 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003481 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003482 }
3483 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003484 return ret
3485}
3486
Jooyung Hana57af4a2020-01-23 05:36:59 +00003487func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3488 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003489 var failed bool
3490 var surplus []string
3491 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003492 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Han1724d582022-12-21 10:17:44 +09003493 matchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003494 for _, expected := range files {
Jooyung Han1724d582022-12-21 10:17:44 +09003495 if file.match(expected) {
3496 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003497 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003498 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003499 }
3500 }
Jooyung Han1724d582022-12-21 10:17:44 +09003501 if !matchFound {
3502 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003503 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003504 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003505
Jooyung Han31c470b2019-10-18 16:26:59 +09003506 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003507 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003508 t.Log("surplus files", surplus)
3509 failed = true
3510 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003511
3512 if len(files) > len(filesMatched) {
3513 var missing []string
3514 for _, expected := range files {
3515 if !filesMatched[expected] {
3516 missing = append(missing, expected)
3517 }
3518 }
3519 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003520 t.Log("missing files", missing)
3521 failed = true
3522 }
3523 if failed {
3524 t.Fail()
3525 }
3526}
3527
Jooyung Han344d5432019-08-23 11:17:39 +09003528func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003529 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003530 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003531 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003532 "etc/llndk.libraries.29.txt",
3533 "etc/vndkcore.libraries.29.txt",
3534 "etc/vndksp.libraries.29.txt",
3535 "etc/vndkprivate.libraries.29.txt",
3536 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003537 }
3538 testCases := []struct {
3539 vndkVersion string
3540 expectedFiles []string
3541 }{
3542 {
3543 vndkVersion: "current",
3544 expectedFiles: append(commonFiles,
3545 "lib/libvndk.so",
3546 "lib/libvndksp.so",
3547 "lib64/libvndk.so",
3548 "lib64/libvndksp.so"),
3549 },
3550 {
3551 vndkVersion: "",
3552 expectedFiles: append(commonFiles,
3553 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3554 "lib/libvndksp.so",
3555 "lib64/libvndksp.so"),
3556 },
3557 }
3558 for _, tc := range testCases {
3559 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3560 ctx := testApex(t, `
3561 apex_vndk {
3562 name: "com.android.vndk.current",
3563 key: "com.android.vndk.current.key",
3564 updatable: false,
3565 }
3566
3567 apex_key {
3568 name: "com.android.vndk.current.key",
3569 public_key: "testkey.avbpubkey",
3570 private_key: "testkey.pem",
3571 }
3572
3573 cc_library {
3574 name: "libvndk",
3575 srcs: ["mylib.cpp"],
3576 vendor_available: true,
3577 product_available: true,
3578 vndk: {
3579 enabled: true,
3580 },
3581 system_shared_libs: [],
3582 stl: "none",
3583 apex_available: [ "com.android.vndk.current" ],
3584 }
3585
3586 cc_library {
3587 name: "libvndksp",
3588 srcs: ["mylib.cpp"],
3589 vendor_available: true,
3590 product_available: true,
3591 vndk: {
3592 enabled: true,
3593 support_system_process: true,
3594 },
3595 system_shared_libs: [],
3596 stl: "none",
3597 apex_available: [ "com.android.vndk.current" ],
3598 }
3599
3600 // VNDK-Ext should not cause any problems
3601
3602 cc_library {
3603 name: "libvndk.ext",
3604 srcs: ["mylib2.cpp"],
3605 vendor: true,
3606 vndk: {
3607 enabled: true,
3608 extends: "libvndk",
3609 },
3610 system_shared_libs: [],
3611 stl: "none",
3612 }
3613
3614 cc_library {
3615 name: "libvndksp.ext",
3616 srcs: ["mylib2.cpp"],
3617 vendor: true,
3618 vndk: {
3619 enabled: true,
3620 support_system_process: true,
3621 extends: "libvndksp",
3622 },
3623 system_shared_libs: [],
3624 stl: "none",
3625 }
3626 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3627 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3628 }))
3629 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3630 })
3631 }
Jooyung Han344d5432019-08-23 11:17:39 +09003632}
3633
3634func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003635 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003636 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003637 name: "com.android.vndk.current",
3638 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003639 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003640 }
3641
3642 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003643 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003644 public_key: "testkey.avbpubkey",
3645 private_key: "testkey.pem",
3646 }
3647
3648 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003649 name: "libvndk",
3650 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003651 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003652 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003653 vndk: {
3654 enabled: true,
3655 },
3656 system_shared_libs: [],
3657 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003658 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003659 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003660
3661 cc_prebuilt_library_shared {
3662 name: "libvndk.arm",
3663 srcs: ["libvndk.arm.so"],
3664 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003665 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003666 vndk: {
3667 enabled: true,
3668 },
3669 enabled: false,
3670 arch: {
3671 arm: {
3672 enabled: true,
3673 },
3674 },
3675 system_shared_libs: [],
3676 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003677 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003678 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003679 `+vndkLibrariesTxtFiles("current"),
3680 withFiles(map[string][]byte{
3681 "libvndk.so": nil,
3682 "libvndk.arm.so": nil,
3683 }))
Colin Cross2807f002021-03-02 10:15:29 -08003684 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003685 "lib/libvndk.so",
3686 "lib/libvndk.arm.so",
3687 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003688 "lib/libc++.so",
3689 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003690 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003691 })
Jooyung Han344d5432019-08-23 11:17:39 +09003692}
3693
Jooyung Han39edb6c2019-11-06 16:53:07 +09003694func vndkLibrariesTxtFiles(vers ...string) (result string) {
3695 for _, v := range vers {
3696 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003697 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003698 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003699 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003700 name: "` + txt + `.libraries.txt",
3701 }
3702 `
3703 }
3704 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003705 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003706 result += `
3707 prebuilt_etc {
3708 name: "` + txt + `.libraries.` + v + `.txt",
3709 src: "dummy.txt",
3710 }
3711 `
3712 }
3713 }
3714 }
3715 return
3716}
3717
Jooyung Han344d5432019-08-23 11:17:39 +09003718func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003719 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003720 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003721 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003722 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003723 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003724 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003725 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003726 }
3727
3728 apex_key {
3729 name: "myapex.key",
3730 public_key: "testkey.avbpubkey",
3731 private_key: "testkey.pem",
3732 }
3733
Jooyung Han31c470b2019-10-18 16:26:59 +09003734 vndk_prebuilt_shared {
3735 name: "libvndk27",
3736 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003737 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003738 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003739 vndk: {
3740 enabled: true,
3741 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003742 target_arch: "arm64",
3743 arch: {
3744 arm: {
3745 srcs: ["libvndk27_arm.so"],
3746 },
3747 arm64: {
3748 srcs: ["libvndk27_arm64.so"],
3749 },
3750 },
Colin Cross2807f002021-03-02 10:15:29 -08003751 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003752 }
3753
3754 vndk_prebuilt_shared {
3755 name: "libvndk27",
3756 version: "27",
3757 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003758 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003759 vndk: {
3760 enabled: true,
3761 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003762 target_arch: "x86_64",
3763 arch: {
3764 x86: {
3765 srcs: ["libvndk27_x86.so"],
3766 },
3767 x86_64: {
3768 srcs: ["libvndk27_x86_64.so"],
3769 },
3770 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003771 }
3772 `+vndkLibrariesTxtFiles("27"),
3773 withFiles(map[string][]byte{
3774 "libvndk27_arm.so": nil,
3775 "libvndk27_arm64.so": nil,
3776 "libvndk27_x86.so": nil,
3777 "libvndk27_x86_64.so": nil,
3778 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003779
Colin Cross2807f002021-03-02 10:15:29 -08003780 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003781 "lib/libvndk27_arm.so",
3782 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003783 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003784 })
Jooyung Han344d5432019-08-23 11:17:39 +09003785}
3786
Jooyung Han90eee022019-10-01 20:02:42 +09003787func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003788 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003789 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003790 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003791 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003792 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003793 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003794 }
3795 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003796 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003797 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003798 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003799 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003800 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003801 }
3802 apex_key {
3803 name: "myapex.key",
3804 public_key: "testkey.avbpubkey",
3805 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003806 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003807
3808 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003809 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003810 actual := proptools.String(bundle.properties.Apex_name)
3811 if !reflect.DeepEqual(actual, expected) {
3812 t.Errorf("Got '%v', expected '%v'", actual, expected)
3813 }
3814 }
3815
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003816 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003817 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003818}
3819
Jooyung Han344d5432019-08-23 11:17:39 +09003820func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003821 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003822 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003823 name: "com.android.vndk.current",
3824 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003825 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003826 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003827 }
3828
3829 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003830 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003831 public_key: "testkey.avbpubkey",
3832 private_key: "testkey.pem",
3833 }
3834
3835 cc_library {
3836 name: "libvndk",
3837 srcs: ["mylib.cpp"],
3838 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003839 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003840 native_bridge_supported: true,
3841 host_supported: true,
3842 vndk: {
3843 enabled: true,
3844 },
3845 system_shared_libs: [],
3846 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003847 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003848 }
Colin Cross2807f002021-03-02 10:15:29 -08003849 `+vndkLibrariesTxtFiles("current"),
3850 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003851
Colin Cross2807f002021-03-02 10:15:29 -08003852 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003853 "lib/libvndk.so",
3854 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003855 "lib/libc++.so",
3856 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003857 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003858 })
Jooyung Han344d5432019-08-23 11:17:39 +09003859}
3860
3861func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003862 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003863 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003864 name: "com.android.vndk.current",
3865 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003866 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003867 native_bridge_supported: true,
3868 }
3869
3870 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003871 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003872 public_key: "testkey.avbpubkey",
3873 private_key: "testkey.pem",
3874 }
3875
3876 cc_library {
3877 name: "libvndk",
3878 srcs: ["mylib.cpp"],
3879 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003880 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003881 native_bridge_supported: true,
3882 host_supported: true,
3883 vndk: {
3884 enabled: true,
3885 },
3886 system_shared_libs: [],
3887 stl: "none",
3888 }
3889 `)
3890}
3891
Jooyung Han31c470b2019-10-18 16:26:59 +09003892func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003893 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003894 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003895 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003896 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003897 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003898 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003899 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003900 }
3901
3902 apex_key {
3903 name: "myapex.key",
3904 public_key: "testkey.avbpubkey",
3905 private_key: "testkey.pem",
3906 }
3907
3908 vndk_prebuilt_shared {
3909 name: "libvndk27",
3910 version: "27",
3911 target_arch: "arm",
3912 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003913 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003914 vndk: {
3915 enabled: true,
3916 },
3917 arch: {
3918 arm: {
3919 srcs: ["libvndk27.so"],
3920 }
3921 },
3922 }
3923
3924 vndk_prebuilt_shared {
3925 name: "libvndk27",
3926 version: "27",
3927 target_arch: "arm",
3928 binder32bit: true,
3929 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003930 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003931 vndk: {
3932 enabled: true,
3933 },
3934 arch: {
3935 arm: {
3936 srcs: ["libvndk27binder32.so"],
3937 }
3938 },
Colin Cross2807f002021-03-02 10:15:29 -08003939 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003940 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003941 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003942 withFiles(map[string][]byte{
3943 "libvndk27.so": nil,
3944 "libvndk27binder32.so": nil,
3945 }),
3946 withBinder32bit,
3947 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003948 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003949 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3950 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003951 },
3952 }),
3953 )
3954
Colin Cross2807f002021-03-02 10:15:29 -08003955 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003956 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003957 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003958 })
3959}
3960
Jooyung Han45a96772020-06-15 14:59:42 +09003961func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003962 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003963 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003964 name: "com.android.vndk.current",
3965 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003966 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003967 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003968 }
3969
3970 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003971 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003972 public_key: "testkey.avbpubkey",
3973 private_key: "testkey.pem",
3974 }
3975
3976 cc_library {
3977 name: "libz",
3978 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003979 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003980 vndk: {
3981 enabled: true,
3982 },
3983 stubs: {
3984 symbol_file: "libz.map.txt",
3985 versions: ["30"],
3986 }
3987 }
3988 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3989 "libz.map.txt": nil,
3990 }))
3991
Colin Cross2807f002021-03-02 10:15:29 -08003992 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003993 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3994 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09003995 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
3996 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
3997 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
3998 "*/*",
3999 })
Jooyung Han45a96772020-06-15 14:59:42 +09004000}
4001
Jooyung Hane1633032019-08-01 17:41:43 +09004002func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004003 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004004 apex {
4005 name: "myapex_nodep",
4006 key: "myapex.key",
4007 native_shared_libs: ["lib_nodep"],
4008 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004009 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004010 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004011 }
4012
4013 apex {
4014 name: "myapex_dep",
4015 key: "myapex.key",
4016 native_shared_libs: ["lib_dep"],
4017 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004018 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004019 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004020 }
4021
4022 apex {
4023 name: "myapex_provider",
4024 key: "myapex.key",
4025 native_shared_libs: ["libfoo"],
4026 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004027 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004028 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004029 }
4030
4031 apex {
4032 name: "myapex_selfcontained",
4033 key: "myapex.key",
4034 native_shared_libs: ["lib_dep", "libfoo"],
4035 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004036 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004037 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004038 }
4039
4040 apex_key {
4041 name: "myapex.key",
4042 public_key: "testkey.avbpubkey",
4043 private_key: "testkey.pem",
4044 }
4045
4046 cc_library {
4047 name: "lib_nodep",
4048 srcs: ["mylib.cpp"],
4049 system_shared_libs: [],
4050 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004051 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004052 }
4053
4054 cc_library {
4055 name: "lib_dep",
4056 srcs: ["mylib.cpp"],
4057 shared_libs: ["libfoo"],
4058 system_shared_libs: [],
4059 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004060 apex_available: [
4061 "myapex_dep",
4062 "myapex_provider",
4063 "myapex_selfcontained",
4064 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004065 }
4066
4067 cc_library {
4068 name: "libfoo",
4069 srcs: ["mytest.cpp"],
4070 stubs: {
4071 versions: ["1"],
4072 },
4073 system_shared_libs: [],
4074 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004075 apex_available: [
4076 "myapex_provider",
4077 "myapex_selfcontained",
4078 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004079 }
4080 `)
4081
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004082 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004083 var provideNativeLibs, requireNativeLibs []string
4084
Sundong Ahnabb64432019-10-22 13:58:29 +09004085 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004086 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4087 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004088 ensureListEmpty(t, provideNativeLibs)
4089 ensureListEmpty(t, requireNativeLibs)
4090
Sundong Ahnabb64432019-10-22 13:58:29 +09004091 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004092 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4093 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004094 ensureListEmpty(t, provideNativeLibs)
4095 ensureListContains(t, requireNativeLibs, "libfoo.so")
4096
Sundong Ahnabb64432019-10-22 13:58:29 +09004097 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004098 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4099 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004100 ensureListContains(t, provideNativeLibs, "libfoo.so")
4101 ensureListEmpty(t, requireNativeLibs)
4102
Sundong Ahnabb64432019-10-22 13:58:29 +09004103 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004104 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4105 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004106 ensureListContains(t, provideNativeLibs, "libfoo.so")
4107 ensureListEmpty(t, requireNativeLibs)
4108}
4109
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004110func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004111 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004112 apex {
4113 name: "myapex",
4114 key: "myapex.key",
4115 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09004116 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004117 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004118 }
4119
4120 apex_key {
4121 name: "myapex.key",
4122 public_key: "testkey.avbpubkey",
4123 private_key: "testkey.pem",
4124 }
Jiyong Parkdb334862020-02-05 17:19:28 +09004125
4126 cc_library {
4127 name: "mylib",
4128 srcs: ["mylib.cpp"],
4129 system_shared_libs: [],
4130 stl: "none",
4131 apex_available: [
4132 "//apex_available:platform",
4133 "myapex",
4134 ],
4135 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004136 `)
4137
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004138 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004139 apexManifestRule := module.Rule("apexManifestRule")
4140 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
Jiyong Parkdb334862020-02-05 17:19:28 +09004141
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004142 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004143 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004144 name := apexBundle.BaseModuleName()
4145 prefix := "TARGET_"
4146 var builder strings.Builder
4147 data.Custom(&builder, name, prefix, "", data)
4148 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00004149 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Parkdb334862020-02-05 17:19:28 +09004150 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004151}
4152
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004153func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4154 ctx := testApex(t, `
4155 apex {
4156 name: "myapex",
4157 key: "myapex.key",
4158 apex_name: "com.android.myapex",
4159 native_shared_libs: ["mylib"],
4160 updatable: false,
4161 }
4162
4163 apex_key {
4164 name: "myapex.key",
4165 public_key: "testkey.avbpubkey",
4166 private_key: "testkey.pem",
4167 }
4168
4169 cc_library {
4170 name: "mylib",
4171 srcs: ["mylib.cpp"],
4172 system_shared_libs: [],
4173 stl: "none",
4174 apex_available: [
4175 "//apex_available:platform",
4176 "myapex",
4177 ],
4178 }
4179 `, android.FixtureMergeEnv(map[string]string{
4180 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4181 }))
4182
4183 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
4184 apexManifestRule := module.Rule("apexManifestRule")
4185 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4186}
4187
Vinh Tran8f5310f2022-10-07 18:16:47 -04004188func TestCompileMultilibProp(t *testing.T) {
4189 testCases := []struct {
4190 compileMultiLibProp string
4191 containedLibs []string
4192 notContainedLibs []string
4193 }{
4194 {
4195 containedLibs: []string{
4196 "image.apex/lib64/mylib.so",
4197 "image.apex/lib/mylib.so",
4198 },
4199 compileMultiLibProp: `compile_multilib: "both",`,
4200 },
4201 {
4202 containedLibs: []string{"image.apex/lib64/mylib.so"},
4203 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4204 compileMultiLibProp: `compile_multilib: "first",`,
4205 },
4206 {
4207 containedLibs: []string{"image.apex/lib64/mylib.so"},
4208 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4209 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4210 },
4211 {
4212 containedLibs: []string{"image.apex/lib64/mylib.so"},
4213 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4214 compileMultiLibProp: `compile_multilib: "64",`,
4215 },
4216 {
4217 containedLibs: []string{"image.apex/lib/mylib.so"},
4218 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4219 compileMultiLibProp: `compile_multilib: "32",`,
4220 },
4221 }
4222 for _, testCase := range testCases {
4223 ctx := testApex(t, fmt.Sprintf(`
4224 apex {
4225 name: "myapex",
4226 key: "myapex.key",
4227 %s
4228 native_shared_libs: ["mylib"],
4229 updatable: false,
4230 }
4231 apex_key {
4232 name: "myapex.key",
4233 public_key: "testkey.avbpubkey",
4234 private_key: "testkey.pem",
4235 }
4236 cc_library {
4237 name: "mylib",
4238 srcs: ["mylib.cpp"],
4239 apex_available: [
4240 "//apex_available:platform",
4241 "myapex",
4242 ],
4243 }
4244 `, testCase.compileMultiLibProp),
4245 )
4246 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4247 apexRule := module.Rule("apexRule")
4248 copyCmds := apexRule.Args["copy_commands"]
4249 for _, containedLib := range testCase.containedLibs {
4250 ensureContains(t, copyCmds, containedLib)
4251 }
4252 for _, notContainedLib := range testCase.notContainedLibs {
4253 ensureNotContains(t, copyCmds, notContainedLib)
4254 }
4255 }
4256}
4257
Alex Light0851b882019-02-07 13:20:53 -08004258func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004259 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004260 apex {
4261 name: "myapex",
4262 key: "myapex.key",
4263 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004264 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004265 }
4266
4267 apex_key {
4268 name: "myapex.key",
4269 public_key: "testkey.avbpubkey",
4270 private_key: "testkey.pem",
4271 }
4272
4273 cc_library {
4274 name: "mylib_common",
4275 srcs: ["mylib.cpp"],
4276 system_shared_libs: [],
4277 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004278 apex_available: [
4279 "//apex_available:platform",
4280 "myapex",
4281 ],
Alex Light0851b882019-02-07 13:20:53 -08004282 }
4283 `)
4284
Sundong Ahnabb64432019-10-22 13:58:29 +09004285 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004286 apexRule := module.Rule("apexRule")
4287 copyCmds := apexRule.Args["copy_commands"]
4288
4289 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4290 t.Log("Apex was a test apex!")
4291 t.Fail()
4292 }
4293 // Ensure that main rule creates an output
4294 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4295
4296 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004297 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004298
4299 // Ensure that both direct and indirect deps are copied into apex
4300 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4301
Colin Cross7113d202019-11-20 16:39:12 -08004302 // Ensure that the platform variant ends with _shared
4303 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004304
Colin Cross56a83212020-09-15 18:30:11 -07004305 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004306 t.Log("Found mylib_common not in any apex!")
4307 t.Fail()
4308 }
4309}
4310
4311func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004312 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004313 apex_test {
4314 name: "myapex",
4315 key: "myapex.key",
4316 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004317 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004318 }
4319
4320 apex_key {
4321 name: "myapex.key",
4322 public_key: "testkey.avbpubkey",
4323 private_key: "testkey.pem",
4324 }
4325
4326 cc_library {
4327 name: "mylib_common_test",
4328 srcs: ["mylib.cpp"],
4329 system_shared_libs: [],
4330 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004331 // TODO: remove //apex_available:platform
4332 apex_available: [
4333 "//apex_available:platform",
4334 "myapex",
4335 ],
Alex Light0851b882019-02-07 13:20:53 -08004336 }
4337 `)
4338
Sundong Ahnabb64432019-10-22 13:58:29 +09004339 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004340 apexRule := module.Rule("apexRule")
4341 copyCmds := apexRule.Args["copy_commands"]
4342
4343 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4344 t.Log("Apex was not a test apex!")
4345 t.Fail()
4346 }
4347 // Ensure that main rule creates an output
4348 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4349
4350 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004351 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004352
4353 // Ensure that both direct and indirect deps are copied into apex
4354 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4355
Colin Cross7113d202019-11-20 16:39:12 -08004356 // Ensure that the platform variant ends with _shared
4357 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004358}
4359
Alex Light9670d332019-01-29 18:07:33 -08004360func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004361 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004362 apex {
4363 name: "myapex",
4364 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004365 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004366 multilib: {
4367 first: {
4368 native_shared_libs: ["mylib_common"],
4369 }
4370 },
4371 target: {
4372 android: {
4373 multilib: {
4374 first: {
4375 native_shared_libs: ["mylib"],
4376 }
4377 }
4378 },
4379 host: {
4380 multilib: {
4381 first: {
4382 native_shared_libs: ["mylib2"],
4383 }
4384 }
4385 }
4386 }
4387 }
4388
4389 apex_key {
4390 name: "myapex.key",
4391 public_key: "testkey.avbpubkey",
4392 private_key: "testkey.pem",
4393 }
4394
4395 cc_library {
4396 name: "mylib",
4397 srcs: ["mylib.cpp"],
4398 system_shared_libs: [],
4399 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004400 // TODO: remove //apex_available:platform
4401 apex_available: [
4402 "//apex_available:platform",
4403 "myapex",
4404 ],
Alex Light9670d332019-01-29 18:07:33 -08004405 }
4406
4407 cc_library {
4408 name: "mylib_common",
4409 srcs: ["mylib.cpp"],
4410 system_shared_libs: [],
4411 stl: "none",
4412 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004413 // TODO: remove //apex_available:platform
4414 apex_available: [
4415 "//apex_available:platform",
4416 "myapex",
4417 ],
Alex Light9670d332019-01-29 18:07:33 -08004418 }
4419
4420 cc_library {
4421 name: "mylib2",
4422 srcs: ["mylib.cpp"],
4423 system_shared_libs: [],
4424 stl: "none",
4425 compile_multilib: "first",
4426 }
4427 `)
4428
Sundong Ahnabb64432019-10-22 13:58:29 +09004429 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004430 copyCmds := apexRule.Args["copy_commands"]
4431
4432 // Ensure that main rule creates an output
4433 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4434
4435 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004436 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4437 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4438 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004439
4440 // Ensure that both direct and indirect deps are copied into apex
4441 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4442 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4443 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4444
Colin Cross7113d202019-11-20 16:39:12 -08004445 // Ensure that the platform variant ends with _shared
4446 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4447 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4448 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004449}
Jiyong Park04480cf2019-02-06 00:16:29 +09004450
Jiyong Park59140302020-12-14 18:44:04 +09004451func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004452 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004453 apex {
4454 name: "myapex",
4455 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004456 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004457 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004458 arch: {
4459 arm64: {
4460 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004461 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004462 },
4463 x86_64: {
4464 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004465 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004466 },
4467 }
4468 }
4469
4470 apex_key {
4471 name: "myapex.key",
4472 public_key: "testkey.avbpubkey",
4473 private_key: "testkey.pem",
4474 }
4475
4476 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004477 name: "mylib.generic",
4478 srcs: ["mylib.cpp"],
4479 system_shared_libs: [],
4480 stl: "none",
4481 // TODO: remove //apex_available:platform
4482 apex_available: [
4483 "//apex_available:platform",
4484 "myapex",
4485 ],
4486 }
4487
4488 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004489 name: "mylib.arm64",
4490 srcs: ["mylib.cpp"],
4491 system_shared_libs: [],
4492 stl: "none",
4493 // TODO: remove //apex_available:platform
4494 apex_available: [
4495 "//apex_available:platform",
4496 "myapex",
4497 ],
4498 }
4499
4500 cc_library {
4501 name: "mylib.x64",
4502 srcs: ["mylib.cpp"],
4503 system_shared_libs: [],
4504 stl: "none",
4505 // TODO: remove //apex_available:platform
4506 apex_available: [
4507 "//apex_available:platform",
4508 "myapex",
4509 ],
4510 }
4511 `)
4512
4513 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4514 copyCmds := apexRule.Args["copy_commands"]
4515
4516 // Ensure that apex variant is created for the direct dep
4517 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004518 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004519 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4520
4521 // Ensure that both direct and indirect deps are copied into apex
4522 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4523 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4524}
4525
Jiyong Park04480cf2019-02-06 00:16:29 +09004526func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004527 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004528 apex {
4529 name: "myapex",
4530 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004531 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004532 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004533 }
4534
4535 apex_key {
4536 name: "myapex.key",
4537 public_key: "testkey.avbpubkey",
4538 private_key: "testkey.pem",
4539 }
4540
4541 sh_binary {
4542 name: "myscript",
4543 src: "mylib.cpp",
4544 filename: "myscript.sh",
4545 sub_dir: "script",
4546 }
4547 `)
4548
Sundong Ahnabb64432019-10-22 13:58:29 +09004549 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004550 copyCmds := apexRule.Args["copy_commands"]
4551
4552 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4553}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004554
Jooyung Han91df2082019-11-20 01:49:42 +09004555func TestApexInVariousPartition(t *testing.T) {
4556 testcases := []struct {
4557 propName, parition, flattenedPartition string
4558 }{
4559 {"", "system", "system_ext"},
4560 {"product_specific: true", "product", "product"},
4561 {"soc_specific: true", "vendor", "vendor"},
4562 {"proprietary: true", "vendor", "vendor"},
4563 {"vendor: true", "vendor", "vendor"},
4564 {"system_ext_specific: true", "system_ext", "system_ext"},
4565 }
4566 for _, tc := range testcases {
4567 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004568 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004569 apex {
4570 name: "myapex",
4571 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004572 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004573 `+tc.propName+`
4574 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004575
Jooyung Han91df2082019-11-20 01:49:42 +09004576 apex_key {
4577 name: "myapex.key",
4578 public_key: "testkey.avbpubkey",
4579 private_key: "testkey.pem",
4580 }
4581 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004582
Jooyung Han91df2082019-11-20 01:49:42 +09004583 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004584 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4585 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004586 if actual != expected {
4587 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4588 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004589
Jooyung Han91df2082019-11-20 01:49:42 +09004590 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004591 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4592 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004593 if actual != expected {
4594 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4595 }
4596 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004597 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004598}
Jiyong Park67882562019-03-21 01:11:21 +09004599
Jooyung Han580eb4f2020-06-24 19:33:06 +09004600func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004601 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004602 apex {
4603 name: "myapex",
4604 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004605 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004606 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004607
Jooyung Han580eb4f2020-06-24 19:33:06 +09004608 apex_key {
4609 name: "myapex.key",
4610 public_key: "testkey.avbpubkey",
4611 private_key: "testkey.pem",
4612 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004613 `)
4614 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004615 rule := module.Output("file_contexts")
4616 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4617}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004618
Jooyung Han580eb4f2020-06-24 19:33:06 +09004619func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004620 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004621 apex {
4622 name: "myapex",
4623 key: "myapex.key",
4624 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004625 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004626 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004627
Jooyung Han580eb4f2020-06-24 19:33:06 +09004628 apex_key {
4629 name: "myapex.key",
4630 public_key: "testkey.avbpubkey",
4631 private_key: "testkey.pem",
4632 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004633 `, withFiles(map[string][]byte{
4634 "my_own_file_contexts": nil,
4635 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004636}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004637
Jooyung Han580eb4f2020-06-24 19:33:06 +09004638func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004639 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004640 apex {
4641 name: "myapex",
4642 key: "myapex.key",
4643 product_specific: true,
4644 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004645 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004646 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004647
Jooyung Han580eb4f2020-06-24 19:33:06 +09004648 apex_key {
4649 name: "myapex.key",
4650 public_key: "testkey.avbpubkey",
4651 private_key: "testkey.pem",
4652 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004653 `)
4654
Colin Cross1c460562021-02-16 17:55:47 -08004655 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004656 apex {
4657 name: "myapex",
4658 key: "myapex.key",
4659 product_specific: true,
4660 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004661 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004662 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004663
Jooyung Han580eb4f2020-06-24 19:33:06 +09004664 apex_key {
4665 name: "myapex.key",
4666 public_key: "testkey.avbpubkey",
4667 private_key: "testkey.pem",
4668 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004669 `, withFiles(map[string][]byte{
4670 "product_specific_file_contexts": nil,
4671 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004672 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4673 rule := module.Output("file_contexts")
4674 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4675}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004676
Jooyung Han580eb4f2020-06-24 19:33:06 +09004677func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004678 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004679 apex {
4680 name: "myapex",
4681 key: "myapex.key",
4682 product_specific: true,
4683 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004684 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004685 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004686
Jooyung Han580eb4f2020-06-24 19:33:06 +09004687 apex_key {
4688 name: "myapex.key",
4689 public_key: "testkey.avbpubkey",
4690 private_key: "testkey.pem",
4691 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004692
Jooyung Han580eb4f2020-06-24 19:33:06 +09004693 filegroup {
4694 name: "my-file-contexts",
4695 srcs: ["product_specific_file_contexts"],
4696 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004697 `, withFiles(map[string][]byte{
4698 "product_specific_file_contexts": nil,
4699 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004700 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4701 rule := module.Output("file_contexts")
4702 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004703}
4704
Jiyong Park67882562019-03-21 01:11:21 +09004705func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004706 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004707 apex_key {
4708 name: "myapex.key",
4709 public_key: ":my.avbpubkey",
4710 private_key: ":my.pem",
4711 product_specific: true,
4712 }
4713
4714 filegroup {
4715 name: "my.avbpubkey",
4716 srcs: ["testkey2.avbpubkey"],
4717 }
4718
4719 filegroup {
4720 name: "my.pem",
4721 srcs: ["testkey2.pem"],
4722 }
4723 `)
4724
4725 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4726 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004727 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004728 if actual_pubkey != expected_pubkey {
4729 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4730 }
4731 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004732 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004733 if actual_privkey != expected_privkey {
4734 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4735 }
4736}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004737
4738func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004739 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004740 prebuilt_apex {
4741 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004742 arch: {
4743 arm64: {
4744 src: "myapex-arm64.apex",
4745 },
4746 arm: {
4747 src: "myapex-arm.apex",
4748 },
4749 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004750 }
4751 `)
4752
Wei Li340ee8e2022-03-18 17:33:24 -07004753 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4754 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004755
Jiyong Parkc95714e2019-03-29 14:23:10 +09004756 expectedInput := "myapex-arm64.apex"
4757 if prebuilt.inputApex.String() != expectedInput {
4758 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4759 }
Wei Li340ee8e2022-03-18 17:33:24 -07004760 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4761 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4762 rule := testingModule.Rule("genProvenanceMetaData")
4763 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4764 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4765 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4766 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004767}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004768
Paul Duffinc0609c62021-03-01 17:27:16 +00004769func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004770 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004771 prebuilt_apex {
4772 name: "myapex",
4773 }
4774 `)
4775}
4776
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004777func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004778 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004779 prebuilt_apex {
4780 name: "myapex",
4781 src: "myapex-arm.apex",
4782 filename: "notmyapex.apex",
4783 }
4784 `)
4785
Wei Li340ee8e2022-03-18 17:33:24 -07004786 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4787 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004788
4789 expected := "notmyapex.apex"
4790 if p.installFilename != expected {
4791 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4792 }
Wei Li340ee8e2022-03-18 17:33:24 -07004793 rule := testingModule.Rule("genProvenanceMetaData")
4794 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4795 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4796 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4797 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004798}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004799
Samiul Islam7c02e262021-09-08 17:48:28 +01004800func TestApexSetFilenameOverride(t *testing.T) {
4801 testApex(t, `
4802 apex_set {
4803 name: "com.company.android.myapex",
4804 apex_name: "com.android.myapex",
4805 set: "company-myapex.apks",
4806 filename: "com.company.android.myapex.apex"
4807 }
4808 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4809
4810 testApex(t, `
4811 apex_set {
4812 name: "com.company.android.myapex",
4813 apex_name: "com.android.myapex",
4814 set: "company-myapex.apks",
4815 filename: "com.company.android.myapex.capex"
4816 }
4817 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4818
4819 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4820 apex_set {
4821 name: "com.company.android.myapex",
4822 apex_name: "com.android.myapex",
4823 set: "company-myapex.apks",
4824 filename: "some-random-suffix"
4825 }
4826 `)
4827}
4828
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004829func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004830 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004831 prebuilt_apex {
4832 name: "myapex.prebuilt",
4833 src: "myapex-arm.apex",
4834 overrides: [
4835 "myapex",
4836 ],
4837 }
4838 `)
4839
Wei Li340ee8e2022-03-18 17:33:24 -07004840 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4841 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004842
4843 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004844 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004845 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004846 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004847 }
Wei Li340ee8e2022-03-18 17:33:24 -07004848 rule := testingModule.Rule("genProvenanceMetaData")
4849 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4850 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4851 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4852 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004853}
4854
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004855func TestPrebuiltApexName(t *testing.T) {
4856 testApex(t, `
4857 prebuilt_apex {
4858 name: "com.company.android.myapex",
4859 apex_name: "com.android.myapex",
4860 src: "company-myapex-arm.apex",
4861 }
4862 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4863
4864 testApex(t, `
4865 apex_set {
4866 name: "com.company.android.myapex",
4867 apex_name: "com.android.myapex",
4868 set: "company-myapex.apks",
4869 }
4870 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4871}
4872
4873func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4874 _ = android.GroupFixturePreparers(
4875 java.PrepareForTestWithJavaDefaultModules,
4876 PrepareForTestWithApexBuildComponents,
4877 android.FixtureWithRootAndroidBp(`
4878 platform_bootclasspath {
4879 name: "platform-bootclasspath",
4880 fragments: [
4881 {
4882 apex: "com.android.art",
4883 module: "art-bootclasspath-fragment",
4884 },
4885 ],
4886 }
4887
4888 prebuilt_apex {
4889 name: "com.company.android.art",
4890 apex_name: "com.android.art",
4891 src: "com.company.android.art-arm.apex",
4892 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4893 }
4894
4895 prebuilt_bootclasspath_fragment {
4896 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004897 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004898 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004899 hidden_api: {
4900 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4901 metadata: "my-bootclasspath-fragment/metadata.csv",
4902 index: "my-bootclasspath-fragment/index.csv",
4903 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4904 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4905 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004906 }
4907
4908 java_import {
4909 name: "core-oj",
4910 jars: ["prebuilt.jar"],
4911 }
4912 `),
4913 ).RunTest(t)
4914}
4915
Paul Duffin092153d2021-01-26 11:42:39 +00004916// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4917// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004918func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004919 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004920
Paul Duffin89886cb2021-02-05 16:44:03 +00004921 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004922 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004923 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004924 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004925 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004926 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004927 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4928 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4929 android.NormalizePathForTesting(dexJarBuildPath))
4930 }
4931
4932 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004933 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004934 // Make sure the import has been given the correct path to the dex jar.
4935 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4936 dexJarBuildPath := p.DexJarInstallPath()
4937 stem := android.RemoveOptionalPrebuiltPrefix(name)
4938 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4939 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4940 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004941 }
4942
Paul Duffin39853512021-02-26 11:09:39 +00004943 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004944 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004945 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004946 android.AssertArrayString(t, "Check if there is no source variant",
4947 []string{"android_common"},
4948 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004949 }
4950
4951 t.Run("prebuilt only", func(t *testing.T) {
4952 bp := `
4953 prebuilt_apex {
4954 name: "myapex",
4955 arch: {
4956 arm64: {
4957 src: "myapex-arm64.apex",
4958 },
4959 arm: {
4960 src: "myapex-arm.apex",
4961 },
4962 },
Paul Duffin39853512021-02-26 11:09:39 +00004963 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004964 }
4965
4966 java_import {
4967 name: "libfoo",
4968 jars: ["libfoo.jar"],
4969 }
Paul Duffin39853512021-02-26 11:09:39 +00004970
4971 java_sdk_library_import {
4972 name: "libbar",
4973 public: {
4974 jars: ["libbar.jar"],
4975 },
4976 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004977 `
4978
4979 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4980 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4981
Martin Stjernholm44825602021-09-17 01:44:12 +01004982 deapexerName := deapexerModuleName("myapex")
4983 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4984
Paul Duffinf6932af2021-02-26 18:21:56 +00004985 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004986 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004987 rule := deapexer.Rule("deapexer")
4988 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4989 t.Errorf("expected: %q, found: %q", expected, actual)
4990 }
4991
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004992 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004993 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004994 rule = prebuiltApex.Rule("android/soong/android.Cp")
4995 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4996 t.Errorf("expected: %q, found: %q", expected, actual)
4997 }
4998
Paul Duffin89886cb2021-02-05 16:44:03 +00004999 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005000 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005001
5002 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005003 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005004 })
5005
5006 t.Run("prebuilt with source preferred", func(t *testing.T) {
5007
5008 bp := `
5009 prebuilt_apex {
5010 name: "myapex",
5011 arch: {
5012 arm64: {
5013 src: "myapex-arm64.apex",
5014 },
5015 arm: {
5016 src: "myapex-arm.apex",
5017 },
5018 },
Paul Duffin39853512021-02-26 11:09:39 +00005019 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005020 }
5021
5022 java_import {
5023 name: "libfoo",
5024 jars: ["libfoo.jar"],
5025 }
5026
5027 java_library {
5028 name: "libfoo",
5029 }
Paul Duffin39853512021-02-26 11:09:39 +00005030
5031 java_sdk_library_import {
5032 name: "libbar",
5033 public: {
5034 jars: ["libbar.jar"],
5035 },
5036 }
5037
5038 java_sdk_library {
5039 name: "libbar",
5040 srcs: ["foo/bar/MyClass.java"],
5041 unsafe_ignore_missing_latest_api: true,
5042 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005043 `
5044
5045 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5046 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5047
Paul Duffin89886cb2021-02-05 16:44:03 +00005048 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005049 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005050 ensureNoSourceVariant(t, ctx, "libfoo")
5051
5052 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005053 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005054 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005055 })
5056
5057 t.Run("prebuilt preferred with source", func(t *testing.T) {
5058 bp := `
5059 prebuilt_apex {
5060 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005061 arch: {
5062 arm64: {
5063 src: "myapex-arm64.apex",
5064 },
5065 arm: {
5066 src: "myapex-arm.apex",
5067 },
5068 },
Paul Duffin39853512021-02-26 11:09:39 +00005069 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005070 }
5071
5072 java_import {
5073 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005074 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005075 jars: ["libfoo.jar"],
5076 }
5077
5078 java_library {
5079 name: "libfoo",
5080 }
Paul Duffin39853512021-02-26 11:09:39 +00005081
5082 java_sdk_library_import {
5083 name: "libbar",
5084 prefer: true,
5085 public: {
5086 jars: ["libbar.jar"],
5087 },
5088 }
5089
5090 java_sdk_library {
5091 name: "libbar",
5092 srcs: ["foo/bar/MyClass.java"],
5093 unsafe_ignore_missing_latest_api: true,
5094 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005095 `
5096
5097 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5098 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5099
Paul Duffin89886cb2021-02-05 16:44:03 +00005100 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005101 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005102 ensureNoSourceVariant(t, ctx, "libfoo")
5103
5104 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005105 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005106 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005107 })
5108}
5109
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005110func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005111 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005112 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005113 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5114 // is disabled.
5115 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5116 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005117
Paul Duffin37856732021-02-26 14:24:15 +00005118 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5119 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005120 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005121 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005122 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005123 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005124 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005125 foundLibfooJar = true
5126 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005127 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005128 }
5129 }
5130 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005131 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 +00005132 }
5133 }
5134
Paul Duffin40a3f652021-07-19 13:11:24 +01005135 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005136 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005137 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005138 var rule android.TestingBuildParams
5139
5140 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5141 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005142 }
5143
Paul Duffin40a3f652021-07-19 13:11:24 +01005144 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5145 t.Helper()
5146 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5147 var rule android.TestingBuildParams
5148
5149 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5150 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5151 }
5152
Paul Duffin89f570a2021-06-16 01:42:33 +01005153 fragment := java.ApexVariantReference{
5154 Apex: proptools.StringPtr("myapex"),
5155 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5156 }
5157
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005158 t.Run("prebuilt only", func(t *testing.T) {
5159 bp := `
5160 prebuilt_apex {
5161 name: "myapex",
5162 arch: {
5163 arm64: {
5164 src: "myapex-arm64.apex",
5165 },
5166 arm: {
5167 src: "myapex-arm.apex",
5168 },
5169 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005170 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5171 }
5172
5173 prebuilt_bootclasspath_fragment {
5174 name: "my-bootclasspath-fragment",
5175 contents: ["libfoo", "libbar"],
5176 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005177 hidden_api: {
5178 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5179 metadata: "my-bootclasspath-fragment/metadata.csv",
5180 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005181 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5182 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5183 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005184 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005185 }
5186
5187 java_import {
5188 name: "libfoo",
5189 jars: ["libfoo.jar"],
5190 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005191 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005192 }
Paul Duffin37856732021-02-26 14:24:15 +00005193
5194 java_sdk_library_import {
5195 name: "libbar",
5196 public: {
5197 jars: ["libbar.jar"],
5198 },
5199 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005200 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005201 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005202 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005203 `
5204
Paul Duffin89f570a2021-06-16 01:42:33 +01005205 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005206 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5207 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005208
Paul Duffin537ea3d2021-05-14 10:38:00 +01005209 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005210 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005211 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005212 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005213 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5214 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005215 })
5216
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005217 t.Run("apex_set only", func(t *testing.T) {
5218 bp := `
5219 apex_set {
5220 name: "myapex",
5221 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005222 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5223 }
5224
5225 prebuilt_bootclasspath_fragment {
5226 name: "my-bootclasspath-fragment",
5227 contents: ["libfoo", "libbar"],
5228 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005229 hidden_api: {
5230 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5231 metadata: "my-bootclasspath-fragment/metadata.csv",
5232 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005233 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5234 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5235 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005236 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005237 }
5238
5239 java_import {
5240 name: "libfoo",
5241 jars: ["libfoo.jar"],
5242 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005243 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005244 }
5245
5246 java_sdk_library_import {
5247 name: "libbar",
5248 public: {
5249 jars: ["libbar.jar"],
5250 },
5251 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005252 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005253 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005254 }
5255 `
5256
Paul Duffin89f570a2021-06-16 01:42:33 +01005257 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005258 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5259 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5260
Paul Duffin537ea3d2021-05-14 10:38:00 +01005261 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005262 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005263 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005264 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005265 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5266 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005267 })
5268
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005269 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5270 bp := `
5271 prebuilt_apex {
5272 name: "myapex",
5273 arch: {
5274 arm64: {
5275 src: "myapex-arm64.apex",
5276 },
5277 arm: {
5278 src: "myapex-arm.apex",
5279 },
5280 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005281 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5282 }
5283
5284 prebuilt_bootclasspath_fragment {
5285 name: "my-bootclasspath-fragment",
5286 contents: ["libfoo", "libbar"],
5287 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005288 hidden_api: {
5289 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5290 metadata: "my-bootclasspath-fragment/metadata.csv",
5291 index: "my-bootclasspath-fragment/index.csv",
5292 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5293 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5294 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005295 }
5296
5297 java_import {
5298 name: "libfoo",
5299 jars: ["libfoo.jar"],
5300 apex_available: ["myapex"],
5301 }
5302
5303 java_library {
5304 name: "libfoo",
5305 srcs: ["foo/bar/MyClass.java"],
5306 apex_available: ["myapex"],
5307 }
Paul Duffin37856732021-02-26 14:24:15 +00005308
5309 java_sdk_library_import {
5310 name: "libbar",
5311 public: {
5312 jars: ["libbar.jar"],
5313 },
5314 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005315 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005316 }
5317
5318 java_sdk_library {
5319 name: "libbar",
5320 srcs: ["foo/bar/MyClass.java"],
5321 unsafe_ignore_missing_latest_api: true,
5322 apex_available: ["myapex"],
5323 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005324 `
5325
5326 // In this test the source (java_library) libfoo is active since the
5327 // prebuilt (java_import) defaults to prefer:false. However the
5328 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5329 // find the dex boot jar in it. We either need to disable the source libfoo
5330 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005331 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005332 // dexbootjar check is skipped if AllowMissingDependencies is true
5333 preparerAllowMissingDeps := android.GroupFixturePreparers(
5334 preparer,
5335 android.PrepareForTestWithAllowMissingDependencies,
5336 )
5337 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005338 })
5339
5340 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5341 bp := `
5342 prebuilt_apex {
5343 name: "myapex",
5344 arch: {
5345 arm64: {
5346 src: "myapex-arm64.apex",
5347 },
5348 arm: {
5349 src: "myapex-arm.apex",
5350 },
5351 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005352 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5353 }
5354
5355 prebuilt_bootclasspath_fragment {
5356 name: "my-bootclasspath-fragment",
5357 contents: ["libfoo", "libbar"],
5358 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005359 hidden_api: {
5360 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5361 metadata: "my-bootclasspath-fragment/metadata.csv",
5362 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005363 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5364 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5365 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005366 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005367 }
5368
5369 java_import {
5370 name: "libfoo",
5371 prefer: true,
5372 jars: ["libfoo.jar"],
5373 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005374 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005375 }
5376
5377 java_library {
5378 name: "libfoo",
5379 srcs: ["foo/bar/MyClass.java"],
5380 apex_available: ["myapex"],
5381 }
Paul Duffin37856732021-02-26 14:24:15 +00005382
5383 java_sdk_library_import {
5384 name: "libbar",
5385 prefer: true,
5386 public: {
5387 jars: ["libbar.jar"],
5388 },
5389 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005390 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005391 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005392 }
5393
5394 java_sdk_library {
5395 name: "libbar",
5396 srcs: ["foo/bar/MyClass.java"],
5397 unsafe_ignore_missing_latest_api: true,
5398 apex_available: ["myapex"],
5399 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005400 `
5401
Paul Duffin89f570a2021-06-16 01:42:33 +01005402 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005403 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5404 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005405
Paul Duffin537ea3d2021-05-14 10:38:00 +01005406 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005407 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005408 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005409 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005410 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5411 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005412 })
5413
5414 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5415 bp := `
5416 apex {
5417 name: "myapex",
5418 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005419 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005420 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005421 }
5422
5423 apex_key {
5424 name: "myapex.key",
5425 public_key: "testkey.avbpubkey",
5426 private_key: "testkey.pem",
5427 }
5428
5429 prebuilt_apex {
5430 name: "myapex",
5431 arch: {
5432 arm64: {
5433 src: "myapex-arm64.apex",
5434 },
5435 arm: {
5436 src: "myapex-arm.apex",
5437 },
5438 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005439 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5440 }
5441
5442 prebuilt_bootclasspath_fragment {
5443 name: "my-bootclasspath-fragment",
5444 contents: ["libfoo", "libbar"],
5445 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005446 hidden_api: {
5447 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5448 metadata: "my-bootclasspath-fragment/metadata.csv",
5449 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005450 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5451 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5452 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005453 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005454 }
5455
5456 java_import {
5457 name: "libfoo",
5458 jars: ["libfoo.jar"],
5459 apex_available: ["myapex"],
5460 }
5461
5462 java_library {
5463 name: "libfoo",
5464 srcs: ["foo/bar/MyClass.java"],
5465 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005466 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005467 }
Paul Duffin37856732021-02-26 14:24:15 +00005468
5469 java_sdk_library_import {
5470 name: "libbar",
5471 public: {
5472 jars: ["libbar.jar"],
5473 },
5474 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005475 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005476 }
5477
5478 java_sdk_library {
5479 name: "libbar",
5480 srcs: ["foo/bar/MyClass.java"],
5481 unsafe_ignore_missing_latest_api: true,
5482 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005483 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005484 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005485 `
5486
Paul Duffin89f570a2021-06-16 01:42:33 +01005487 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005488 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5489 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005490
Paul Duffin537ea3d2021-05-14 10:38:00 +01005491 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005492 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005493 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005494 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005495 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5496 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005497 })
5498
5499 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5500 bp := `
5501 apex {
5502 name: "myapex",
5503 enabled: false,
5504 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005505 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005506 }
5507
5508 apex_key {
5509 name: "myapex.key",
5510 public_key: "testkey.avbpubkey",
5511 private_key: "testkey.pem",
5512 }
5513
5514 prebuilt_apex {
5515 name: "myapex",
5516 arch: {
5517 arm64: {
5518 src: "myapex-arm64.apex",
5519 },
5520 arm: {
5521 src: "myapex-arm.apex",
5522 },
5523 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005524 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5525 }
5526
5527 prebuilt_bootclasspath_fragment {
5528 name: "my-bootclasspath-fragment",
5529 contents: ["libfoo", "libbar"],
5530 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005531 hidden_api: {
5532 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5533 metadata: "my-bootclasspath-fragment/metadata.csv",
5534 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005535 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5536 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5537 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005538 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005539 }
5540
5541 java_import {
5542 name: "libfoo",
5543 prefer: true,
5544 jars: ["libfoo.jar"],
5545 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005546 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005547 }
5548
5549 java_library {
5550 name: "libfoo",
5551 srcs: ["foo/bar/MyClass.java"],
5552 apex_available: ["myapex"],
5553 }
Paul Duffin37856732021-02-26 14:24:15 +00005554
5555 java_sdk_library_import {
5556 name: "libbar",
5557 prefer: true,
5558 public: {
5559 jars: ["libbar.jar"],
5560 },
5561 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005562 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005563 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005564 }
5565
5566 java_sdk_library {
5567 name: "libbar",
5568 srcs: ["foo/bar/MyClass.java"],
5569 unsafe_ignore_missing_latest_api: true,
5570 apex_available: ["myapex"],
5571 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005572 `
5573
Paul Duffin89f570a2021-06-16 01:42:33 +01005574 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005575 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5576 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005577
Paul Duffin537ea3d2021-05-14 10:38:00 +01005578 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005579 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005580 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005581 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005582 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5583 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005584 })
5585}
5586
Roland Levillain630846d2019-06-26 12:48:34 +01005587func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005588 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005589 apex_test {
5590 name: "myapex",
5591 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005592 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005593 tests: [
5594 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005595 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005596 ],
5597 }
5598
5599 apex_key {
5600 name: "myapex.key",
5601 public_key: "testkey.avbpubkey",
5602 private_key: "testkey.pem",
5603 }
5604
Liz Kammer1c14a212020-05-12 15:26:55 -07005605 filegroup {
5606 name: "fg",
5607 srcs: [
5608 "baz",
5609 "bar/baz"
5610 ],
5611 }
5612
Roland Levillain630846d2019-06-26 12:48:34 +01005613 cc_test {
5614 name: "mytest",
5615 gtest: false,
5616 srcs: ["mytest.cpp"],
5617 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005618 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005619 system_shared_libs: [],
5620 static_executable: true,
5621 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005622 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005623 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005624
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005625 cc_library {
5626 name: "mylib",
5627 srcs: ["mylib.cpp"],
5628 system_shared_libs: [],
5629 stl: "none",
5630 }
5631
Liz Kammer5bd365f2020-05-27 15:15:11 -07005632 filegroup {
5633 name: "fg2",
5634 srcs: [
5635 "testdata/baz"
5636 ],
5637 }
5638
Roland Levillain9b5fde92019-06-28 15:41:19 +01005639 cc_test {
5640 name: "mytests",
5641 gtest: false,
5642 srcs: [
5643 "mytest1.cpp",
5644 "mytest2.cpp",
5645 "mytest3.cpp",
5646 ],
5647 test_per_src: true,
5648 relative_install_path: "test",
5649 system_shared_libs: [],
5650 static_executable: true,
5651 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005652 data: [
5653 ":fg",
5654 ":fg2",
5655 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005656 }
Roland Levillain630846d2019-06-26 12:48:34 +01005657 `)
5658
Sundong Ahnabb64432019-10-22 13:58:29 +09005659 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005660 copyCmds := apexRule.Args["copy_commands"]
5661
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005662 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005663 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005664 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005665
Liz Kammer1c14a212020-05-12 15:26:55 -07005666 //Ensure that test data are copied into apex.
5667 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5668 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5669
Roland Levillain9b5fde92019-06-28 15:41:19 +01005670 // Ensure that test deps built with `test_per_src` are copied into apex.
5671 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5672 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5673 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005674
5675 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005676 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005677 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005678 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005679 prefix := "TARGET_"
5680 var builder strings.Builder
5681 data.Custom(&builder, name, prefix, "", data)
5682 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005683 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5684 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5685 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5686 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
5687 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
5688 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005689 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005690
5691 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005692 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005693 data.Custom(&builder, name, prefix, "", data)
5694 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005695 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5696 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005697}
5698
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005699func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005700 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005701 apex {
5702 name: "myapex",
5703 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005704 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005705 }
5706 apex_key {
5707 name: "myapex.key",
5708 public_key: "testkey.avbpubkey",
5709 private_key: "testkey.pem",
5710 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005711 `,
5712 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5713 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5714 }),
5715 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005716 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00005717 ensureListContains(t, ab.makeModulesToInstall, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005718 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005719 var builder strings.Builder
5720 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5721 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005722 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex myapex.flattened\n")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005723}
5724
Jooyung Hand48f3c32019-08-23 11:18:57 +09005725func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5726 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5727 apex {
5728 name: "myapex",
5729 key: "myapex.key",
5730 native_shared_libs: ["libfoo"],
5731 }
5732
5733 apex_key {
5734 name: "myapex.key",
5735 public_key: "testkey.avbpubkey",
5736 private_key: "testkey.pem",
5737 }
5738
5739 cc_library {
5740 name: "libfoo",
5741 stl: "none",
5742 system_shared_libs: [],
5743 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005744 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005745 }
5746 `)
5747 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5748 apex {
5749 name: "myapex",
5750 key: "myapex.key",
5751 java_libs: ["myjar"],
5752 }
5753
5754 apex_key {
5755 name: "myapex.key",
5756 public_key: "testkey.avbpubkey",
5757 private_key: "testkey.pem",
5758 }
5759
5760 java_library {
5761 name: "myjar",
5762 srcs: ["foo/bar/MyClass.java"],
5763 sdk_version: "none",
5764 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005765 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005766 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005767 }
5768 `)
5769}
5770
Bill Peckhama41a6962021-01-11 10:58:54 -08005771func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005772 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005773 apex {
5774 name: "myapex",
5775 key: "myapex.key",
5776 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005777 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005778 }
5779
5780 apex_key {
5781 name: "myapex.key",
5782 public_key: "testkey.avbpubkey",
5783 private_key: "testkey.pem",
5784 }
5785
5786 java_import {
5787 name: "myjavaimport",
5788 apex_available: ["myapex"],
5789 jars: ["my.jar"],
5790 compile_dex: true,
5791 }
5792 `)
5793
5794 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5795 apexRule := module.Rule("apexRule")
5796 copyCmds := apexRule.Args["copy_commands"]
5797 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5798}
5799
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005800func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005801 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005802 apex {
5803 name: "myapex",
5804 key: "myapex.key",
5805 apps: [
5806 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005807 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005808 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005809 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005810 }
5811
5812 apex_key {
5813 name: "myapex.key",
5814 public_key: "testkey.avbpubkey",
5815 private_key: "testkey.pem",
5816 }
5817
5818 android_app {
5819 name: "AppFoo",
5820 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005821 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005822 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005823 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005824 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005825 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005826 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005827
5828 android_app {
5829 name: "AppFooPriv",
5830 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005831 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005832 system_modules: "none",
5833 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005834 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005835 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005836 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005837
5838 cc_library_shared {
5839 name: "libjni",
5840 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005841 shared_libs: ["libfoo"],
5842 stl: "none",
5843 system_shared_libs: [],
5844 apex_available: [ "myapex" ],
5845 sdk_version: "current",
5846 }
5847
5848 cc_library_shared {
5849 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005850 stl: "none",
5851 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005852 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005853 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005854 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005855 `)
5856
Sundong Ahnabb64432019-10-22 13:58:29 +09005857 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005858 apexRule := module.Rule("apexRule")
5859 copyCmds := apexRule.Args["copy_commands"]
5860
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005861 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5862 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005863
Colin Crossaede88c2020-08-11 12:17:01 -07005864 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005865 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005866 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005867 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005868 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005869 // JNI libraries including transitive deps are
5870 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005871 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005872 // ... embedded inside APK (jnilibs.zip)
5873 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5874 // ... and not directly inside the APEX
5875 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5876 }
Dario Frenicde2a032019-10-27 00:29:22 +01005877}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005878
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005879func TestApexWithAppImportBuildId(t *testing.T) {
5880 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5881 for _, id := range invalidBuildIds {
5882 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5883 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5884 variables.BuildId = proptools.StringPtr(id)
5885 })
5886 testApexError(t, message, `apex {
5887 name: "myapex",
5888 key: "myapex.key",
5889 apps: ["AppFooPrebuilt"],
5890 updatable: false,
5891 }
5892
5893 apex_key {
5894 name: "myapex.key",
5895 public_key: "testkey.avbpubkey",
5896 private_key: "testkey.pem",
5897 }
5898
5899 android_app_import {
5900 name: "AppFooPrebuilt",
5901 apk: "PrebuiltAppFoo.apk",
5902 presigned: true,
5903 apex_available: ["myapex"],
5904 }
5905 `, fixture)
5906 }
5907}
5908
Dario Frenicde2a032019-10-27 00:29:22 +01005909func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005910 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005911 apex {
5912 name: "myapex",
5913 key: "myapex.key",
5914 apps: [
5915 "AppFooPrebuilt",
5916 "AppFooPrivPrebuilt",
5917 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005918 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005919 }
5920
5921 apex_key {
5922 name: "myapex.key",
5923 public_key: "testkey.avbpubkey",
5924 private_key: "testkey.pem",
5925 }
5926
5927 android_app_import {
5928 name: "AppFooPrebuilt",
5929 apk: "PrebuiltAppFoo.apk",
5930 presigned: true,
5931 dex_preopt: {
5932 enabled: false,
5933 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005934 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005935 }
5936
5937 android_app_import {
5938 name: "AppFooPrivPrebuilt",
5939 apk: "PrebuiltAppFooPriv.apk",
5940 privileged: true,
5941 presigned: true,
5942 dex_preopt: {
5943 enabled: false,
5944 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005945 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005946 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005947 }
5948 `)
5949
Sundong Ahnabb64432019-10-22 13:58:29 +09005950 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005951 apexRule := module.Rule("apexRule")
5952 copyCmds := apexRule.Args["copy_commands"]
5953
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005954 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5955 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005956}
5957
5958func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005959 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005960 apex {
5961 name: "myapex",
5962 key: "myapex.key",
5963 apps: [
5964 "AppFoo",
5965 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005966 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005967 }
5968
5969 apex_key {
5970 name: "myapex.key",
5971 public_key: "testkey.avbpubkey",
5972 private_key: "testkey.pem",
5973 }
5974
5975 android_app {
5976 name: "AppFoo",
5977 srcs: ["foo/bar/MyClass.java"],
5978 sdk_version: "none",
5979 system_modules: "none",
5980 apex_available: [ "myapex" ],
5981 }
5982
5983 android_app_import {
5984 name: "AppFoo",
5985 apk: "AppFooPrebuilt.apk",
5986 filename: "AppFooPrebuilt.apk",
5987 presigned: true,
5988 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005989 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005990 }
5991 `, withFiles(map[string][]byte{
5992 "AppFooPrebuilt.apk": nil,
5993 }))
5994
5995 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005996 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005997 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005998}
5999
Dario Freni6f3937c2019-12-20 22:58:03 +00006000func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006001 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006002 apex {
6003 name: "myapex",
6004 key: "myapex.key",
6005 apps: [
6006 "TesterHelpAppFoo",
6007 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006008 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006009 }
6010
6011 apex_key {
6012 name: "myapex.key",
6013 public_key: "testkey.avbpubkey",
6014 private_key: "testkey.pem",
6015 }
6016
6017 android_test_helper_app {
6018 name: "TesterHelpAppFoo",
6019 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006020 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006021 }
6022
6023 `)
6024
6025 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6026 apexRule := module.Rule("apexRule")
6027 copyCmds := apexRule.Args["copy_commands"]
6028
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006029 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006030}
6031
Jooyung Han18020ea2019-11-13 10:50:48 +09006032func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6033 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006034 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006035 apex {
6036 name: "myapex",
6037 key: "myapex.key",
6038 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006039 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006040 }
6041
6042 apex_key {
6043 name: "myapex.key",
6044 public_key: "testkey.avbpubkey",
6045 private_key: "testkey.pem",
6046 }
6047
6048 apex {
6049 name: "otherapex",
6050 key: "myapex.key",
6051 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006052 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006053 }
6054
6055 cc_defaults {
6056 name: "libfoo-defaults",
6057 apex_available: ["otherapex"],
6058 }
6059
6060 cc_library {
6061 name: "libfoo",
6062 defaults: ["libfoo-defaults"],
6063 stl: "none",
6064 system_shared_libs: [],
6065 }`)
6066}
6067
Paul Duffine52e66f2020-03-30 17:54:29 +01006068func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006069 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006070 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006071 apex {
6072 name: "myapex",
6073 key: "myapex.key",
6074 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006075 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006076 }
6077
6078 apex_key {
6079 name: "myapex.key",
6080 public_key: "testkey.avbpubkey",
6081 private_key: "testkey.pem",
6082 }
6083
6084 apex {
6085 name: "otherapex",
6086 key: "otherapex.key",
6087 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006088 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006089 }
6090
6091 apex_key {
6092 name: "otherapex.key",
6093 public_key: "testkey.avbpubkey",
6094 private_key: "testkey.pem",
6095 }
6096
6097 cc_library {
6098 name: "libfoo",
6099 stl: "none",
6100 system_shared_libs: [],
6101 apex_available: ["otherapex"],
6102 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006103}
Jiyong Park127b40b2019-09-30 16:04:35 +09006104
Paul Duffine52e66f2020-03-30 17:54:29 +01006105func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006106 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006107 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006108.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006109.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006110.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006111.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006112.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006113.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006114 apex {
6115 name: "myapex",
6116 key: "myapex.key",
6117 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006118 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006119 }
6120
6121 apex_key {
6122 name: "myapex.key",
6123 public_key: "testkey.avbpubkey",
6124 private_key: "testkey.pem",
6125 }
6126
Jiyong Park127b40b2019-09-30 16:04:35 +09006127 cc_library {
6128 name: "libfoo",
6129 stl: "none",
6130 shared_libs: ["libbar"],
6131 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006132 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006133 }
6134
6135 cc_library {
6136 name: "libbar",
6137 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006138 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006139 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006140 apex_available: ["myapex"],
6141 }
6142
6143 cc_library {
6144 name: "libbaz",
6145 stl: "none",
6146 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006147 }`)
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_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006151 testApexError(t, "\"otherapex\" is not a valid module name", `
6152 apex {
6153 name: "myapex",
6154 key: "myapex.key",
6155 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006156 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006157 }
6158
6159 apex_key {
6160 name: "myapex.key",
6161 public_key: "testkey.avbpubkey",
6162 private_key: "testkey.pem",
6163 }
6164
6165 cc_library {
6166 name: "libfoo",
6167 stl: "none",
6168 system_shared_libs: [],
6169 apex_available: ["otherapex"],
6170 }`)
6171
Paul Duffine52e66f2020-03-30 17:54:29 +01006172 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006173 apex {
6174 name: "myapex",
6175 key: "myapex.key",
6176 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006177 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006178 }
6179
6180 apex_key {
6181 name: "myapex.key",
6182 public_key: "testkey.avbpubkey",
6183 private_key: "testkey.pem",
6184 }
6185
6186 cc_library {
6187 name: "libfoo",
6188 stl: "none",
6189 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006190 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006191 apex_available: ["myapex"],
6192 }
6193
6194 cc_library {
6195 name: "libbar",
6196 stl: "none",
6197 system_shared_libs: [],
6198 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006199 }
6200
6201 cc_library {
6202 name: "libbaz",
6203 stl: "none",
6204 system_shared_libs: [],
6205 stubs: {
6206 versions: ["10", "20", "30"],
6207 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006208 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006209}
Jiyong Park127b40b2019-09-30 16:04:35 +09006210
Jiyong Park89e850a2020-04-07 16:37:39 +09006211func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006212 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006213 apex {
6214 name: "myapex",
6215 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006216 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006217 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006218 }
6219
6220 apex_key {
6221 name: "myapex.key",
6222 public_key: "testkey.avbpubkey",
6223 private_key: "testkey.pem",
6224 }
6225
6226 cc_library {
6227 name: "libfoo",
6228 stl: "none",
6229 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006230 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006231 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006232 }
6233
6234 cc_library {
6235 name: "libfoo2",
6236 stl: "none",
6237 system_shared_libs: [],
6238 shared_libs: ["libbaz"],
6239 apex_available: ["//apex_available:platform"],
6240 }
6241
6242 cc_library {
6243 name: "libbar",
6244 stl: "none",
6245 system_shared_libs: [],
6246 apex_available: ["myapex"],
6247 }
6248
6249 cc_library {
6250 name: "libbaz",
6251 stl: "none",
6252 system_shared_libs: [],
6253 apex_available: ["myapex"],
6254 stubs: {
6255 versions: ["1"],
6256 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006257 }`)
6258
Jiyong Park89e850a2020-04-07 16:37:39 +09006259 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6260 // because it depends on libbar which isn't available to platform
6261 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6262 if libfoo.NotAvailableForPlatform() != true {
6263 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6264 }
6265
6266 // libfoo2 however can be available to platform because it depends on libbaz which provides
6267 // stubs
6268 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6269 if libfoo2.NotAvailableForPlatform() == true {
6270 t.Errorf("%q should be available to platform", libfoo2.String())
6271 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006272}
Jiyong Parka90ca002019-10-07 15:47:24 +09006273
Paul Duffine52e66f2020-03-30 17:54:29 +01006274func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006275 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006276 apex {
6277 name: "myapex",
6278 key: "myapex.key",
6279 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006280 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006281 }
6282
6283 apex_key {
6284 name: "myapex.key",
6285 public_key: "testkey.avbpubkey",
6286 private_key: "testkey.pem",
6287 }
6288
6289 cc_library {
6290 name: "libfoo",
6291 stl: "none",
6292 system_shared_libs: [],
6293 apex_available: ["myapex"],
6294 static: {
6295 apex_available: ["//apex_available:platform"],
6296 },
6297 }`)
6298
Jiyong Park89e850a2020-04-07 16:37:39 +09006299 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6300 if libfooShared.NotAvailableForPlatform() != true {
6301 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6302 }
6303 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6304 if libfooStatic.NotAvailableForPlatform() != false {
6305 t.Errorf("%q should be available to platform", libfooStatic.String())
6306 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006307}
6308
Jiyong Park5d790c32019-11-15 18:40:32 +09006309func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006310 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006311 apex {
6312 name: "myapex",
6313 key: "myapex.key",
6314 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006315 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006316 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006317 bootclasspath_fragments: ["mybootclasspath_fragment"],
6318 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6319 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006320 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006321 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006322 }
6323
6324 override_apex {
6325 name: "override_myapex",
6326 base: "myapex",
6327 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006328 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006329 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006330 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6331 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6332 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006333 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006334 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006335 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006336 key: "mynewapex.key",
6337 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006338 }
6339
6340 apex_key {
6341 name: "myapex.key",
6342 public_key: "testkey.avbpubkey",
6343 private_key: "testkey.pem",
6344 }
6345
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006346 apex_key {
6347 name: "mynewapex.key",
6348 public_key: "testkey2.avbpubkey",
6349 private_key: "testkey2.pem",
6350 }
6351
6352 android_app_certificate {
6353 name: "myapex.certificate",
6354 certificate: "testkey",
6355 }
6356
Jiyong Park5d790c32019-11-15 18:40:32 +09006357 android_app {
6358 name: "app",
6359 srcs: ["foo/bar/MyClass.java"],
6360 package_name: "foo",
6361 sdk_version: "none",
6362 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006363 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006364 }
6365
6366 override_android_app {
6367 name: "override_app",
6368 base: "app",
6369 package_name: "bar",
6370 }
markchien7c803b82021-08-26 22:10:06 +08006371
6372 bpf {
6373 name: "bpf",
6374 srcs: ["bpf.c"],
6375 }
6376
6377 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006378 name: "overrideBpf",
6379 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006380 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006381
6382 prebuilt_etc {
6383 name: "myetc",
6384 src: "myprebuilt",
6385 }
6386
6387 prebuilt_etc {
6388 name: "override_myetc",
6389 src: "override_myprebuilt",
6390 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006391
6392 java_library {
6393 name: "bcplib",
6394 srcs: ["a.java"],
6395 compile_dex: true,
6396 apex_available: ["myapex"],
6397 permitted_packages: ["bcp.lib"],
6398 }
6399
6400 bootclasspath_fragment {
6401 name: "mybootclasspath_fragment",
6402 contents: ["bcplib"],
6403 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006404 hidden_api: {
6405 split_packages: ["*"],
6406 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006407 }
6408
6409 java_library {
6410 name: "override_bcplib",
6411 srcs: ["a.java"],
6412 compile_dex: true,
6413 apex_available: ["myapex"],
6414 permitted_packages: ["override.bcp.lib"],
6415 }
6416
6417 bootclasspath_fragment {
6418 name: "override_bootclasspath_fragment",
6419 contents: ["override_bcplib"],
6420 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006421 hidden_api: {
6422 split_packages: ["*"],
6423 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006424 }
6425
6426 java_library {
6427 name: "systemserverlib",
6428 srcs: ["a.java"],
6429 apex_available: ["myapex"],
6430 }
6431
6432 systemserverclasspath_fragment {
6433 name: "mysystemserverclasspath_fragment",
6434 standalone_contents: ["systemserverlib"],
6435 apex_available: ["myapex"],
6436 }
6437
6438 java_library {
6439 name: "override_systemserverlib",
6440 srcs: ["a.java"],
6441 apex_available: ["myapex"],
6442 }
6443
6444 systemserverclasspath_fragment {
6445 name: "override_systemserverclasspath_fragment",
6446 standalone_contents: ["override_systemserverlib"],
6447 apex_available: ["myapex"],
6448 }
6449
6450 java_library {
6451 name: "myjava_library",
6452 srcs: ["a.java"],
6453 compile_dex: true,
6454 apex_available: ["myapex"],
6455 }
6456
6457 java_library {
6458 name: "override_java_library",
6459 srcs: ["a.java"],
6460 compile_dex: true,
6461 apex_available: ["myapex"],
6462 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006463 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006464
Jiyong Park317645e2019-12-05 13:20:58 +09006465 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6466 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6467 if originalVariant.GetOverriddenBy() != "" {
6468 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6469 }
6470 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6471 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6472 }
6473
Jiyong Park5d790c32019-11-15 18:40:32 +09006474 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6475 apexRule := module.Rule("apexRule")
6476 copyCmds := apexRule.Args["copy_commands"]
6477
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006478 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6479 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006480
markchien7c803b82021-08-26 22:10:06 +08006481 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006482 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006483
Daniel Norman5a3ce132021-08-26 15:44:43 -07006484 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6485 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6486
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006487 apexBundle := module.Module().(*apexBundle)
6488 name := apexBundle.Name()
6489 if name != "override_myapex" {
6490 t.Errorf("name should be \"override_myapex\", but was %q", name)
6491 }
6492
Baligh Uddin004d7172020-02-19 21:29:28 -08006493 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6494 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6495 }
6496
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006497 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6498 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6499 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6500 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6501 android.AssertArrayString(t, "Java_libs does not match",
6502 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6503
Jiyong Park20bacab2020-03-03 11:45:41 +09006504 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006505 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006506 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6507
6508 signApkRule := module.Rule("signapk")
6509 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006510
Colin Crossaa255532020-07-03 13:18:24 -07006511 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006512 var builder strings.Builder
6513 data.Custom(&builder, name, "TARGET_", "", data)
6514 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006515 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6516 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
6517 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
6518 ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex")
6519 ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex")
6520 ensureContains(t, androidMk, "LOCAL_MODULE := override_java_library.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006521 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006522 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006523 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006524 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006525 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006526 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006527 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6528 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6529 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006530 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006531}
6532
Albert Martineefabcf2022-03-21 20:11:16 +00006533func TestMinSdkVersionOverride(t *testing.T) {
6534 // Override from 29 to 31
6535 minSdkOverride31 := "31"
6536 ctx := testApex(t, `
6537 apex {
6538 name: "myapex",
6539 key: "myapex.key",
6540 native_shared_libs: ["mylib"],
6541 updatable: true,
6542 min_sdk_version: "29"
6543 }
6544
6545 override_apex {
6546 name: "override_myapex",
6547 base: "myapex",
6548 logging_parent: "com.foo.bar",
6549 package_name: "test.overridden.package"
6550 }
6551
6552 apex_key {
6553 name: "myapex.key",
6554 public_key: "testkey.avbpubkey",
6555 private_key: "testkey.pem",
6556 }
6557
6558 cc_library {
6559 name: "mylib",
6560 srcs: ["mylib.cpp"],
6561 runtime_libs: ["libbar"],
6562 system_shared_libs: [],
6563 stl: "none",
6564 apex_available: [ "myapex" ],
6565 min_sdk_version: "apex_inherit"
6566 }
6567
6568 cc_library {
6569 name: "libbar",
6570 srcs: ["mylib.cpp"],
6571 system_shared_libs: [],
6572 stl: "none",
6573 apex_available: [ "myapex" ],
6574 min_sdk_version: "apex_inherit"
6575 }
6576
6577 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6578
6579 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6580 copyCmds := apexRule.Args["copy_commands"]
6581
6582 // Ensure that direct non-stubs dep is always included
6583 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6584
6585 // Ensure that runtime_libs dep in included
6586 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6587
6588 // Ensure libraries target overridden min_sdk_version value
6589 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6590}
6591
6592func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6593 // Attempt to override from 31 to 29, should be a NOOP
6594 minSdkOverride29 := "29"
6595 ctx := testApex(t, `
6596 apex {
6597 name: "myapex",
6598 key: "myapex.key",
6599 native_shared_libs: ["mylib"],
6600 updatable: true,
6601 min_sdk_version: "31"
6602 }
6603
6604 override_apex {
6605 name: "override_myapex",
6606 base: "myapex",
6607 logging_parent: "com.foo.bar",
6608 package_name: "test.overridden.package"
6609 }
6610
6611 apex_key {
6612 name: "myapex.key",
6613 public_key: "testkey.avbpubkey",
6614 private_key: "testkey.pem",
6615 }
6616
6617 cc_library {
6618 name: "mylib",
6619 srcs: ["mylib.cpp"],
6620 runtime_libs: ["libbar"],
6621 system_shared_libs: [],
6622 stl: "none",
6623 apex_available: [ "myapex" ],
6624 min_sdk_version: "apex_inherit"
6625 }
6626
6627 cc_library {
6628 name: "libbar",
6629 srcs: ["mylib.cpp"],
6630 system_shared_libs: [],
6631 stl: "none",
6632 apex_available: [ "myapex" ],
6633 min_sdk_version: "apex_inherit"
6634 }
6635
6636 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6637
6638 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6639 copyCmds := apexRule.Args["copy_commands"]
6640
6641 // Ensure that direct non-stubs dep is always included
6642 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6643
6644 // Ensure that runtime_libs dep in included
6645 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6646
6647 // Ensure libraries target the original min_sdk_version value rather than the overridden
6648 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6649}
6650
Jooyung Han214bf372019-11-12 13:03:50 +09006651func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006652 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006653 apex {
6654 name: "myapex",
6655 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006656 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006657 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006658 }
6659
6660 apex_key {
6661 name: "myapex.key",
6662 public_key: "testkey.avbpubkey",
6663 private_key: "testkey.pem",
6664 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006665
6666 cc_library {
6667 name: "mylib",
6668 srcs: ["mylib.cpp"],
6669 stl: "libc++",
6670 system_shared_libs: [],
6671 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006672 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006673 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006674 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006675
6676 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6677 args := module.Rule("apexRule").Args
6678 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006679 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006680
6681 // The copies of the libraries in the apex should have one more dependency than
6682 // the ones outside the apex, namely the unwinder. Ideally we should check
6683 // the dependency names directly here but for some reason the names are blank in
6684 // this test.
6685 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006686 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006687 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6688 if len(apexImplicits) != len(nonApexImplicits)+1 {
6689 t.Errorf("%q missing unwinder dep", lib)
6690 }
6691 }
Jooyung Han214bf372019-11-12 13:03:50 +09006692}
6693
Paul Duffine05480a2021-03-08 15:07:14 +00006694var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006695 "api/current.txt": nil,
6696 "api/removed.txt": nil,
6697 "api/system-current.txt": nil,
6698 "api/system-removed.txt": nil,
6699 "api/test-current.txt": nil,
6700 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006701
Anton Hanssondff2c782020-12-21 17:10:01 +00006702 "100/public/api/foo.txt": nil,
6703 "100/public/api/foo-removed.txt": nil,
6704 "100/system/api/foo.txt": nil,
6705 "100/system/api/foo-removed.txt": nil,
6706
Paul Duffineedc5d52020-06-12 17:46:39 +01006707 // For java_sdk_library_import
6708 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006709}
6710
Jooyung Han58f26ab2019-12-18 15:34:32 +09006711func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006712 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006713 apex {
6714 name: "myapex",
6715 key: "myapex.key",
6716 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006717 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006718 }
6719
6720 apex_key {
6721 name: "myapex.key",
6722 public_key: "testkey.avbpubkey",
6723 private_key: "testkey.pem",
6724 }
6725
6726 java_sdk_library {
6727 name: "foo",
6728 srcs: ["a.java"],
6729 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006730 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006731 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006732
6733 prebuilt_apis {
6734 name: "sdk",
6735 api_dirs: ["100"],
6736 }
Paul Duffin9b879592020-05-26 13:21:35 +01006737 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006738
6739 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006740 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006741 "javalib/foo.jar",
6742 "etc/permissions/foo.xml",
6743 })
6744 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006745 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006746 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 +09006747}
6748
Paul Duffin9b879592020-05-26 13:21:35 +01006749func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006750 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006751 apex {
6752 name: "myapex",
6753 key: "myapex.key",
6754 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006755 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006756 }
6757
6758 apex_key {
6759 name: "myapex.key",
6760 public_key: "testkey.avbpubkey",
6761 private_key: "testkey.pem",
6762 }
6763
6764 java_sdk_library {
6765 name: "foo",
6766 srcs: ["a.java"],
6767 api_packages: ["foo"],
6768 apex_available: ["myapex"],
6769 sdk_version: "none",
6770 system_modules: "none",
6771 }
6772
6773 java_library {
6774 name: "bar",
6775 srcs: ["a.java"],
6776 libs: ["foo"],
6777 apex_available: ["myapex"],
6778 sdk_version: "none",
6779 system_modules: "none",
6780 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006781
6782 prebuilt_apis {
6783 name: "sdk",
6784 api_dirs: ["100"],
6785 }
Paul Duffin9b879592020-05-26 13:21:35 +01006786 `, withFiles(filesForSdkLibrary))
6787
6788 // java_sdk_library installs both impl jar and permission XML
6789 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6790 "javalib/bar.jar",
6791 "javalib/foo.jar",
6792 "etc/permissions/foo.xml",
6793 })
6794
6795 // The bar library should depend on the implementation jar.
6796 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006797 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006798 t.Errorf("expected %q, found %#q", expected, actual)
6799 }
6800}
6801
6802func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006803 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006804 apex {
6805 name: "myapex",
6806 key: "myapex.key",
6807 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006808 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006809 }
6810
6811 apex_key {
6812 name: "myapex.key",
6813 public_key: "testkey.avbpubkey",
6814 private_key: "testkey.pem",
6815 }
6816
6817 java_sdk_library {
6818 name: "foo",
6819 srcs: ["a.java"],
6820 api_packages: ["foo"],
6821 apex_available: ["myapex"],
6822 sdk_version: "none",
6823 system_modules: "none",
6824 }
6825
6826 java_library {
6827 name: "bar",
6828 srcs: ["a.java"],
6829 libs: ["foo"],
6830 sdk_version: "none",
6831 system_modules: "none",
6832 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006833
6834 prebuilt_apis {
6835 name: "sdk",
6836 api_dirs: ["100"],
6837 }
Paul Duffin9b879592020-05-26 13:21:35 +01006838 `, withFiles(filesForSdkLibrary))
6839
6840 // java_sdk_library installs both impl jar and permission XML
6841 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6842 "javalib/foo.jar",
6843 "etc/permissions/foo.xml",
6844 })
6845
6846 // The bar library should depend on the stubs jar.
6847 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006848 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006849 t.Errorf("expected %q, found %#q", expected, actual)
6850 }
6851}
6852
Paul Duffineedc5d52020-06-12 17:46:39 +01006853func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006854 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006855 prebuilt_apis {
6856 name: "sdk",
6857 api_dirs: ["100"],
6858 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006859 withFiles(map[string][]byte{
6860 "apex/a.java": nil,
6861 "apex/apex_manifest.json": nil,
6862 "apex/Android.bp": []byte(`
6863 package {
6864 default_visibility: ["//visibility:private"],
6865 }
6866
6867 apex {
6868 name: "myapex",
6869 key: "myapex.key",
6870 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006871 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006872 }
6873
6874 apex_key {
6875 name: "myapex.key",
6876 public_key: "testkey.avbpubkey",
6877 private_key: "testkey.pem",
6878 }
6879
6880 java_library {
6881 name: "bar",
6882 srcs: ["a.java"],
6883 libs: ["foo"],
6884 apex_available: ["myapex"],
6885 sdk_version: "none",
6886 system_modules: "none",
6887 }
6888`),
6889 "source/a.java": nil,
6890 "source/api/current.txt": nil,
6891 "source/api/removed.txt": nil,
6892 "source/Android.bp": []byte(`
6893 package {
6894 default_visibility: ["//visibility:private"],
6895 }
6896
6897 java_sdk_library {
6898 name: "foo",
6899 visibility: ["//apex"],
6900 srcs: ["a.java"],
6901 api_packages: ["foo"],
6902 apex_available: ["myapex"],
6903 sdk_version: "none",
6904 system_modules: "none",
6905 public: {
6906 enabled: true,
6907 },
6908 }
6909`),
6910 "prebuilt/a.jar": nil,
6911 "prebuilt/Android.bp": []byte(`
6912 package {
6913 default_visibility: ["//visibility:private"],
6914 }
6915
6916 java_sdk_library_import {
6917 name: "foo",
6918 visibility: ["//apex", "//source"],
6919 apex_available: ["myapex"],
6920 prefer: true,
6921 public: {
6922 jars: ["a.jar"],
6923 },
6924 }
6925`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006926 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006927 )
6928
6929 // java_sdk_library installs both impl jar and permission XML
6930 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6931 "javalib/bar.jar",
6932 "javalib/foo.jar",
6933 "etc/permissions/foo.xml",
6934 })
6935
6936 // The bar library should depend on the implementation jar.
6937 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006938 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006939 t.Errorf("expected %q, found %#q", expected, actual)
6940 }
6941}
6942
6943func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6944 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6945 apex {
6946 name: "myapex",
6947 key: "myapex.key",
6948 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006949 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006950 }
6951
6952 apex_key {
6953 name: "myapex.key",
6954 public_key: "testkey.avbpubkey",
6955 private_key: "testkey.pem",
6956 }
6957
6958 java_sdk_library_import {
6959 name: "foo",
6960 apex_available: ["myapex"],
6961 prefer: true,
6962 public: {
6963 jars: ["a.jar"],
6964 },
6965 }
6966
6967 `, withFiles(filesForSdkLibrary))
6968}
6969
atrost6e126252020-01-27 17:01:16 +00006970func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006971 result := android.GroupFixturePreparers(
6972 prepareForApexTest,
6973 java.PrepareForTestWithPlatformCompatConfig,
6974 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006975 apex {
6976 name: "myapex",
6977 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006978 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006979 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006980 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006981 }
6982
6983 apex_key {
6984 name: "myapex.key",
6985 public_key: "testkey.avbpubkey",
6986 private_key: "testkey.pem",
6987 }
6988
6989 platform_compat_config {
6990 name: "myjar-platform-compat-config",
6991 src: ":myjar",
6992 }
6993
6994 java_library {
6995 name: "myjar",
6996 srcs: ["foo/bar/MyClass.java"],
6997 sdk_version: "none",
6998 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006999 apex_available: [ "myapex" ],
7000 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007001
7002 // Make sure that a preferred prebuilt does not affect the apex contents.
7003 prebuilt_platform_compat_config {
7004 name: "myjar-platform-compat-config",
7005 metadata: "compat-config/metadata.xml",
7006 prefer: true,
7007 }
atrost6e126252020-01-27 17:01:16 +00007008 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007009 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007010 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7011 "etc/compatconfig/myjar-platform-compat-config.xml",
7012 "javalib/myjar.jar",
7013 })
7014}
7015
Jooyung Han862c0d62022-12-21 10:15:37 +09007016func TestNoDupeApexFiles(t *testing.T) {
7017 android.GroupFixturePreparers(
7018 android.PrepareForTestWithAndroidBuildComponents,
7019 PrepareForTestWithApexBuildComponents,
7020 prepareForTestWithMyapex,
7021 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7022 ).
7023 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7024 RunTestWithBp(t, `
7025 apex {
7026 name: "myapex",
7027 key: "myapex.key",
7028 prebuilts: ["foo", "bar"],
7029 updatable: false,
7030 }
7031
7032 apex_key {
7033 name: "myapex.key",
7034 public_key: "testkey.avbpubkey",
7035 private_key: "testkey.pem",
7036 }
7037
7038 prebuilt_etc {
7039 name: "foo",
7040 src: "myprebuilt",
7041 filename_from_src: true,
7042 }
7043
7044 prebuilt_etc {
7045 name: "bar",
7046 src: "myprebuilt",
7047 filename_from_src: true,
7048 }
7049 `)
7050}
7051
Jiyong Park479321d2019-12-16 11:47:12 +09007052func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7053 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7054 apex {
7055 name: "myapex",
7056 key: "myapex.key",
7057 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007058 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007059 }
7060
7061 apex_key {
7062 name: "myapex.key",
7063 public_key: "testkey.avbpubkey",
7064 private_key: "testkey.pem",
7065 }
7066
7067 java_library {
7068 name: "myjar",
7069 srcs: ["foo/bar/MyClass.java"],
7070 sdk_version: "none",
7071 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007072 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007073 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007074 }
7075 `)
7076}
7077
Jiyong Park7afd1072019-12-30 16:56:33 +09007078func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007079 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007080 apex {
7081 name: "myapex",
7082 key: "myapex.key",
7083 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007084 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007085 }
7086
7087 apex_key {
7088 name: "myapex.key",
7089 public_key: "testkey.avbpubkey",
7090 private_key: "testkey.pem",
7091 }
7092
7093 cc_library {
7094 name: "mylib",
7095 srcs: ["mylib.cpp"],
7096 system_shared_libs: [],
7097 stl: "none",
7098 required: ["a", "b"],
7099 host_required: ["c", "d"],
7100 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007101 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007102 }
7103 `)
7104
7105 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007106 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007107 name := apexBundle.BaseModuleName()
7108 prefix := "TARGET_"
7109 var builder strings.Builder
7110 data.Custom(&builder, name, prefix, "", data)
7111 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007112 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 -08007113 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7114 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007115}
7116
Jiyong Park7cd10e32020-01-14 09:22:18 +09007117func TestSymlinksFromApexToSystem(t *testing.T) {
7118 bp := `
7119 apex {
7120 name: "myapex",
7121 key: "myapex.key",
7122 native_shared_libs: ["mylib"],
7123 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007124 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007125 }
7126
Jiyong Park9d677202020-02-19 16:29:35 +09007127 apex {
7128 name: "myapex.updatable",
7129 key: "myapex.key",
7130 native_shared_libs: ["mylib"],
7131 java_libs: ["myjar"],
7132 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09007133 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09007134 }
7135
Jiyong Park7cd10e32020-01-14 09:22:18 +09007136 apex_key {
7137 name: "myapex.key",
7138 public_key: "testkey.avbpubkey",
7139 private_key: "testkey.pem",
7140 }
7141
7142 cc_library {
7143 name: "mylib",
7144 srcs: ["mylib.cpp"],
7145 shared_libs: ["myotherlib"],
7146 system_shared_libs: [],
7147 stl: "none",
7148 apex_available: [
7149 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007150 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007151 "//apex_available:platform",
7152 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007153 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007154 }
7155
7156 cc_library {
7157 name: "myotherlib",
7158 srcs: ["mylib.cpp"],
7159 system_shared_libs: [],
7160 stl: "none",
7161 apex_available: [
7162 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007163 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007164 "//apex_available:platform",
7165 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007166 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007167 }
7168
7169 java_library {
7170 name: "myjar",
7171 srcs: ["foo/bar/MyClass.java"],
7172 sdk_version: "none",
7173 system_modules: "none",
7174 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007175 apex_available: [
7176 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007177 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007178 "//apex_available:platform",
7179 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007180 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007181 }
7182
7183 java_library {
7184 name: "myotherjar",
7185 srcs: ["foo/bar/MyClass.java"],
7186 sdk_version: "none",
7187 system_modules: "none",
7188 apex_available: [
7189 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007190 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007191 "//apex_available:platform",
7192 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007193 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007194 }
7195 `
7196
7197 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7198 for _, f := range files {
7199 if f.path == file {
7200 if f.isLink {
7201 t.Errorf("%q is not a real file", file)
7202 }
7203 return
7204 }
7205 }
7206 t.Errorf("%q is not found", file)
7207 }
7208
7209 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
7210 for _, f := range files {
7211 if f.path == file {
7212 if !f.isLink {
7213 t.Errorf("%q is not a symlink", file)
7214 }
7215 return
7216 }
7217 }
7218 t.Errorf("%q is not found", file)
7219 }
7220
Jiyong Park9d677202020-02-19 16:29:35 +09007221 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7222 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007223 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007224 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007225 ensureRealfileExists(t, files, "javalib/myjar.jar")
7226 ensureRealfileExists(t, files, "lib64/mylib.so")
7227 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7228
Jiyong Park9d677202020-02-19 16:29:35 +09007229 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7230 ensureRealfileExists(t, files, "javalib/myjar.jar")
7231 ensureRealfileExists(t, files, "lib64/mylib.so")
7232 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7233
7234 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007235 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007236 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007237 ensureRealfileExists(t, files, "javalib/myjar.jar")
7238 ensureRealfileExists(t, files, "lib64/mylib.so")
7239 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007240
7241 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7242 ensureRealfileExists(t, files, "javalib/myjar.jar")
7243 ensureRealfileExists(t, files, "lib64/mylib.so")
7244 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007245}
7246
Yo Chiange8128052020-07-23 20:09:18 +08007247func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007248 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007249 apex {
7250 name: "myapex",
7251 key: "myapex.key",
7252 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007253 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007254 }
7255
7256 apex_key {
7257 name: "myapex.key",
7258 public_key: "testkey.avbpubkey",
7259 private_key: "testkey.pem",
7260 }
7261
7262 cc_library_shared {
7263 name: "mylib",
7264 srcs: ["mylib.cpp"],
7265 shared_libs: ["myotherlib"],
7266 system_shared_libs: [],
7267 stl: "none",
7268 apex_available: [
7269 "myapex",
7270 "//apex_available:platform",
7271 ],
7272 }
7273
7274 cc_prebuilt_library_shared {
7275 name: "myotherlib",
7276 srcs: ["prebuilt.so"],
7277 system_shared_libs: [],
7278 stl: "none",
7279 apex_available: [
7280 "myapex",
7281 "//apex_available:platform",
7282 ],
7283 }
7284 `)
7285
Prerana Patilb1896c82022-11-09 18:14:34 +00007286 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007287 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007288 var builder strings.Builder
7289 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7290 androidMk := builder.String()
7291 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007292 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007293 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7294 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7295 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007296 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 +08007297}
7298
Jooyung Han643adc42020-02-27 13:50:06 +09007299func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007300 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007301 apex {
7302 name: "myapex",
7303 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007304 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007305 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007306 }
7307
7308 apex_key {
7309 name: "myapex.key",
7310 public_key: "testkey.avbpubkey",
7311 private_key: "testkey.pem",
7312 }
7313
7314 cc_library {
7315 name: "mylib",
7316 srcs: ["mylib.cpp"],
7317 shared_libs: ["mylib2"],
7318 system_shared_libs: [],
7319 stl: "none",
7320 apex_available: [ "myapex" ],
7321 }
7322
7323 cc_library {
7324 name: "mylib2",
7325 srcs: ["mylib.cpp"],
7326 system_shared_libs: [],
7327 stl: "none",
7328 apex_available: [ "myapex" ],
7329 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007330
7331 rust_ffi_shared {
7332 name: "libfoo.rust",
7333 crate_name: "foo",
7334 srcs: ["foo.rs"],
7335 shared_libs: ["libfoo.shared_from_rust"],
7336 prefer_rlib: true,
7337 apex_available: ["myapex"],
7338 }
7339
7340 cc_library_shared {
7341 name: "libfoo.shared_from_rust",
7342 srcs: ["mylib.cpp"],
7343 system_shared_libs: [],
7344 stl: "none",
7345 stubs: {
7346 versions: ["10", "11", "12"],
7347 },
7348 }
7349
Jooyung Han643adc42020-02-27 13:50:06 +09007350 `)
7351
7352 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7353 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007354 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007355 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7356 "lib64/mylib.so",
7357 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007358 "lib64/libfoo.rust.so",
7359 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7360 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007361 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007362
7363 // b/220397949
7364 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007365}
7366
Jooyung Han49f67012020-04-17 13:43:10 +09007367func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007368 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007369 apex {
7370 name: "myapex",
7371 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007372 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007373 }
7374 apex_key {
7375 name: "myapex.key",
7376 public_key: "testkey.avbpubkey",
7377 private_key: "testkey.pem",
7378 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007379 `,
7380 android.FixtureModifyConfig(func(config android.Config) {
7381 delete(config.Targets, android.Android)
7382 config.AndroidCommonTarget = android.Target{}
7383 }),
7384 )
Jooyung Han49f67012020-04-17 13:43:10 +09007385
7386 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7387 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7388 }
7389}
7390
Jiyong Parkbd159612020-02-28 15:22:21 +09007391func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007392 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007393 apex {
7394 name: "myapex",
7395 key: "myapex.key",
7396 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007397 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007398 }
7399
7400 apex_key {
7401 name: "myapex.key",
7402 public_key: "testkey.avbpubkey",
7403 private_key: "testkey.pem",
7404 }
7405
7406 android_app {
7407 name: "AppFoo",
7408 srcs: ["foo/bar/MyClass.java"],
7409 sdk_version: "none",
7410 system_modules: "none",
7411 apex_available: [ "myapex" ],
7412 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007413 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007414
Colin Crosscf371cc2020-11-13 11:48:42 -08007415 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007416 content := bundleConfigRule.Args["content"]
7417
7418 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007419 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 +09007420}
7421
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007422func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007423 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007424 apex {
7425 name: "myapex",
7426 key: "myapex.key",
7427 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007428 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007429 }
7430
7431 apex_key {
7432 name: "myapex.key",
7433 public_key: "testkey.avbpubkey",
7434 private_key: "testkey.pem",
7435 }
7436
7437 android_app_set {
7438 name: "AppSet",
7439 set: "AppSet.apks",
7440 }`)
7441 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007442 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007443 content := bundleConfigRule.Args["content"]
7444 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7445 s := mod.Rule("apexRule").Args["copy_commands"]
7446 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007447 if len(copyCmds) != 4 {
7448 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007449 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007450 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7451 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007452 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7453 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007454
7455 // Ensure that canned_fs_config has an entry for the app set zip file
7456 generateFsRule := mod.Rule("generateFsConfig")
7457 cmd := generateFsRule.RuleParams.Command
7458 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007459}
7460
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007461func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007462 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007463 apex_set {
7464 name: "myapex",
7465 filename: "foo_v2.apex",
7466 sanitized: {
7467 none: { set: "myapex.apks", },
7468 hwaddress: { set: "myapex.hwasan.apks", },
7469 },
Paul Duffin24704672021-04-06 16:09:30 +01007470 }
7471 `
7472 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007473
Paul Duffin24704672021-04-06 16:09:30 +01007474 // Check that the extractor produces the correct output file from the correct input file.
7475 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007476
Paul Duffin24704672021-04-06 16:09:30 +01007477 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7478 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007479
Paul Duffin24704672021-04-06 16:09:30 +01007480 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7481
7482 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007483 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7484 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007485
7486 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007487}
7488
Pranav Guptaeba03b02022-09-27 00:27:08 +00007489func TestApexSetApksModuleAssignment(t *testing.T) {
7490 ctx := testApex(t, `
7491 apex_set {
7492 name: "myapex",
7493 set: ":myapex_apks_file",
7494 }
7495
7496 filegroup {
7497 name: "myapex_apks_file",
7498 srcs: ["myapex.apks"],
7499 }
7500 `)
7501
7502 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7503
7504 // Check that the extractor produces the correct apks file from the input module
7505 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7506 extractedApex := m.Output(extractorOutput)
7507
7508 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7509}
7510
Paul Duffin89f570a2021-06-16 01:42:33 +01007511func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007512 t.Helper()
7513
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007514 bp := `
7515 java_library {
7516 name: "some-updatable-apex-lib",
7517 srcs: ["a.java"],
7518 sdk_version: "current",
7519 apex_available: [
7520 "some-updatable-apex",
7521 ],
satayevabcd5972021-08-06 17:49:46 +01007522 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007523 }
7524
7525 java_library {
7526 name: "some-non-updatable-apex-lib",
7527 srcs: ["a.java"],
7528 apex_available: [
7529 "some-non-updatable-apex",
7530 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007531 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007532 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007533 }
7534
7535 bootclasspath_fragment {
7536 name: "some-non-updatable-fragment",
7537 contents: ["some-non-updatable-apex-lib"],
7538 apex_available: [
7539 "some-non-updatable-apex",
7540 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007541 hidden_api: {
7542 split_packages: ["*"],
7543 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007544 }
7545
7546 java_library {
7547 name: "some-platform-lib",
7548 srcs: ["a.java"],
7549 sdk_version: "current",
7550 installable: true,
7551 }
7552
7553 java_library {
7554 name: "some-art-lib",
7555 srcs: ["a.java"],
7556 sdk_version: "current",
7557 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007558 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007559 ],
7560 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007561 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007562 }
7563
7564 apex {
7565 name: "some-updatable-apex",
7566 key: "some-updatable-apex.key",
7567 java_libs: ["some-updatable-apex-lib"],
7568 updatable: true,
7569 min_sdk_version: "current",
7570 }
7571
7572 apex {
7573 name: "some-non-updatable-apex",
7574 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007575 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007576 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007577 }
7578
7579 apex_key {
7580 name: "some-updatable-apex.key",
7581 }
7582
7583 apex_key {
7584 name: "some-non-updatable-apex.key",
7585 }
7586
7587 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007588 name: "com.android.art.debug",
7589 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007590 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007591 updatable: true,
7592 min_sdk_version: "current",
7593 }
7594
Paul Duffinf23bc472021-04-27 12:42:20 +01007595 bootclasspath_fragment {
7596 name: "art-bootclasspath-fragment",
7597 image_name: "art",
7598 contents: ["some-art-lib"],
7599 apex_available: [
7600 "com.android.art.debug",
7601 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007602 hidden_api: {
7603 split_packages: ["*"],
7604 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007605 }
7606
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007607 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007608 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007609 }
7610
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007611 filegroup {
7612 name: "some-updatable-apex-file_contexts",
7613 srcs: [
7614 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7615 ],
7616 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007617
7618 filegroup {
7619 name: "some-non-updatable-apex-file_contexts",
7620 srcs: [
7621 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7622 ],
7623 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007624 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007625
Paul Duffin89f570a2021-06-16 01:42:33 +01007626 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007627}
7628
Paul Duffin89f570a2021-06-16 01:42:33 +01007629func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007630 t.Helper()
7631
Paul Duffin55607122021-03-30 23:32:51 +01007632 fs := android.MockFS{
7633 "a.java": nil,
7634 "a.jar": nil,
7635 "apex_manifest.json": nil,
7636 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007637 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007638 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7639 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7640 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007641 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007642 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007643
Paul Duffin55607122021-03-30 23:32:51 +01007644 errorHandler := android.FixtureExpectsNoErrors
7645 if errmsg != "" {
7646 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007647 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007648
Paul Duffin55607122021-03-30 23:32:51 +01007649 result := android.GroupFixturePreparers(
7650 cc.PrepareForTestWithCcDefaultModules,
7651 java.PrepareForTestWithHiddenApiBuildComponents,
7652 java.PrepareForTestWithJavaDefaultModules,
7653 java.PrepareForTestWithJavaSdkLibraryFiles,
7654 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007655 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007656 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007657 android.FixtureModifyMockFS(func(fs android.MockFS) {
7658 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7659 insert := ""
7660 for _, fragment := range fragments {
7661 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7662 }
7663 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7664 platform_bootclasspath {
7665 name: "platform-bootclasspath",
7666 fragments: [
7667 %s
7668 ],
7669 }
7670 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007671 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007672 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007673 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007674 ).
7675 ExtendWithErrorHandler(errorHandler).
7676 RunTestWithBp(t, bp)
7677
7678 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007679}
7680
Paul Duffin5556c5f2022-06-09 17:32:21 +00007681func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007682 preparers := android.GroupFixturePreparers(
7683 java.PrepareForTestWithJavaDefaultModules,
7684 PrepareForTestWithApexBuildComponents,
7685 ).
7686 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7687 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7688
7689 bpBase := `
7690 apex_set {
7691 name: "com.android.myapex",
7692 installable: true,
7693 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7694 set: "myapex.apks",
7695 }
7696
7697 apex_set {
7698 name: "com.mycompany.android.myapex",
7699 apex_name: "com.android.myapex",
7700 installable: true,
7701 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7702 set: "company-myapex.apks",
7703 }
7704
7705 prebuilt_bootclasspath_fragment {
7706 name: "my-bootclasspath-fragment",
7707 apex_available: ["com.android.myapex"],
7708 %s
7709 }
7710 `
7711
7712 t.Run("java_import", func(t *testing.T) {
7713 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7714 java_import {
7715 name: "libfoo",
7716 jars: ["libfoo.jar"],
7717 apex_available: ["com.android.myapex"],
7718 }
7719 `)
7720 })
7721
7722 t.Run("java_sdk_library_import", func(t *testing.T) {
7723 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7724 java_sdk_library_import {
7725 name: "libfoo",
7726 public: {
7727 jars: ["libbar.jar"],
7728 },
7729 apex_available: ["com.android.myapex"],
7730 }
7731 `)
7732 })
7733
7734 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7735 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7736 image_name: "art",
7737 contents: ["libfoo"],
7738 `)+`
7739 java_sdk_library_import {
7740 name: "libfoo",
7741 public: {
7742 jars: ["libbar.jar"],
7743 },
7744 apex_available: ["com.android.myapex"],
7745 }
7746 `)
7747 })
7748}
7749
Paul Duffin5556c5f2022-06-09 17:32:21 +00007750func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7751 preparers := android.GroupFixturePreparers(
7752 java.PrepareForTestWithJavaDefaultModules,
7753 PrepareForTestWithApexBuildComponents,
7754 )
7755
7756 bpBase := `
7757 apex_set {
7758 name: "com.android.myapex",
7759 installable: true,
7760 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7761 set: "myapex.apks",
7762 }
7763
7764 apex_set {
7765 name: "com.android.myapex_compressed",
7766 apex_name: "com.android.myapex",
7767 installable: true,
7768 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7769 set: "myapex_compressed.apks",
7770 }
7771
7772 prebuilt_bootclasspath_fragment {
7773 name: "my-bootclasspath-fragment",
7774 apex_available: [
7775 "com.android.myapex",
7776 "com.android.myapex_compressed",
7777 ],
7778 hidden_api: {
7779 annotation_flags: "annotation-flags.csv",
7780 metadata: "metadata.csv",
7781 index: "index.csv",
7782 signature_patterns: "signature_patterns.csv",
7783 },
7784 %s
7785 }
7786 `
7787
7788 t.Run("java_import", func(t *testing.T) {
7789 result := preparers.RunTestWithBp(t,
7790 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7791 java_import {
7792 name: "libfoo",
7793 jars: ["libfoo.jar"],
7794 apex_available: [
7795 "com.android.myapex",
7796 "com.android.myapex_compressed",
7797 ],
7798 }
7799 `)
7800
7801 module := result.Module("libfoo", "android_common_com.android.myapex")
7802 usesLibraryDep := module.(java.UsesLibraryDependency)
7803 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7804 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7805 usesLibraryDep.DexJarBuildPath().Path())
7806 })
7807
7808 t.Run("java_sdk_library_import", func(t *testing.T) {
7809 result := preparers.RunTestWithBp(t,
7810 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7811 java_sdk_library_import {
7812 name: "libfoo",
7813 public: {
7814 jars: ["libbar.jar"],
7815 },
7816 apex_available: [
7817 "com.android.myapex",
7818 "com.android.myapex_compressed",
7819 ],
7820 compile_dex: true,
7821 }
7822 `)
7823
7824 module := result.Module("libfoo", "android_common_com.android.myapex")
7825 usesLibraryDep := module.(java.UsesLibraryDependency)
7826 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7827 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7828 usesLibraryDep.DexJarBuildPath().Path())
7829 })
7830
7831 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7832 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7833 image_name: "art",
7834 contents: ["libfoo"],
7835 `)+`
7836 java_sdk_library_import {
7837 name: "libfoo",
7838 public: {
7839 jars: ["libbar.jar"],
7840 },
7841 apex_available: [
7842 "com.android.myapex",
7843 "com.android.myapex_compressed",
7844 ],
7845 compile_dex: true,
7846 }
7847 `)
7848 })
7849}
7850
Jooyung Han548640b2020-04-27 12:10:30 +09007851func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7852 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7853 apex {
7854 name: "myapex",
7855 key: "myapex.key",
7856 updatable: true,
7857 }
7858
7859 apex_key {
7860 name: "myapex.key",
7861 public_key: "testkey.avbpubkey",
7862 private_key: "testkey.pem",
7863 }
7864 `)
7865}
7866
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007867func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7868 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7869 apex {
7870 name: "myapex",
7871 key: "myapex.key",
7872 }
7873
7874 apex_key {
7875 name: "myapex.key",
7876 public_key: "testkey.avbpubkey",
7877 private_key: "testkey.pem",
7878 }
7879 `)
7880}
7881
Daniel Norman69109112021-12-02 12:52:42 -08007882func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7883 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7884 apex {
7885 name: "myapex",
7886 key: "myapex.key",
7887 updatable: true,
7888 soc_specific: true,
7889 }
7890
7891 apex_key {
7892 name: "myapex.key",
7893 public_key: "testkey.avbpubkey",
7894 private_key: "testkey.pem",
7895 }
7896 `)
7897}
7898
satayevb98371c2021-06-15 16:49:50 +01007899func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7900 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7901 apex {
7902 name: "myapex",
7903 key: "myapex.key",
7904 systemserverclasspath_fragments: [
7905 "mysystemserverclasspathfragment",
7906 ],
7907 min_sdk_version: "29",
7908 updatable: true,
7909 }
7910
7911 apex_key {
7912 name: "myapex.key",
7913 public_key: "testkey.avbpubkey",
7914 private_key: "testkey.pem",
7915 }
7916
7917 java_library {
7918 name: "foo",
7919 srcs: ["b.java"],
7920 min_sdk_version: "29",
7921 installable: true,
7922 apex_available: [
7923 "myapex",
7924 ],
7925 }
7926
7927 systemserverclasspath_fragment {
7928 name: "mysystemserverclasspathfragment",
7929 generate_classpaths_proto: false,
7930 contents: [
7931 "foo",
7932 ],
7933 apex_available: [
7934 "myapex",
7935 ],
7936 }
satayevabcd5972021-08-06 17:49:46 +01007937 `,
7938 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7939 )
satayevb98371c2021-06-15 16:49:50 +01007940}
7941
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007942func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007943 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7944 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7945 // modules to be included in the BootJars.
7946 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7947 return android.GroupFixturePreparers(
7948 dexpreopt.FixtureSetBootJars(bootJars...),
7949 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7950 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7951 }),
7952 )
7953 }
7954
7955 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7956 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7957 // specified in the ArtApexJars configuration.
7958 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7959 return android.GroupFixturePreparers(
7960 dexpreopt.FixtureSetArtBootJars(bootJars...),
7961 dexpreopt.FixtureSetBootJars(bootJars...),
7962 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7963 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7964 }),
7965 )
7966 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007967
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007968 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007969 preparer := android.GroupFixturePreparers(
7970 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7971 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7972 )
7973 fragments := []java.ApexVariantReference{
7974 {
7975 Apex: proptools.StringPtr("com.android.art.debug"),
7976 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7977 },
7978 {
7979 Apex: proptools.StringPtr("some-non-updatable-apex"),
7980 Module: proptools.StringPtr("some-non-updatable-fragment"),
7981 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007982 }
satayevabcd5972021-08-06 17:49:46 +01007983 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007984 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007985
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007986 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007987 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7988 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007989 preparer := android.GroupFixturePreparers(
7990 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7991 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7992 )
Paul Duffin60264a02021-04-12 20:02:36 +01007993 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007994 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007995
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007996 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 +01007997 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 +01007998 // Update the dexpreopt ArtApexJars directly.
7999 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
8000 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008001 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008002
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008003 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 +01008004 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 +01008005 // Update the dexpreopt ArtApexJars directly.
8006 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
8007 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008008 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008009
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008010 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 +01008011 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 +01008012 preparer := android.GroupFixturePreparers(
8013 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
8014 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8015 )
Paul Duffin60264a02021-04-12 20:02:36 +01008016 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008017 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008018
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008019 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 +01008020 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01008021 fragment := java.ApexVariantReference{
8022 Apex: proptools.StringPtr("some-non-updatable-apex"),
8023 Module: proptools.StringPtr("some-non-updatable-fragment"),
8024 }
8025 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008026 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008027
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008028 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008029 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008030 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8031 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008032 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008033
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008034 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008035 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008036 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8037 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008038 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008039
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008040 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008041 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01008042 // Update the dexpreopt ArtApexJars directly.
8043 preparer := prepareSetArtJars("platform:some-platform-lib")
8044 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008045 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008046
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008047 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008048 preparer := android.GroupFixturePreparers(
8049 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8050 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8051 )
8052 fragments := []java.ApexVariantReference{
8053 {
8054 Apex: proptools.StringPtr("some-non-updatable-apex"),
8055 Module: proptools.StringPtr("some-non-updatable-fragment"),
8056 },
8057 }
8058 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008059 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008060}
8061
8062func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008063 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008064 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008065 fragment := java.ApexVariantReference{
8066 Apex: proptools.StringPtr("myapex"),
8067 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8068 }
8069
Paul Duffin064b70c2020-11-02 17:32:38 +00008070 testDexpreoptWithApexes(t, `
8071 prebuilt_apex {
8072 name: "myapex" ,
8073 arch: {
8074 arm64: {
8075 src: "myapex-arm64.apex",
8076 },
8077 arm: {
8078 src: "myapex-arm.apex",
8079 },
8080 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008081 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8082 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008083
Paul Duffin89f570a2021-06-16 01:42:33 +01008084 prebuilt_bootclasspath_fragment {
8085 name: "my-bootclasspath-fragment",
8086 contents: ["libfoo"],
8087 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008088 hidden_api: {
8089 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8090 metadata: "my-bootclasspath-fragment/metadata.csv",
8091 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008092 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8093 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8094 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008095 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008096 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008097
Paul Duffin89f570a2021-06-16 01:42:33 +01008098 java_import {
8099 name: "libfoo",
8100 jars: ["libfoo.jar"],
8101 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008102 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008103 }
8104 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008105 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008106}
8107
Spandan Dasf14e2542021-11-12 00:01:37 +00008108func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008109 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008110 bp += `
8111 apex_key {
8112 name: "myapex.key",
8113 public_key: "testkey.avbpubkey",
8114 private_key: "testkey.pem",
8115 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008116 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008117 "lib1/src/A.java": nil,
8118 "lib2/src/B.java": nil,
8119 "system/sepolicy/apex/myapex-file_contexts": nil,
8120 }
8121
Paul Duffin45338f02021-03-30 23:07:52 +01008122 errorHandler := android.FixtureExpectsNoErrors
8123 if errmsg != "" {
8124 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008125 }
Colin Crossae8600b2020-10-29 17:09:13 -07008126
Paul Duffin45338f02021-03-30 23:07:52 +01008127 android.GroupFixturePreparers(
8128 android.PrepareForTestWithAndroidBuildComponents,
8129 java.PrepareForTestWithJavaBuildComponents,
8130 PrepareForTestWithApexBuildComponents,
8131 android.PrepareForTestWithNeverallowRules(rules),
8132 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008133 apexBootJars := make([]string, 0, len(bootJars))
8134 for _, apexBootJar := range bootJars {
8135 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008136 }
satayevd604b212021-07-21 14:23:52 +01008137 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008138 }),
8139 fs.AddToFixture(),
8140 ).
8141 ExtendWithErrorHandler(errorHandler).
8142 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008143}
8144
8145func TestApexPermittedPackagesRules(t *testing.T) {
8146 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008147 name string
8148 expectedError string
8149 bp string
8150 bootJars []string
8151 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008152 }{
8153
8154 {
8155 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8156 expectedError: "",
8157 bp: `
8158 java_library {
8159 name: "bcp_lib1",
8160 srcs: ["lib1/src/*.java"],
8161 permitted_packages: ["foo.bar"],
8162 apex_available: ["myapex"],
8163 sdk_version: "none",
8164 system_modules: "none",
8165 }
8166 java_library {
8167 name: "nonbcp_lib2",
8168 srcs: ["lib2/src/*.java"],
8169 apex_available: ["myapex"],
8170 permitted_packages: ["a.b"],
8171 sdk_version: "none",
8172 system_modules: "none",
8173 }
8174 apex {
8175 name: "myapex",
8176 key: "myapex.key",
8177 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008178 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008179 }`,
8180 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008181 bcpPermittedPackages: map[string][]string{
8182 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008183 "foo.bar",
8184 },
8185 },
8186 },
8187 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008188 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008189 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 +01008190 bp: `
8191 java_library {
8192 name: "bcp_lib1",
8193 srcs: ["lib1/src/*.java"],
8194 apex_available: ["myapex"],
8195 permitted_packages: ["foo.bar"],
8196 sdk_version: "none",
8197 system_modules: "none",
8198 }
8199 java_library {
8200 name: "bcp_lib2",
8201 srcs: ["lib2/src/*.java"],
8202 apex_available: ["myapex"],
8203 permitted_packages: ["foo.bar", "bar.baz"],
8204 sdk_version: "none",
8205 system_modules: "none",
8206 }
8207 apex {
8208 name: "myapex",
8209 key: "myapex.key",
8210 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008211 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008212 }
8213 `,
8214 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008215 bcpPermittedPackages: map[string][]string{
8216 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008217 "foo.bar",
8218 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008219 "bcp_lib2": []string{
8220 "foo.bar",
8221 },
8222 },
8223 },
8224 {
8225 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8226 expectedError: "",
8227 bp: `
8228 java_library {
8229 name: "bcp_lib_restricted",
8230 srcs: ["lib1/src/*.java"],
8231 apex_available: ["myapex"],
8232 permitted_packages: ["foo.bar"],
8233 sdk_version: "none",
8234 min_sdk_version: "29",
8235 system_modules: "none",
8236 }
8237 java_library {
8238 name: "bcp_lib_unrestricted",
8239 srcs: ["lib2/src/*.java"],
8240 apex_available: ["myapex"],
8241 permitted_packages: ["foo.bar", "bar.baz"],
8242 sdk_version: "none",
8243 min_sdk_version: "29",
8244 system_modules: "none",
8245 }
8246 apex {
8247 name: "myapex",
8248 key: "myapex.key",
8249 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8250 updatable: true,
8251 min_sdk_version: "29",
8252 }
8253 `,
8254 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8255 bcpPermittedPackages: map[string][]string{
8256 "bcp_lib1_non_updateable": []string{
8257 "foo.bar",
8258 },
8259 // 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 +01008260 },
8261 },
8262 }
8263 for _, tc := range testcases {
8264 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008265 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8266 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008267 })
8268 }
8269}
8270
Jiyong Park62304bb2020-04-13 16:19:48 +09008271func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008272 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008273 apex {
8274 name: "myapex",
8275 key: "myapex.key",
8276 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008277 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008278 }
8279
8280 apex_key {
8281 name: "myapex.key",
8282 public_key: "testkey.avbpubkey",
8283 private_key: "testkey.pem",
8284 }
8285
8286 cc_library {
8287 name: "mylib",
8288 srcs: ["mylib.cpp"],
8289 system_shared_libs: [],
8290 stl: "none",
8291 stubs: {
8292 versions: ["1"],
8293 },
8294 apex_available: ["myapex"],
8295 }
8296
8297 cc_library {
8298 name: "myprivlib",
8299 srcs: ["mylib.cpp"],
8300 system_shared_libs: [],
8301 stl: "none",
8302 apex_available: ["myapex"],
8303 }
8304
8305
8306 cc_test {
8307 name: "mytest",
8308 gtest: false,
8309 srcs: ["mylib.cpp"],
8310 system_shared_libs: [],
8311 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008312 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008313 test_for: ["myapex"]
8314 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008315
8316 cc_library {
8317 name: "mytestlib",
8318 srcs: ["mylib.cpp"],
8319 system_shared_libs: [],
8320 shared_libs: ["mylib", "myprivlib"],
8321 stl: "none",
8322 test_for: ["myapex"],
8323 }
8324
8325 cc_benchmark {
8326 name: "mybench",
8327 srcs: ["mylib.cpp"],
8328 system_shared_libs: [],
8329 shared_libs: ["mylib", "myprivlib"],
8330 stl: "none",
8331 test_for: ["myapex"],
8332 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008333 `)
8334
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008335 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008336 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008337 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8338 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8339 }
8340
8341 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008342 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008343 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8344 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8345 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8346}
Jiyong Park46a512f2020-12-04 18:02:13 +09008347
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008348func TestIndirectTestFor(t *testing.T) {
8349 ctx := testApex(t, `
8350 apex {
8351 name: "myapex",
8352 key: "myapex.key",
8353 native_shared_libs: ["mylib", "myprivlib"],
8354 updatable: false,
8355 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008356
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008357 apex_key {
8358 name: "myapex.key",
8359 public_key: "testkey.avbpubkey",
8360 private_key: "testkey.pem",
8361 }
8362
8363 cc_library {
8364 name: "mylib",
8365 srcs: ["mylib.cpp"],
8366 system_shared_libs: [],
8367 stl: "none",
8368 stubs: {
8369 versions: ["1"],
8370 },
8371 apex_available: ["myapex"],
8372 }
8373
8374 cc_library {
8375 name: "myprivlib",
8376 srcs: ["mylib.cpp"],
8377 system_shared_libs: [],
8378 stl: "none",
8379 shared_libs: ["mylib"],
8380 apex_available: ["myapex"],
8381 }
8382
8383 cc_library {
8384 name: "mytestlib",
8385 srcs: ["mylib.cpp"],
8386 system_shared_libs: [],
8387 shared_libs: ["myprivlib"],
8388 stl: "none",
8389 test_for: ["myapex"],
8390 }
8391 `)
8392
8393 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008394 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008395 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8396 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8397 }
8398
8399 // The platform variant of mytestlib links to the platform variant of the
8400 // internal myprivlib.
8401 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8402
8403 // The platform variant of myprivlib links to the platform variant of mylib
8404 // and bypasses its stubs.
8405 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 +09008406}
8407
Martin Stjernholmec009002021-03-27 15:18:31 +00008408func TestTestForForLibInOtherApex(t *testing.T) {
8409 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8410 _ = testApex(t, `
8411 apex {
8412 name: "com.android.art",
8413 key: "myapex.key",
8414 native_shared_libs: ["mylib"],
8415 updatable: false,
8416 }
8417
8418 apex {
8419 name: "com.android.art.debug",
8420 key: "myapex.key",
8421 native_shared_libs: ["mylib", "mytestlib"],
8422 updatable: false,
8423 }
8424
8425 apex_key {
8426 name: "myapex.key",
8427 public_key: "testkey.avbpubkey",
8428 private_key: "testkey.pem",
8429 }
8430
8431 cc_library {
8432 name: "mylib",
8433 srcs: ["mylib.cpp"],
8434 system_shared_libs: [],
8435 stl: "none",
8436 stubs: {
8437 versions: ["1"],
8438 },
8439 apex_available: ["com.android.art", "com.android.art.debug"],
8440 }
8441
8442 cc_library {
8443 name: "mytestlib",
8444 srcs: ["mylib.cpp"],
8445 system_shared_libs: [],
8446 shared_libs: ["mylib"],
8447 stl: "none",
8448 apex_available: ["com.android.art.debug"],
8449 test_for: ["com.android.art"],
8450 }
8451 `,
8452 android.MockFS{
8453 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8454 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8455 }.AddToFixture())
8456}
8457
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008458// TODO(jungjw): Move this to proptools
8459func intPtr(i int) *int {
8460 return &i
8461}
8462
8463func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008464 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008465 apex_set {
8466 name: "myapex",
8467 set: "myapex.apks",
8468 filename: "foo_v2.apex",
8469 overrides: ["foo"],
8470 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008471 `,
8472 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8473 variables.Platform_sdk_version = intPtr(30)
8474 }),
8475 android.FixtureModifyConfig(func(config android.Config) {
8476 config.Targets[android.Android] = []android.Target{
8477 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8478 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8479 }
8480 }),
8481 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008482
Paul Duffin24704672021-04-06 16:09:30 +01008483 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008484
8485 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008486 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008487 actual := extractedApex.Args["abis"]
8488 expected := "ARMEABI_V7A,ARM64_V8A"
8489 if actual != expected {
8490 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8491 }
8492 actual = extractedApex.Args["sdk-version"]
8493 expected = "30"
8494 if actual != expected {
8495 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8496 }
8497
Paul Duffin6717d882021-06-15 19:09:41 +01008498 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008499 a := m.Module().(*ApexSet)
8500 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008501 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008502 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8503 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8504 }
8505}
8506
Anton Hansson805e0a52022-11-25 14:06:46 +00008507func TestApexSet_NativeBridge(t *testing.T) {
8508 ctx := testApex(t, `
8509 apex_set {
8510 name: "myapex",
8511 set: "myapex.apks",
8512 filename: "foo_v2.apex",
8513 overrides: ["foo"],
8514 }
8515 `,
8516 android.FixtureModifyConfig(func(config android.Config) {
8517 config.Targets[android.Android] = []android.Target{
8518 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8519 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8520 }
8521 }),
8522 )
8523
8524 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8525
8526 // Check extract_apks tool parameters. No native bridge arch expected
8527 extractedApex := m.Output("extracted/myapex.apks")
8528 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8529}
8530
Jiyong Park7d95a512020-05-10 15:16:24 +09008531func TestNoStaticLinkingToStubsLib(t *testing.T) {
8532 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8533 apex {
8534 name: "myapex",
8535 key: "myapex.key",
8536 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008537 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008538 }
8539
8540 apex_key {
8541 name: "myapex.key",
8542 public_key: "testkey.avbpubkey",
8543 private_key: "testkey.pem",
8544 }
8545
8546 cc_library {
8547 name: "mylib",
8548 srcs: ["mylib.cpp"],
8549 static_libs: ["otherlib"],
8550 system_shared_libs: [],
8551 stl: "none",
8552 apex_available: [ "myapex" ],
8553 }
8554
8555 cc_library {
8556 name: "otherlib",
8557 srcs: ["mylib.cpp"],
8558 system_shared_libs: [],
8559 stl: "none",
8560 stubs: {
8561 versions: ["1", "2", "3"],
8562 },
8563 apex_available: [ "myapex" ],
8564 }
8565 `)
8566}
8567
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008568func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008569 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008570 apex {
8571 name: "myapex",
8572 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008573 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008574 custom_sign_tool: "sign_myapex",
8575 }
8576
8577 apex_key {
8578 name: "myapex.key",
8579 public_key: "testkey.avbpubkey",
8580 private_key: "testkey.pem",
8581 }
8582 `)
8583
8584 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8585 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8586 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"`)
8587}
8588
8589func TestApexKeysTxtOverrides(t *testing.T) {
8590 ctx := testApex(t, `
8591 apex {
8592 name: "myapex",
8593 key: "myapex.key",
8594 updatable: false,
8595 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008596 }
8597
8598 apex_key {
8599 name: "myapex.key",
8600 public_key: "testkey.avbpubkey",
8601 private_key: "testkey.pem",
8602 }
8603
8604 prebuilt_apex {
8605 name: "myapex",
8606 prefer: true,
8607 arch: {
8608 arm64: {
8609 src: "myapex-arm64.apex",
8610 },
8611 arm: {
8612 src: "myapex-arm.apex",
8613 },
8614 },
8615 }
8616
8617 apex_set {
8618 name: "myapex_set",
8619 set: "myapex.apks",
8620 filename: "myapex_set.apex",
8621 overrides: ["myapex"],
8622 }
8623 `)
8624
8625 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8626 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8627 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 +09008628 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 +09008629}
8630
Jooyung Han938b5932020-06-20 12:47:47 +09008631func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008632 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008633 apex {
8634 name: "myapex",
8635 key: "myapex.key",
8636 apps: ["app"],
8637 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008638 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008639 }
8640
8641 apex_key {
8642 name: "myapex.key",
8643 public_key: "testkey.avbpubkey",
8644 private_key: "testkey.pem",
8645 }
8646
8647 android_app {
8648 name: "app",
8649 srcs: ["foo/bar/MyClass.java"],
8650 package_name: "foo",
8651 sdk_version: "none",
8652 system_modules: "none",
8653 apex_available: [ "myapex" ],
8654 }
8655 `, withFiles(map[string][]byte{
8656 "sub/Android.bp": []byte(`
8657 override_apex {
8658 name: "override_myapex",
8659 base: "myapex",
8660 apps: ["override_app"],
8661 allowed_files: ":allowed",
8662 }
8663 // Overridable "path" property should be referenced indirectly
8664 filegroup {
8665 name: "allowed",
8666 srcs: ["allowed.txt"],
8667 }
8668 override_android_app {
8669 name: "override_app",
8670 base: "app",
8671 package_name: "bar",
8672 }
8673 `),
8674 }))
8675
8676 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8677 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8678 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8679 }
8680
8681 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8682 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8683 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8684 }
8685}
8686
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008687func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008688 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008689 apex {
8690 name: "myapex",
8691 key: "myapex.key",
8692 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008693 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008694 }
8695
8696 apex_key {
8697 name: "myapex.key",
8698 public_key: "testkey.avbpubkey",
8699 private_key: "testkey.pem",
8700 }
8701
8702 cc_library {
8703 name: "mylib",
8704 srcs: ["mylib.cpp"],
8705 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008706 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008707 },
8708 apex_available: ["myapex"],
8709 }
8710
8711 cc_prebuilt_library_shared {
8712 name: "mylib",
8713 prefer: false,
8714 srcs: ["prebuilt.so"],
8715 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008716 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008717 },
8718 apex_available: ["myapex"],
8719 }
8720 `)
8721}
8722
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008723func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008724 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008725 apex {
8726 name: "myapex",
8727 key: "myapex.key",
8728 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008729 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008730 }
8731 apex_key {
8732 name: "myapex.key",
8733 public_key: "testkey.avbpubkey",
8734 private_key: "testkey.pem",
8735 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008736 `,
8737 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8738 variables.CompressedApex = proptools.BoolPtr(true)
8739 }),
8740 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008741
8742 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8743 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8744
8745 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8746 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8747
8748 // Make sure output of bundle is .capex
8749 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8750 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8751
8752 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008753 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008754 var builder strings.Builder
8755 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8756 androidMk := builder.String()
8757 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8758}
8759
Martin Stjernholm2856c662020-12-02 15:03:42 +00008760func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008761 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008762 apex {
8763 name: "myapex",
8764 key: "myapex.key",
8765 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008766 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008767 }
8768
8769 apex_key {
8770 name: "myapex.key",
8771 public_key: "testkey.avbpubkey",
8772 private_key: "testkey.pem",
8773 }
8774
8775 cc_library {
8776 name: "mylib",
8777 srcs: ["mylib.cpp"],
8778 apex_available: ["myapex"],
8779 shared_libs: ["otherlib"],
8780 system_shared_libs: [],
8781 }
8782
8783 cc_library {
8784 name: "otherlib",
8785 srcs: ["mylib.cpp"],
8786 stubs: {
8787 versions: ["current"],
8788 },
8789 }
8790
8791 cc_prebuilt_library_shared {
8792 name: "otherlib",
8793 prefer: true,
8794 srcs: ["prebuilt.so"],
8795 stubs: {
8796 versions: ["current"],
8797 },
8798 }
8799 `)
8800
8801 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008802 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008803 var builder strings.Builder
8804 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8805 androidMk := builder.String()
8806
8807 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8808 // a thing there.
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008809 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 +00008810}
8811
Jiyong Parke3867542020-12-03 17:28:25 +09008812func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008813 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008814 apex {
8815 name: "myapex",
8816 key: "myapex.key",
8817 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008818 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008819 }
8820
8821 apex_key {
8822 name: "myapex.key",
8823 public_key: "testkey.avbpubkey",
8824 private_key: "testkey.pem",
8825 }
8826
8827 cc_library {
8828 name: "mylib",
8829 srcs: ["mylib.cpp"],
8830 system_shared_libs: [],
8831 stl: "none",
8832 apex_available: ["myapex"],
8833 shared_libs: ["mylib2"],
8834 target: {
8835 apex: {
8836 exclude_shared_libs: ["mylib2"],
8837 },
8838 },
8839 }
8840
8841 cc_library {
8842 name: "mylib2",
8843 srcs: ["mylib.cpp"],
8844 system_shared_libs: [],
8845 stl: "none",
8846 }
8847 `)
8848
8849 // Check if mylib is linked to mylib2 for the non-apex target
8850 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8851 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8852
8853 // Make sure that the link doesn't occur for the apex target
8854 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8855 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8856
8857 // It shouldn't appear in the copy cmd as well.
8858 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8859 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8860}
8861
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008862func TestPrebuiltStubLibDep(t *testing.T) {
8863 bpBase := `
8864 apex {
8865 name: "myapex",
8866 key: "myapex.key",
8867 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008868 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008869 }
8870 apex_key {
8871 name: "myapex.key",
8872 public_key: "testkey.avbpubkey",
8873 private_key: "testkey.pem",
8874 }
8875 cc_library {
8876 name: "mylib",
8877 srcs: ["mylib.cpp"],
8878 apex_available: ["myapex"],
8879 shared_libs: ["stublib"],
8880 system_shared_libs: [],
8881 }
8882 apex {
8883 name: "otherapex",
8884 enabled: %s,
8885 key: "myapex.key",
8886 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008887 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008888 }
8889 `
8890
8891 stublibSourceBp := `
8892 cc_library {
8893 name: "stublib",
8894 srcs: ["mylib.cpp"],
8895 apex_available: ["otherapex"],
8896 system_shared_libs: [],
8897 stl: "none",
8898 stubs: {
8899 versions: ["1"],
8900 },
8901 }
8902 `
8903
8904 stublibPrebuiltBp := `
8905 cc_prebuilt_library_shared {
8906 name: "stublib",
8907 srcs: ["prebuilt.so"],
8908 apex_available: ["otherapex"],
8909 stubs: {
8910 versions: ["1"],
8911 },
8912 %s
8913 }
8914 `
8915
8916 tests := []struct {
8917 name string
8918 stublibBp string
8919 usePrebuilt bool
8920 modNames []string // Modules to collect AndroidMkEntries for
8921 otherApexEnabled []string
8922 }{
8923 {
8924 name: "only_source",
8925 stublibBp: stublibSourceBp,
8926 usePrebuilt: false,
8927 modNames: []string{"stublib"},
8928 otherApexEnabled: []string{"true", "false"},
8929 },
8930 {
8931 name: "source_preferred",
8932 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8933 usePrebuilt: false,
8934 modNames: []string{"stublib", "prebuilt_stublib"},
8935 otherApexEnabled: []string{"true", "false"},
8936 },
8937 {
8938 name: "prebuilt_preferred",
8939 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8940 usePrebuilt: true,
8941 modNames: []string{"stublib", "prebuilt_stublib"},
8942 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8943 },
8944 {
8945 name: "only_prebuilt",
8946 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8947 usePrebuilt: true,
8948 modNames: []string{"stublib"},
8949 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8950 },
8951 }
8952
8953 for _, test := range tests {
8954 t.Run(test.name, func(t *testing.T) {
8955 for _, otherApexEnabled := range test.otherApexEnabled {
8956 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008957 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008958
8959 type modAndMkEntries struct {
8960 mod *cc.Module
8961 mkEntries android.AndroidMkEntries
8962 }
8963 entries := []*modAndMkEntries{}
8964
8965 // Gather shared lib modules that are installable
8966 for _, modName := range test.modNames {
8967 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8968 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8969 continue
8970 }
8971 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008972 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008973 continue
8974 }
Colin Crossaa255532020-07-03 13:18:24 -07008975 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008976 if ent.Disabled {
8977 continue
8978 }
8979 entries = append(entries, &modAndMkEntries{
8980 mod: mod,
8981 mkEntries: ent,
8982 })
8983 }
8984 }
8985 }
8986
8987 var entry *modAndMkEntries = nil
8988 for _, ent := range entries {
8989 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8990 if entry != nil {
8991 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8992 } else {
8993 entry = ent
8994 }
8995 }
8996 }
8997
8998 if entry == nil {
8999 t.Errorf("AndroidMk entry for \"stublib\" missing")
9000 } else {
9001 isPrebuilt := entry.mod.Prebuilt() != nil
9002 if isPrebuilt != test.usePrebuilt {
9003 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9004 }
9005 if !entry.mod.IsStubs() {
9006 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9007 }
9008 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9009 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9010 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009011 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009012 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009013 if !android.InList(expected, cflags) {
9014 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9015 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009016 }
9017 })
9018 }
9019 })
9020 }
9021}
9022
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009023func TestHostApexInHostOnlyBuild(t *testing.T) {
9024 testApex(t, `
9025 apex {
9026 name: "myapex",
9027 host_supported: true,
9028 key: "myapex.key",
9029 updatable: false,
9030 payload_type: "zip",
9031 }
9032 apex_key {
9033 name: "myapex.key",
9034 public_key: "testkey.avbpubkey",
9035 private_key: "testkey.pem",
9036 }
9037 `,
9038 android.FixtureModifyConfig(func(config android.Config) {
9039 // We may not have device targets in all builds, e.g. in
9040 // prebuilts/build-tools/build-prebuilts.sh
9041 config.Targets[android.Android] = []android.Target{}
9042 }))
9043}
9044
Colin Crossc33e5212021-05-25 18:16:02 -07009045func TestApexJavaCoverage(t *testing.T) {
9046 bp := `
9047 apex {
9048 name: "myapex",
9049 key: "myapex.key",
9050 java_libs: ["mylib"],
9051 bootclasspath_fragments: ["mybootclasspathfragment"],
9052 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9053 updatable: false,
9054 }
9055
9056 apex_key {
9057 name: "myapex.key",
9058 public_key: "testkey.avbpubkey",
9059 private_key: "testkey.pem",
9060 }
9061
9062 java_library {
9063 name: "mylib",
9064 srcs: ["mylib.java"],
9065 apex_available: ["myapex"],
9066 compile_dex: true,
9067 }
9068
9069 bootclasspath_fragment {
9070 name: "mybootclasspathfragment",
9071 contents: ["mybootclasspathlib"],
9072 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009073 hidden_api: {
9074 split_packages: ["*"],
9075 },
Colin Crossc33e5212021-05-25 18:16:02 -07009076 }
9077
9078 java_library {
9079 name: "mybootclasspathlib",
9080 srcs: ["mybootclasspathlib.java"],
9081 apex_available: ["myapex"],
9082 compile_dex: true,
9083 }
9084
9085 systemserverclasspath_fragment {
9086 name: "mysystemserverclasspathfragment",
9087 contents: ["mysystemserverclasspathlib"],
9088 apex_available: ["myapex"],
9089 }
9090
9091 java_library {
9092 name: "mysystemserverclasspathlib",
9093 srcs: ["mysystemserverclasspathlib.java"],
9094 apex_available: ["myapex"],
9095 compile_dex: true,
9096 }
9097 `
9098
9099 result := android.GroupFixturePreparers(
9100 PrepareForTestWithApexBuildComponents,
9101 prepareForTestWithMyapex,
9102 java.PrepareForTestWithJavaDefaultModules,
9103 android.PrepareForTestWithAndroidBuildComponents,
9104 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009105 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9106 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009107 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009108 ).RunTest(t)
9109
9110 // Make sure jacoco ran on both mylib and mybootclasspathlib
9111 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9112 t.Errorf("Failed to find jacoco rule for mylib")
9113 }
9114 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9115 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9116 }
9117 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9118 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9119 }
9120}
9121
Jiyong Park192600a2021-08-03 07:52:17 +00009122func TestProhibitStaticExecutable(t *testing.T) {
9123 testApexError(t, `executable mybin is static`, `
9124 apex {
9125 name: "myapex",
9126 key: "myapex.key",
9127 binaries: ["mybin"],
9128 min_sdk_version: "29",
9129 }
9130
9131 apex_key {
9132 name: "myapex.key",
9133 public_key: "testkey.avbpubkey",
9134 private_key: "testkey.pem",
9135 }
9136
9137 cc_binary {
9138 name: "mybin",
9139 srcs: ["mylib.cpp"],
9140 relative_install_path: "foo/bar",
9141 static_executable: true,
9142 system_shared_libs: [],
9143 stl: "none",
9144 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009145 min_sdk_version: "29",
9146 }
9147 `)
9148
9149 testApexError(t, `executable mybin.rust is static`, `
9150 apex {
9151 name: "myapex",
9152 key: "myapex.key",
9153 binaries: ["mybin.rust"],
9154 min_sdk_version: "29",
9155 }
9156
9157 apex_key {
9158 name: "myapex.key",
9159 public_key: "testkey.avbpubkey",
9160 private_key: "testkey.pem",
9161 }
9162
9163 rust_binary {
9164 name: "mybin.rust",
9165 srcs: ["foo.rs"],
9166 static_executable: true,
9167 apex_available: ["myapex"],
9168 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009169 }
9170 `)
9171}
9172
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009173func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9174 ctx := testApex(t, `
9175 apex {
9176 name: "myapex",
9177 key: "myapex.key",
9178 updatable: false,
9179 java_libs: ["foo"],
9180 }
9181
9182 apex_key {
9183 name: "myapex.key",
9184 public_key: "testkey.avbpubkey",
9185 private_key: "testkey.pem",
9186 }
9187
9188 java_library {
9189 name: "foo",
9190 srcs: ["foo.java"],
9191 apex_available: ["myapex"],
9192 installable: true,
9193 }
9194 `,
9195 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9196 )
9197
9198 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9199 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9200 var builder strings.Builder
9201 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9202 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009203 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 +00009204}
9205
9206func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9207 ctx := testApex(t, `
9208 prebuilt_apex {
9209 name: "myapex",
9210 arch: {
9211 arm64: {
9212 src: "myapex-arm64.apex",
9213 },
9214 arm: {
9215 src: "myapex-arm.apex",
9216 },
9217 },
9218 exported_java_libs: ["foo"],
9219 }
9220
9221 java_import {
9222 name: "foo",
9223 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009224 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009225 }
9226 `,
9227 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9228 )
9229
9230 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9231 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9232 mainModuleEntries := entriesList[0]
9233 android.AssertArrayString(t,
9234 "LOCAL_REQUIRED_MODULES",
9235 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9236 []string{
9237 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9238 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9239 })
9240}
9241
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009242func TestAndroidMk_RequiredModules(t *testing.T) {
9243 ctx := testApex(t, `
9244 apex {
9245 name: "myapex",
9246 key: "myapex.key",
9247 updatable: false,
9248 java_libs: ["foo"],
9249 required: ["otherapex"],
9250 }
9251
9252 apex {
9253 name: "otherapex",
9254 key: "myapex.key",
9255 updatable: false,
9256 java_libs: ["foo"],
9257 required: ["otherapex"],
9258 }
9259
9260 apex_key {
9261 name: "myapex.key",
9262 public_key: "testkey.avbpubkey",
9263 private_key: "testkey.pem",
9264 }
9265
9266 java_library {
9267 name: "foo",
9268 srcs: ["foo.java"],
9269 apex_available: ["myapex", "otherapex"],
9270 installable: true,
9271 }
9272 `)
9273
9274 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9275 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9276 var builder strings.Builder
9277 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9278 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009279 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009280}
9281
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009282func TestAndroidMk_RequiredDeps(t *testing.T) {
9283 ctx := testApex(t, `
9284 apex {
9285 name: "myapex",
9286 key: "myapex.key",
9287 updatable: false,
9288 }
9289
9290 apex_key {
9291 name: "myapex.key",
9292 public_key: "testkey.avbpubkey",
9293 private_key: "testkey.pem",
9294 }
9295 `)
9296
9297 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009298 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009299 data := android.AndroidMkDataForTest(t, ctx, bundle)
9300 var builder strings.Builder
9301 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9302 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009303 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009304
9305 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009306 flattenedBundle.makeModulesToInstall = append(flattenedBundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009307 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9308 var flattenedBuilder strings.Builder
9309 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9310 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009311 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009312}
9313
Jooyung Hana6d36672022-02-24 13:58:07 +09009314func TestApexOutputFileProducer(t *testing.T) {
9315 for _, tc := range []struct {
9316 name string
9317 ref string
9318 expected_data []string
9319 }{
9320 {
9321 name: "test_using_output",
9322 ref: ":myapex",
9323 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9324 },
9325 {
9326 name: "test_using_apex",
9327 ref: ":myapex{.apex}",
9328 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9329 },
9330 } {
9331 t.Run(tc.name, func(t *testing.T) {
9332 ctx := testApex(t, `
9333 apex {
9334 name: "myapex",
9335 key: "myapex.key",
9336 compressible: true,
9337 updatable: false,
9338 }
9339
9340 apex_key {
9341 name: "myapex.key",
9342 public_key: "testkey.avbpubkey",
9343 private_key: "testkey.pem",
9344 }
9345
9346 java_test {
9347 name: "`+tc.name+`",
9348 srcs: ["a.java"],
9349 data: ["`+tc.ref+`"],
9350 }
9351 `,
9352 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9353 variables.CompressedApex = proptools.BoolPtr(true)
9354 }))
9355 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9356 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9357 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9358 })
9359 }
9360}
9361
satayev758968a2021-12-06 11:42:40 +00009362func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9363 preparer := android.GroupFixturePreparers(
9364 PrepareForTestWithApexBuildComponents,
9365 prepareForTestWithMyapex,
9366 java.PrepareForTestWithJavaSdkLibraryFiles,
9367 java.PrepareForTestWithJavaDefaultModules,
9368 android.PrepareForTestWithAndroidBuildComponents,
9369 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9370 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9371 )
9372
9373 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9374 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9375 preparer.RunTestWithBp(t, `
9376 apex {
9377 name: "myapex",
9378 key: "myapex.key",
9379 bootclasspath_fragments: ["mybootclasspathfragment"],
9380 min_sdk_version: "30",
9381 updatable: false,
9382 }
9383
9384 apex_key {
9385 name: "myapex.key",
9386 public_key: "testkey.avbpubkey",
9387 private_key: "testkey.pem",
9388 }
9389
9390 bootclasspath_fragment {
9391 name: "mybootclasspathfragment",
9392 contents: ["mybootclasspathlib"],
9393 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009394 hidden_api: {
9395 split_packages: ["*"],
9396 },
satayev758968a2021-12-06 11:42:40 +00009397 }
9398
9399 java_sdk_library {
9400 name: "mybootclasspathlib",
9401 srcs: ["mybootclasspathlib.java"],
9402 apex_available: ["myapex"],
9403 compile_dex: true,
9404 unsafe_ignore_missing_latest_api: true,
9405 min_sdk_version: "31",
9406 static_libs: ["util"],
9407 }
9408
9409 java_library {
9410 name: "util",
9411 srcs: ["a.java"],
9412 apex_available: ["myapex"],
9413 min_sdk_version: "31",
9414 static_libs: ["another_util"],
9415 }
9416
9417 java_library {
9418 name: "another_util",
9419 srcs: ["a.java"],
9420 min_sdk_version: "31",
9421 apex_available: ["myapex"],
9422 }
9423 `)
9424 })
9425
9426 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9427 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9428 preparer.RunTestWithBp(t, `
9429 apex {
9430 name: "myapex",
9431 key: "myapex.key",
9432 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9433 min_sdk_version: "30",
9434 updatable: false,
9435 }
9436
9437 apex_key {
9438 name: "myapex.key",
9439 public_key: "testkey.avbpubkey",
9440 private_key: "testkey.pem",
9441 }
9442
9443 systemserverclasspath_fragment {
9444 name: "mysystemserverclasspathfragment",
9445 contents: ["mysystemserverclasspathlib"],
9446 apex_available: ["myapex"],
9447 }
9448
9449 java_sdk_library {
9450 name: "mysystemserverclasspathlib",
9451 srcs: ["mysystemserverclasspathlib.java"],
9452 apex_available: ["myapex"],
9453 compile_dex: true,
9454 min_sdk_version: "32",
9455 unsafe_ignore_missing_latest_api: true,
9456 static_libs: ["util"],
9457 }
9458
9459 java_library {
9460 name: "util",
9461 srcs: ["a.java"],
9462 apex_available: ["myapex"],
9463 min_sdk_version: "31",
9464 static_libs: ["another_util"],
9465 }
9466
9467 java_library {
9468 name: "another_util",
9469 srcs: ["a.java"],
9470 min_sdk_version: "31",
9471 apex_available: ["myapex"],
9472 }
9473 `)
9474 })
9475
9476 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9477 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9478 RunTestWithBp(t, `
9479 apex {
9480 name: "myapex",
9481 key: "myapex.key",
9482 bootclasspath_fragments: ["mybootclasspathfragment"],
9483 min_sdk_version: "30",
9484 updatable: false,
9485 }
9486
9487 apex_key {
9488 name: "myapex.key",
9489 public_key: "testkey.avbpubkey",
9490 private_key: "testkey.pem",
9491 }
9492
9493 bootclasspath_fragment {
9494 name: "mybootclasspathfragment",
9495 contents: ["mybootclasspathlib"],
9496 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009497 hidden_api: {
9498 split_packages: ["*"],
9499 },
satayev758968a2021-12-06 11:42:40 +00009500 }
9501
9502 java_sdk_library {
9503 name: "mybootclasspathlib",
9504 srcs: ["mybootclasspathlib.java"],
9505 apex_available: ["myapex"],
9506 compile_dex: true,
9507 unsafe_ignore_missing_latest_api: true,
9508 }
9509 `)
9510 })
9511
9512 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9513 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9514 RunTestWithBp(t, `
9515 apex {
9516 name: "myapex",
9517 key: "myapex.key",
9518 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9519 min_sdk_version: "30",
9520 updatable: false,
9521 }
9522
9523 apex_key {
9524 name: "myapex.key",
9525 public_key: "testkey.avbpubkey",
9526 private_key: "testkey.pem",
9527 }
9528
9529 systemserverclasspath_fragment {
9530 name: "mysystemserverclasspathfragment",
9531 contents: ["mysystemserverclasspathlib"],
9532 apex_available: ["myapex"],
9533 }
9534
9535 java_sdk_library {
9536 name: "mysystemserverclasspathlib",
9537 srcs: ["mysystemserverclasspathlib.java"],
9538 apex_available: ["myapex"],
9539 compile_dex: true,
9540 unsafe_ignore_missing_latest_api: true,
9541 }
9542 `)
9543 })
9544}
9545
Jiakai Zhang6decef92022-01-12 17:56:19 +00009546// Verifies that the APEX depends on all the Make modules in the list.
9547func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9548 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9549 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009550 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009551 }
9552}
9553
9554// Verifies that the APEX does not depend on any of the Make modules in the list.
9555func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9556 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9557 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009558 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009559 }
9560}
9561
Spandan Das66773252022-01-15 00:23:18 +00009562func TestApexStrictUpdtabilityLint(t *testing.T) {
9563 bpTemplate := `
9564 apex {
9565 name: "myapex",
9566 key: "myapex.key",
9567 java_libs: ["myjavalib"],
9568 updatable: %v,
9569 min_sdk_version: "29",
9570 }
9571 apex_key {
9572 name: "myapex.key",
9573 }
9574 java_library {
9575 name: "myjavalib",
9576 srcs: ["MyClass.java"],
9577 apex_available: [ "myapex" ],
9578 lint: {
9579 strict_updatability_linting: %v,
9580 },
9581 sdk_version: "current",
9582 min_sdk_version: "29",
9583 }
9584 `
9585 fs := android.MockFS{
9586 "lint-baseline.xml": nil,
9587 }
9588
9589 testCases := []struct {
9590 testCaseName string
9591 apexUpdatable bool
9592 javaStrictUpdtabilityLint bool
9593 lintFileExists bool
9594 disallowedFlagExpected bool
9595 }{
9596 {
9597 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9598 apexUpdatable: true,
9599 javaStrictUpdtabilityLint: true,
9600 lintFileExists: false,
9601 disallowedFlagExpected: false,
9602 },
9603 {
9604 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9605 apexUpdatable: false,
9606 javaStrictUpdtabilityLint: false,
9607 lintFileExists: true,
9608 disallowedFlagExpected: false,
9609 },
9610 {
9611 testCaseName: "non-updatable apex respects strict updatability of javalib",
9612 apexUpdatable: false,
9613 javaStrictUpdtabilityLint: true,
9614 lintFileExists: true,
9615 disallowedFlagExpected: true,
9616 },
9617 {
9618 testCaseName: "updatable apex sets strict updatability of javalib to true",
9619 apexUpdatable: true,
9620 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9621 lintFileExists: true,
9622 disallowedFlagExpected: true,
9623 },
9624 }
9625
9626 for _, testCase := range testCases {
9627 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9628 fixtures := []android.FixturePreparer{}
9629 if testCase.lintFileExists {
9630 fixtures = append(fixtures, fs.AddToFixture())
9631 }
9632
9633 result := testApex(t, bp, fixtures...)
9634 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9635 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9636 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9637
9638 if disallowedFlagActual != testCase.disallowedFlagExpected {
9639 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9640 }
9641 }
9642}
9643
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009644func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9645 bp := `
9646 apex {
9647 name: "myapex",
9648 key: "myapex.key",
9649 java_libs: ["myjavalib"],
9650 updatable: true,
9651 min_sdk_version: "29",
9652 }
9653 apex_key {
9654 name: "myapex.key",
9655 }
9656 java_library {
9657 name: "myjavalib",
9658 srcs: ["MyClass.java"],
9659 apex_available: [ "myapex" ],
9660 sdk_version: "current",
9661 min_sdk_version: "29",
9662 }
9663 `
9664
9665 testCases := []struct {
9666 testCaseName string
9667 moduleDirectory string
9668 disallowedFlagExpected bool
9669 }{
9670 {
9671 testCaseName: "lintable module defined outside libcore",
9672 moduleDirectory: "",
9673 disallowedFlagExpected: true,
9674 },
9675 {
9676 testCaseName: "lintable module defined in libcore root directory",
9677 moduleDirectory: "libcore/",
9678 disallowedFlagExpected: false,
9679 },
9680 {
9681 testCaseName: "lintable module defined in libcore child directory",
9682 moduleDirectory: "libcore/childdir/",
9683 disallowedFlagExpected: true,
9684 },
9685 }
9686
9687 for _, testCase := range testCases {
9688 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9689 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9690 result := testApex(t, "", lintFileCreator, bpFileCreator)
9691 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9692 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9693 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9694 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9695
9696 if disallowedFlagActual != testCase.disallowedFlagExpected {
9697 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9698 }
9699 }
9700}
9701
Spandan Das66773252022-01-15 00:23:18 +00009702// checks transtive deps of an apex coming from bootclasspath_fragment
9703func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9704 bp := `
9705 apex {
9706 name: "myapex",
9707 key: "myapex.key",
9708 bootclasspath_fragments: ["mybootclasspathfragment"],
9709 updatable: true,
9710 min_sdk_version: "29",
9711 }
9712 apex_key {
9713 name: "myapex.key",
9714 }
9715 bootclasspath_fragment {
9716 name: "mybootclasspathfragment",
9717 contents: ["myjavalib"],
9718 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009719 hidden_api: {
9720 split_packages: ["*"],
9721 },
Spandan Das66773252022-01-15 00:23:18 +00009722 }
9723 java_library {
9724 name: "myjavalib",
9725 srcs: ["MyClass.java"],
9726 apex_available: [ "myapex" ],
9727 sdk_version: "current",
9728 min_sdk_version: "29",
9729 compile_dex: true,
9730 }
9731 `
9732 fs := android.MockFS{
9733 "lint-baseline.xml": nil,
9734 }
9735
9736 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9737 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9738 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9739 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9740 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9741 }
9742}
9743
Spandan Das42e89502022-05-06 22:12:55 +00009744// updatable apexes should propagate updatable=true to its apps
9745func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9746 bp := `
9747 apex {
9748 name: "myapex",
9749 key: "myapex.key",
9750 updatable: %v,
9751 apps: [
9752 "myapp",
9753 ],
9754 min_sdk_version: "30",
9755 }
9756 apex_key {
9757 name: "myapex.key",
9758 }
9759 android_app {
9760 name: "myapp",
9761 updatable: %v,
9762 apex_available: [
9763 "myapex",
9764 ],
9765 sdk_version: "current",
9766 min_sdk_version: "30",
9767 }
9768 `
9769 testCases := []struct {
9770 name string
9771 apex_is_updatable_bp bool
9772 app_is_updatable_bp bool
9773 app_is_updatable_expected bool
9774 }{
9775 {
9776 name: "Non-updatable apex respects updatable property of non-updatable app",
9777 apex_is_updatable_bp: false,
9778 app_is_updatable_bp: false,
9779 app_is_updatable_expected: false,
9780 },
9781 {
9782 name: "Non-updatable apex respects updatable property of updatable app",
9783 apex_is_updatable_bp: false,
9784 app_is_updatable_bp: true,
9785 app_is_updatable_expected: true,
9786 },
9787 {
9788 name: "Updatable apex respects updatable property of updatable app",
9789 apex_is_updatable_bp: true,
9790 app_is_updatable_bp: true,
9791 app_is_updatable_expected: true,
9792 },
9793 {
9794 name: "Updatable apex sets updatable=true on non-updatable app",
9795 apex_is_updatable_bp: true,
9796 app_is_updatable_bp: false,
9797 app_is_updatable_expected: true,
9798 },
9799 }
9800 for _, testCase := range testCases {
9801 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9802 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9803 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9804 }
9805}
9806
Kiyoung Kim487689e2022-07-26 09:48:22 +09009807func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9808 bp := `
9809 apex {
9810 name: "myapex",
9811 key: "myapex.key",
9812 native_shared_libs: ["libfoo"],
9813 min_sdk_version: "29",
9814 }
9815 apex_key {
9816 name: "myapex.key",
9817 }
9818 cc_library {
9819 name: "libfoo",
9820 shared_libs: ["libc"],
9821 apex_available: ["myapex"],
9822 min_sdk_version: "29",
9823 }
9824 cc_api_library {
9825 name: "libc",
9826 src: "libc.so",
9827 min_sdk_version: "29",
9828 recovery_available: true,
9829 }
9830 api_imports {
9831 name: "api_imports",
9832 shared_libs: [
9833 "libc",
9834 ],
9835 header_libs: [],
9836 }
9837 `
9838 result := testApex(t, bp)
9839
9840 hasDep := func(m android.Module, wantDep android.Module) bool {
9841 t.Helper()
9842 var found bool
9843 result.VisitDirectDeps(m, func(dep blueprint.Module) {
9844 if dep == wantDep {
9845 found = true
9846 }
9847 })
9848 return found
9849 }
9850
9851 libfooApexVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex29").Module()
9852 libcApexVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared_apex29").Module()
9853
9854 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(libfooApexVariant, libcApexVariant))
9855
9856 // libfoo core variant should be buildable in the same inner tree since
9857 // certain mcombo files might build system and apexes in the same inner tree
9858 // libfoo core variant should link against source libc
9859 libfooCoreVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module()
9860 libcCoreVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared").Module()
9861 android.AssertBoolEquals(t, "core variant should link against source libc", true, hasDep(libfooCoreVariant, libcCoreVariant))
9862}
Dennis Shend4f5d932023-01-31 20:27:21 +00009863
9864func TestTrimmedApex(t *testing.T) {
9865 bp := `
9866 apex {
9867 name: "myapex",
9868 key: "myapex.key",
9869 native_shared_libs: ["libfoo","libbaz"],
9870 min_sdk_version: "29",
9871 trim_against: "mydcla",
9872 }
9873 apex {
9874 name: "mydcla",
9875 key: "myapex.key",
9876 native_shared_libs: ["libfoo","libbar"],
9877 min_sdk_version: "29",
9878 file_contexts: ":myapex-file_contexts",
9879 dynamic_common_lib_apex: true,
9880 }
9881 apex_key {
9882 name: "myapex.key",
9883 }
9884 cc_library {
9885 name: "libfoo",
9886 shared_libs: ["libc"],
9887 apex_available: ["myapex","mydcla"],
9888 min_sdk_version: "29",
9889 }
9890 cc_library {
9891 name: "libbar",
9892 shared_libs: ["libc"],
9893 apex_available: ["myapex","mydcla"],
9894 min_sdk_version: "29",
9895 }
9896 cc_library {
9897 name: "libbaz",
9898 shared_libs: ["libc"],
9899 apex_available: ["myapex","mydcla"],
9900 min_sdk_version: "29",
9901 }
9902 cc_api_library {
9903 name: "libc",
9904 src: "libc.so",
9905 min_sdk_version: "29",
9906 recovery_available: true,
9907 }
9908 api_imports {
9909 name: "api_imports",
9910 shared_libs: [
9911 "libc",
9912 ],
9913 header_libs: [],
9914 }
9915 `
9916 ctx := testApex(t, bp)
9917 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
9918 apexRule := module.MaybeRule("apexRule")
9919 if apexRule.Rule == nil {
9920 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
9921 }
9922
9923 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
9924 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
9925 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
9926 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
9927 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
9928 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
9929}