blob: 1f33eca706138c14e39f98902eed2b3126d37fa7 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Kiyoung Kim487689e2022-07-26 09:48:22 +090028 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090029 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090036 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090037 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070038 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090039)
40
Jooyung Hand3639552019-08-09 12:57:43 +090041// names returns name list from white space separated string
42func names(s string) (ns []string) {
43 for _, n := range strings.Split(s, " ") {
44 if len(n) > 0 {
45 ns = append(ns, n)
46 }
47 }
48 return
49}
50
Paul Duffin40b62572021-03-20 11:39:01 +000051func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090052 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010053 android.GroupFixturePreparers(
54 prepareForApexTest,
55 android.GroupFixturePreparers(preparers...),
56 ).
Paul Duffine05480a2021-03-08 15:07:14 +000057 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000058 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090059}
60
Paul Duffin40b62572021-03-20 11:39:01 +000061func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090062 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010063
64 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000065 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010066 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000067 }
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 result := android.GroupFixturePreparers(
70 prepareForApexTest,
71 android.GroupFixturePreparers(preparers...),
72 optionalBpPreparer,
73 ).RunTest(t)
74
Paul Duffine05480a2021-03-08 15:07:14 +000075 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090076}
77
Paul Duffin810f33d2021-03-09 14:12:32 +000078func withFiles(files android.MockFS) android.FixturePreparer {
79 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090080}
81
Paul Duffin810f33d2021-03-09 14:12:32 +000082func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
83 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090084 for k, v := range targets {
85 config.Targets[k] = v
86 }
Paul Duffin810f33d2021-03-09 14:12:32 +000087 })
Jooyung Han344d5432019-08-23 11:17:39 +090088}
89
Jooyung Han35155c42020-02-06 17:33:20 +090090// withNativeBridgeTargets sets configuration with targets including:
91// - X86_64 (primary)
92// - X86 (secondary)
93// - Arm64 on X86_64 (native bridge)
94// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000095var withNativeBridgeEnabled = android.FixtureModifyConfig(
96 func(config android.Config) {
97 config.Targets[android.Android] = []android.Target{
98 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
99 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
100 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
101 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
102 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
103 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
104 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
105 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
106 }
107 },
108)
109
110func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
111 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
112 variables.ManifestPackageNameOverrides = specs
113 })
Jooyung Han35155c42020-02-06 17:33:20 +0900114}
115
Albert Martineefabcf2022-03-21 20:11:16 +0000116func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
117 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
118 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
119 })
120}
121
Paul Duffin810f33d2021-03-09 14:12:32 +0000122var withBinder32bit = android.FixtureModifyProductVariables(
123 func(variables android.FixtureProductVariables) {
124 variables.Binder32bit = proptools.BoolPtr(true)
125 },
126)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900127
Paul Duffin810f33d2021-03-09 14:12:32 +0000128var withUnbundledBuild = android.FixtureModifyProductVariables(
129 func(variables android.FixtureProductVariables) {
130 variables.Unbundled_build = proptools.BoolPtr(true)
131 },
132)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900133
Paul Duffin284165a2021-03-29 01:50:31 +0100134// Legacy preparer used for running tests within the apex package.
135//
136// This includes everything that was needed to run any test in the apex package prior to the
137// introduction of the test fixtures. Tests that are being converted to use fixtures directly
138// rather than through the testApex...() methods should avoid using this and instead use the
139// various preparers directly, using android.GroupFixturePreparers(...) to group them when
140// necessary.
141//
142// deprecated
143var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000144 // General preparers in alphabetical order as test infrastructure will enforce correct
145 // registration order.
146 android.PrepareForTestWithAndroidBuildComponents,
147 bpf.PrepareForTestWithBpf,
148 cc.PrepareForTestWithCcBuildComponents,
149 java.PrepareForTestWithJavaDefaultModules,
150 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
151 rust.PrepareForTestWithRustDefaultModules,
152 sh.PrepareForTestWithShBuildComponents,
153
154 PrepareForTestWithApexBuildComponents,
155
156 // Additional apex test specific preparers.
157 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
158 filegroup {
159 name: "myapex-file_contexts",
160 srcs: [
161 "apex/myapex-file_contexts",
162 ],
163 }
164 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000165 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000166 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000167 "a.java": nil,
168 "PrebuiltAppFoo.apk": nil,
169 "PrebuiltAppFooPriv.apk": nil,
170 "apex_manifest.json": nil,
171 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000172 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
173 "system/sepolicy/apex/myapex2-file_contexts": nil,
174 "system/sepolicy/apex/otherapex-file_contexts": nil,
175 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
176 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700177 "mylib.cpp": nil,
178 "mytest.cpp": nil,
179 "mytest1.cpp": nil,
180 "mytest2.cpp": nil,
181 "mytest3.cpp": nil,
182 "myprebuilt": nil,
183 "my_include": nil,
184 "foo/bar/MyClass.java": nil,
185 "prebuilt.jar": nil,
186 "prebuilt.so": nil,
187 "vendor/foo/devkeys/test.x509.pem": nil,
188 "vendor/foo/devkeys/test.pk8": nil,
189 "testkey.x509.pem": nil,
190 "testkey.pk8": nil,
191 "testkey.override.x509.pem": nil,
192 "testkey.override.pk8": nil,
193 "vendor/foo/devkeys/testkey.avbpubkey": nil,
194 "vendor/foo/devkeys/testkey.pem": nil,
195 "NOTICE": nil,
196 "custom_notice": nil,
197 "custom_notice_for_static_lib": nil,
198 "testkey2.avbpubkey": nil,
199 "testkey2.pem": nil,
200 "myapex-arm64.apex": nil,
201 "myapex-arm.apex": nil,
202 "myapex.apks": nil,
203 "frameworks/base/api/current.txt": nil,
204 "framework/aidl/a.aidl": nil,
205 "dummy.txt": nil,
206 "baz": nil,
207 "bar/baz": nil,
208 "testdata/baz": nil,
209 "AppSet.apks": nil,
210 "foo.rs": nil,
211 "libfoo.jar": nil,
212 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000213 },
214 ),
215
216 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
217 variables.DeviceVndkVersion = proptools.StringPtr("current")
218 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
219 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
220 variables.Platform_sdk_codename = proptools.StringPtr("Q")
221 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000222 // "Tiramisu" needs to be in the next line for compatibility with soong code,
223 // not because of these tests specifically (it's not used by the tests)
224 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900225 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000226 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000227 }),
228)
229
Paul Duffin52bfaa42021-03-23 23:40:12 +0000230var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
231 "system/sepolicy/apex/myapex-file_contexts": nil,
232})
233
Jooyung Han643adc42020-02-27 13:50:06 +0900234// ensure that 'result' equals 'expected'
235func ensureEquals(t *testing.T, result string, expected string) {
236 t.Helper()
237 if result != expected {
238 t.Errorf("%q != %q", expected, result)
239 }
240}
241
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242// ensure that 'result' contains 'expected'
243func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900244 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900245 if !strings.Contains(result, expected) {
246 t.Errorf("%q is not found in %q", expected, result)
247 }
248}
249
Liz Kammer5bd365f2020-05-27 15:15:11 -0700250// ensure that 'result' contains 'expected' exactly one time
251func ensureContainsOnce(t *testing.T, result string, expected string) {
252 t.Helper()
253 count := strings.Count(result, expected)
254 if count != 1 {
255 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
256 }
257}
258
Jiyong Park25fc6a92018-11-18 18:02:45 +0900259// ensures that 'result' does not contain 'notExpected'
260func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900261 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900262 if strings.Contains(result, notExpected) {
263 t.Errorf("%q is found in %q", notExpected, result)
264 }
265}
266
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700267func ensureMatches(t *testing.T, result string, expectedRex string) {
268 ok, err := regexp.MatchString(expectedRex, result)
269 if err != nil {
270 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
271 return
272 }
273 if !ok {
274 t.Errorf("%s does not match regular expession %s", result, expectedRex)
275 }
276}
277
Jiyong Park25fc6a92018-11-18 18:02:45 +0900278func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900279 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900280 if !android.InList(expected, result) {
281 t.Errorf("%q is not found in %v", expected, result)
282 }
283}
284
285func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900286 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900287 if android.InList(notExpected, result) {
288 t.Errorf("%q is found in %v", notExpected, result)
289 }
290}
291
Jooyung Hane1633032019-08-01 17:41:43 +0900292func ensureListEmpty(t *testing.T, result []string) {
293 t.Helper()
294 if len(result) > 0 {
295 t.Errorf("%q is expected to be empty", result)
296 }
297}
298
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000299func ensureListNotEmpty(t *testing.T, result []string) {
300 t.Helper()
301 if len(result) == 0 {
302 t.Errorf("%q is expected to be not empty", result)
303 }
304}
305
Jiyong Park25fc6a92018-11-18 18:02:45 +0900306// Minimal test
307func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800308 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900309 apex_defaults {
310 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900311 manifest: ":myapex.manifest",
312 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900313 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900314 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900315 native_shared_libs: [
316 "mylib",
317 "libfoo.ffi",
318 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900319 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800320 multilib: {
321 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900322 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800323 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900324 },
Jiyong Park77acec62020-06-01 21:39:15 +0900325 java_libs: [
326 "myjar",
327 "myjar_dex",
328 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000329 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900330 }
331
Jiyong Park30ca9372019-02-07 16:27:23 +0900332 apex {
333 name: "myapex",
334 defaults: ["myapex-defaults"],
335 }
336
Jiyong Park25fc6a92018-11-18 18:02:45 +0900337 apex_key {
338 name: "myapex.key",
339 public_key: "testkey.avbpubkey",
340 private_key: "testkey.pem",
341 }
342
Jiyong Park809bb722019-02-13 21:33:49 +0900343 filegroup {
344 name: "myapex.manifest",
345 srcs: ["apex_manifest.json"],
346 }
347
348 filegroup {
349 name: "myapex.androidmanifest",
350 srcs: ["AndroidManifest.xml"],
351 }
352
Jiyong Park25fc6a92018-11-18 18:02:45 +0900353 cc_library {
354 name: "mylib",
355 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900356 shared_libs: [
357 "mylib2",
358 "libbar.ffi",
359 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900360 system_shared_libs: [],
361 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000362 // TODO: remove //apex_available:platform
363 apex_available: [
364 "//apex_available:platform",
365 "myapex",
366 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900367 }
368
Alex Light3d673592019-01-18 14:37:31 -0800369 cc_binary {
370 name: "foo",
371 srcs: ["mylib.cpp"],
372 compile_multilib: "both",
373 multilib: {
374 lib32: {
375 suffix: "32",
376 },
377 lib64: {
378 suffix: "64",
379 },
380 },
381 symlinks: ["foo_link_"],
382 symlink_preferred_arch: true,
383 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800384 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700385 apex_available: [ "myapex", "com.android.gki.*" ],
386 }
387
Jiyong Park99644e92020-11-17 22:21:02 +0900388 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000389 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900390 srcs: ["foo.rs"],
391 rlibs: ["libfoo.rlib.rust"],
392 dylibs: ["libfoo.dylib.rust"],
393 apex_available: ["myapex"],
394 }
395
396 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000397 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900398 srcs: ["foo.rs"],
399 crate_name: "foo",
400 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900401 shared_libs: ["libfoo.shared_from_rust"],
402 }
403
404 cc_library_shared {
405 name: "libfoo.shared_from_rust",
406 srcs: ["mylib.cpp"],
407 system_shared_libs: [],
408 stl: "none",
409 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900410 }
411
412 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000413 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900414 srcs: ["foo.rs"],
415 crate_name: "foo",
416 apex_available: ["myapex"],
417 }
418
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900419 rust_ffi_shared {
420 name: "libfoo.ffi",
421 srcs: ["foo.rs"],
422 crate_name: "foo",
423 apex_available: ["myapex"],
424 }
425
426 rust_ffi_shared {
427 name: "libbar.ffi",
428 srcs: ["foo.rs"],
429 crate_name: "bar",
430 apex_available: ["myapex"],
431 }
432
Yifan Hongd22a84a2020-07-28 17:37:46 -0700433 apex {
434 name: "com.android.gki.fake",
435 binaries: ["foo"],
436 key: "myapex.key",
437 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000438 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800439 }
440
Paul Duffindddd5462020-04-07 15:25:44 +0100441 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900442 name: "mylib2",
443 srcs: ["mylib.cpp"],
444 system_shared_libs: [],
445 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900446 static_libs: ["libstatic"],
447 // TODO: remove //apex_available:platform
448 apex_available: [
449 "//apex_available:platform",
450 "myapex",
451 ],
452 }
453
Paul Duffindddd5462020-04-07 15:25:44 +0100454 cc_prebuilt_library_shared {
455 name: "mylib2",
456 srcs: ["prebuilt.so"],
457 // TODO: remove //apex_available:platform
458 apex_available: [
459 "//apex_available:platform",
460 "myapex",
461 ],
462 }
463
Jiyong Park9918e1a2020-03-17 19:16:40 +0900464 cc_library_static {
465 name: "libstatic",
466 srcs: ["mylib.cpp"],
467 system_shared_libs: [],
468 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000469 // TODO: remove //apex_available:platform
470 apex_available: [
471 "//apex_available:platform",
472 "myapex",
473 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900474 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900475
476 java_library {
477 name: "myjar",
478 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900479 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900480 sdk_version: "none",
481 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900482 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900483 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000484 // TODO: remove //apex_available:platform
485 apex_available: [
486 "//apex_available:platform",
487 "myapex",
488 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900489 }
490
Jiyong Park77acec62020-06-01 21:39:15 +0900491 dex_import {
492 name: "myjar_dex",
493 jars: ["prebuilt.jar"],
494 apex_available: [
495 "//apex_available:platform",
496 "myapex",
497 ],
498 }
499
Jiyong Park7f7766d2019-07-25 22:02:35 +0900500 java_library {
501 name: "myotherjar",
502 srcs: ["foo/bar/MyClass.java"],
503 sdk_version: "none",
504 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900505 // TODO: remove //apex_available:platform
506 apex_available: [
507 "//apex_available:platform",
508 "myapex",
509 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900510 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900511
512 java_library {
513 name: "mysharedjar",
514 srcs: ["foo/bar/MyClass.java"],
515 sdk_version: "none",
516 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900517 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900518 `)
519
Paul Duffina71a67a2021-03-29 00:42:57 +0100520 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900521
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900522 // Make sure that Android.mk is created
523 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700524 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900525 var builder strings.Builder
526 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
527
528 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000529 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900530 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
531
Jiyong Park42cca6c2019-04-01 11:15:50 +0900532 optFlags := apexRule.Args["opt_flags"]
533 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700534 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100535 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900536
Jiyong Park25fc6a92018-11-18 18:02:45 +0900537 copyCmds := apexRule.Args["copy_commands"]
538
539 // Ensure that main rule creates an output
540 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
541
542 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700543 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
544 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900546 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900547 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900548
549 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700550 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
551 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900552 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
553 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900554 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900556
557 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800558 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
559 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900560 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900561 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900562 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900563 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
564 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900565 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900566 // .. but not for java libs
567 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900568 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800569
Colin Cross7113d202019-11-20 16:39:12 -0800570 // Ensure that the platform variant ends with _shared or _common
571 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
572 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900573 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
574 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900575 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
576
577 // Ensure that dynamic dependency to java libs are not included
578 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800579
580 // Ensure that all symlinks are present.
581 found_foo_link_64 := false
582 found_foo := false
583 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900584 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800585 if strings.HasSuffix(cmd, "bin/foo") {
586 found_foo = true
587 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
588 found_foo_link_64 = true
589 }
590 }
591 }
592 good := found_foo && found_foo_link_64
593 if !good {
594 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
595 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900596
Artur Satayeva8bd1132020-04-27 18:07:06 +0100597 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100598 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
600 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
601 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100602
603 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100604 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
606 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
607 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800608}
609
Jooyung Hanf21c7972019-12-16 22:32:06 +0900610func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800611 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900612 apex_defaults {
613 name: "myapex-defaults",
614 key: "myapex.key",
615 prebuilts: ["myetc"],
616 native_shared_libs: ["mylib"],
617 java_libs: ["myjar"],
618 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900619 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800620 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000621 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900622 }
623
624 prebuilt_etc {
625 name: "myetc",
626 src: "myprebuilt",
627 }
628
629 apex {
630 name: "myapex",
631 defaults: ["myapex-defaults"],
632 }
633
634 apex_key {
635 name: "myapex.key",
636 public_key: "testkey.avbpubkey",
637 private_key: "testkey.pem",
638 }
639
640 cc_library {
641 name: "mylib",
642 system_shared_libs: [],
643 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000644 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900645 }
646
647 java_library {
648 name: "myjar",
649 srcs: ["foo/bar/MyClass.java"],
650 sdk_version: "none",
651 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000652 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900653 }
654
655 android_app {
656 name: "AppFoo",
657 srcs: ["foo/bar/MyClass.java"],
658 sdk_version: "none",
659 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000660 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900661 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900662
663 runtime_resource_overlay {
664 name: "rro",
665 theme: "blue",
666 }
667
markchien2f59ec92020-09-02 16:23:38 +0800668 bpf {
669 name: "bpf",
670 srcs: ["bpf.c", "bpf2.c"],
671 }
672
Ken Chenfad7f9d2021-11-10 22:02:57 +0800673 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800674 name: "netdTest",
675 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800676 sub_dir: "netd",
677 }
678
Jooyung Hanf21c7972019-12-16 22:32:06 +0900679 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000680 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900681 "etc/myetc",
682 "javalib/myjar.jar",
683 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000684 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900685 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800686 "etc/bpf/bpf.o",
687 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800688 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900689 })
690}
691
Jooyung Han01a3ee22019-11-02 02:52:25 +0900692func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800693 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900694 apex {
695 name: "myapex",
696 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000697 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900698 }
699
700 apex_key {
701 name: "myapex.key",
702 public_key: "testkey.avbpubkey",
703 private_key: "testkey.pem",
704 }
705 `)
706
707 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900708 args := module.Rule("apexRule").Args
709 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
710 t.Error("manifest should be apex_manifest.pb, but " + manifest)
711 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900712}
713
Liz Kammer4854a7d2021-05-27 14:28:27 -0400714func TestApexManifestMinSdkVersion(t *testing.T) {
715 ctx := testApex(t, `
716 apex_defaults {
717 name: "my_defaults",
718 key: "myapex.key",
719 product_specific: true,
720 file_contexts: ":my-file-contexts",
721 updatable: false,
722 }
723 apex {
724 name: "myapex_30",
725 min_sdk_version: "30",
726 defaults: ["my_defaults"],
727 }
728
729 apex {
730 name: "myapex_current",
731 min_sdk_version: "current",
732 defaults: ["my_defaults"],
733 }
734
735 apex {
736 name: "myapex_none",
737 defaults: ["my_defaults"],
738 }
739
740 apex_key {
741 name: "myapex.key",
742 public_key: "testkey.avbpubkey",
743 private_key: "testkey.pem",
744 }
745
746 filegroup {
747 name: "my-file-contexts",
748 srcs: ["product_specific_file_contexts"],
749 }
750 `, withFiles(map[string][]byte{
751 "product_specific_file_contexts": nil,
752 }), android.FixtureModifyProductVariables(
753 func(variables android.FixtureProductVariables) {
754 variables.Unbundled_build = proptools.BoolPtr(true)
755 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
756 }), android.FixtureMergeEnv(map[string]string{
757 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
758 }))
759
760 testCases := []struct {
761 module string
762 minSdkVersion string
763 }{
764 {
765 module: "myapex_30",
766 minSdkVersion: "30",
767 },
768 {
769 module: "myapex_current",
770 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
771 },
772 {
773 module: "myapex_none",
774 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
775 },
776 }
777 for _, tc := range testCases {
778 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
779 args := module.Rule("apexRule").Args
780 optFlags := args["opt_flags"]
781 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
782 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
783 }
784 }
785}
786
Jooyung Hanaf730952023-02-28 14:13:38 +0900787func TestFileContexts(t *testing.T) {
788 for _, useFileContextsAsIs := range []bool{true, false} {
789 prop := ""
790 if useFileContextsAsIs {
791 prop = "use_file_contexts_as_is: true,\n"
792 }
793 ctx := testApex(t, `
794 apex {
795 name: "myapex",
796 key: "myapex.key",
797 file_contexts: "file_contexts",
798 updatable: false,
799 vendor: true,
800 `+prop+`
801 }
802
803 apex_key {
804 name: "myapex.key",
805 public_key: "testkey.avbpubkey",
806 private_key: "testkey.pem",
807 }
808 `, withFiles(map[string][]byte{
809 "file_contexts": nil,
810 }))
811
812 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("file_contexts")
813 forceLabellingCommand := "apex_manifest\\\\.pb u:object_r:system_file:s0"
814 if useFileContextsAsIs {
815 android.AssertStringDoesNotContain(t, "should force-label",
816 rule.RuleParams.Command, forceLabellingCommand)
817 } else {
818 android.AssertStringDoesContain(t, "shouldn't force-label",
819 rule.RuleParams.Command, forceLabellingCommand)
820 }
821 }
822}
823
Alex Light5098a612018-11-29 17:12:15 -0800824func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800825 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800826 apex {
827 name: "myapex",
828 key: "myapex.key",
829 payload_type: "zip",
830 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000831 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800832 }
833
834 apex_key {
835 name: "myapex.key",
836 public_key: "testkey.avbpubkey",
837 private_key: "testkey.pem",
838 }
839
840 cc_library {
841 name: "mylib",
842 srcs: ["mylib.cpp"],
843 shared_libs: ["mylib2"],
844 system_shared_libs: [],
845 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000846 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800847 }
848
849 cc_library {
850 name: "mylib2",
851 srcs: ["mylib.cpp"],
852 system_shared_libs: [],
853 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000854 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800855 }
856 `)
857
Sundong Ahnabb64432019-10-22 13:58:29 +0900858 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800859 copyCmds := zipApexRule.Args["copy_commands"]
860
861 // Ensure that main rule creates an output
862 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
863
864 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700865 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800866
867 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700868 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800869
870 // Ensure that both direct and indirect deps are copied into apex
871 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
872 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900873}
874
875func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800876 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900877 apex {
878 name: "myapex",
879 key: "myapex.key",
880 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900881 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000882 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900883 }
884
885 apex_key {
886 name: "myapex.key",
887 public_key: "testkey.avbpubkey",
888 private_key: "testkey.pem",
889 }
890
891 cc_library {
892 name: "mylib",
893 srcs: ["mylib.cpp"],
894 shared_libs: ["mylib2", "mylib3"],
895 system_shared_libs: [],
896 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000897 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900898 }
899
900 cc_library {
901 name: "mylib2",
902 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900903 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900904 system_shared_libs: [],
905 stl: "none",
906 stubs: {
907 versions: ["1", "2", "3"],
908 },
909 }
910
911 cc_library {
912 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900913 srcs: ["mylib.cpp"],
914 shared_libs: ["mylib4"],
915 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900916 stl: "none",
917 stubs: {
918 versions: ["10", "11", "12"],
919 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000920 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900922
923 cc_library {
924 name: "mylib4",
925 srcs: ["mylib.cpp"],
926 system_shared_libs: [],
927 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000928 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900929 }
Jiyong Park105dc322021-06-11 17:22:09 +0900930
931 rust_binary {
932 name: "foo.rust",
933 srcs: ["foo.rs"],
934 shared_libs: ["libfoo.shared_from_rust"],
935 prefer_rlib: true,
936 apex_available: ["myapex"],
937 }
938
939 cc_library_shared {
940 name: "libfoo.shared_from_rust",
941 srcs: ["mylib.cpp"],
942 system_shared_libs: [],
943 stl: "none",
944 stubs: {
945 versions: ["10", "11", "12"],
946 },
947 }
948
Jiyong Park25fc6a92018-11-18 18:02:45 +0900949 `)
950
Sundong Ahnabb64432019-10-22 13:58:29 +0900951 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900952 copyCmds := apexRule.Args["copy_commands"]
953
954 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800955 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900956
957 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800958 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900959
960 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800961 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900962
Colin Crossaede88c2020-08-11 12:17:01 -0700963 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900964
965 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900966 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900967 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900968 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900969
970 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700971 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900972 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700973 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900974
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700975 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
976 // is replaced by sharing of "cFlags" in cc/builder.go.
977 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
978 // module variable representing "cflags". So it was not detected by ensureNotContains.
979 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
980 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
981 // including the original cflags's "-include mylib.h".
982 //
Jiyong Park64379952018-12-13 18:37:29 +0900983 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700984 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
985 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900986
Jiyong Park85cc35a2022-07-17 11:30:47 +0900987 // Ensure that genstub for platform-provided lib is invoked with --systemapi
988 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
989 // Ensure that genstub for apex-provided lib is invoked with --apex
990 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900991
Jooyung Hana57af4a2020-01-23 05:36:59 +0000992 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900993 "lib64/mylib.so",
994 "lib64/mylib3.so",
995 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900996 "bin/foo.rust",
997 "lib64/libc++.so", // by the implicit dependency from foo.rust
998 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900999 })
Jiyong Park105dc322021-06-11 17:22:09 +09001000
1001 // Ensure that stub dependency from a rust module is not included
1002 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1003 // The rust module is linked to the stub cc library
1004 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
1005 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1006 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001007
1008 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1009 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001010}
1011
Jiyong Park1bc84122021-06-22 20:23:05 +09001012func TestApexCanUsePrivateApis(t *testing.T) {
1013 ctx := testApex(t, `
1014 apex {
1015 name: "myapex",
1016 key: "myapex.key",
1017 native_shared_libs: ["mylib"],
1018 binaries: ["foo.rust"],
1019 updatable: false,
1020 platform_apis: true,
1021 }
1022
1023 apex_key {
1024 name: "myapex.key",
1025 public_key: "testkey.avbpubkey",
1026 private_key: "testkey.pem",
1027 }
1028
1029 cc_library {
1030 name: "mylib",
1031 srcs: ["mylib.cpp"],
1032 shared_libs: ["mylib2"],
1033 system_shared_libs: [],
1034 stl: "none",
1035 apex_available: [ "myapex" ],
1036 }
1037
1038 cc_library {
1039 name: "mylib2",
1040 srcs: ["mylib.cpp"],
1041 cflags: ["-include mylib.h"],
1042 system_shared_libs: [],
1043 stl: "none",
1044 stubs: {
1045 versions: ["1", "2", "3"],
1046 },
1047 }
1048
1049 rust_binary {
1050 name: "foo.rust",
1051 srcs: ["foo.rs"],
1052 shared_libs: ["libfoo.shared_from_rust"],
1053 prefer_rlib: true,
1054 apex_available: ["myapex"],
1055 }
1056
1057 cc_library_shared {
1058 name: "libfoo.shared_from_rust",
1059 srcs: ["mylib.cpp"],
1060 system_shared_libs: [],
1061 stl: "none",
1062 stubs: {
1063 versions: ["10", "11", "12"],
1064 },
1065 }
1066 `)
1067
1068 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1069 copyCmds := apexRule.Args["copy_commands"]
1070
1071 // Ensure that indirect stubs dep is not included
1072 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1073 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1074
1075 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1076 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001077 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001078 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1079 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Parkd4a00632022-04-12 12:23:20 +09001080 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001081 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1082 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1083}
1084
Colin Cross7812fd32020-09-25 12:35:10 -07001085func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1086 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001087 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001088 apex {
1089 name: "myapex",
1090 key: "myapex.key",
1091 native_shared_libs: ["mylib", "mylib3"],
1092 min_sdk_version: "29",
1093 }
1094
1095 apex_key {
1096 name: "myapex.key",
1097 public_key: "testkey.avbpubkey",
1098 private_key: "testkey.pem",
1099 }
1100
1101 cc_library {
1102 name: "mylib",
1103 srcs: ["mylib.cpp"],
1104 shared_libs: ["mylib2", "mylib3"],
1105 system_shared_libs: [],
1106 stl: "none",
1107 apex_available: [ "myapex" ],
1108 min_sdk_version: "28",
1109 }
1110
1111 cc_library {
1112 name: "mylib2",
1113 srcs: ["mylib.cpp"],
1114 cflags: ["-include mylib.h"],
1115 system_shared_libs: [],
1116 stl: "none",
1117 stubs: {
1118 versions: ["28", "29", "30", "current"],
1119 },
1120 min_sdk_version: "28",
1121 }
1122
1123 cc_library {
1124 name: "mylib3",
1125 srcs: ["mylib.cpp"],
1126 shared_libs: ["mylib4"],
1127 system_shared_libs: [],
1128 stl: "none",
1129 stubs: {
1130 versions: ["28", "29", "30", "current"],
1131 },
1132 apex_available: [ "myapex" ],
1133 min_sdk_version: "28",
1134 }
1135
1136 cc_library {
1137 name: "mylib4",
1138 srcs: ["mylib.cpp"],
1139 system_shared_libs: [],
1140 stl: "none",
1141 apex_available: [ "myapex" ],
1142 min_sdk_version: "28",
1143 }
1144 `)
1145
1146 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1147 copyCmds := apexRule.Args["copy_commands"]
1148
1149 // Ensure that direct non-stubs dep is always included
1150 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1151
1152 // Ensure that indirect stubs dep is not included
1153 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1154
1155 // Ensure that direct stubs dep is included
1156 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1157
1158 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1159
Jiyong Park55549df2021-02-26 23:57:23 +09001160 // Ensure that mylib is linking with the latest version of stub for mylib2
1161 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001162 // ... and not linking to the non-stub (impl) variant of mylib2
1163 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1164
1165 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1166 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1167 // .. and not linking to the stubs variant of mylib3
1168 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1169
1170 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001171 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001172 ensureNotContains(t, mylib2Cflags, "-include ")
1173
Jiyong Park85cc35a2022-07-17 11:30:47 +09001174 // Ensure that genstub is invoked with --systemapi
1175 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001176
1177 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1178 "lib64/mylib.so",
1179 "lib64/mylib3.so",
1180 "lib64/mylib4.so",
1181 })
1182}
1183
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001184func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1185 t.Parallel()
1186 // myapex (Z)
1187 // mylib -----------------.
1188 // |
1189 // otherapex (29) |
1190 // libstub's versions: 29 Z current
1191 // |
1192 // <platform> |
1193 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001194 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001195 apex {
1196 name: "myapex",
1197 key: "myapex.key",
1198 native_shared_libs: ["mylib"],
1199 min_sdk_version: "Z", // non-final
1200 }
1201
1202 cc_library {
1203 name: "mylib",
1204 srcs: ["mylib.cpp"],
1205 shared_libs: ["libstub"],
1206 apex_available: ["myapex"],
1207 min_sdk_version: "Z",
1208 }
1209
1210 apex_key {
1211 name: "myapex.key",
1212 public_key: "testkey.avbpubkey",
1213 private_key: "testkey.pem",
1214 }
1215
1216 apex {
1217 name: "otherapex",
1218 key: "myapex.key",
1219 native_shared_libs: ["libstub"],
1220 min_sdk_version: "29",
1221 }
1222
1223 cc_library {
1224 name: "libstub",
1225 srcs: ["mylib.cpp"],
1226 stubs: {
1227 versions: ["29", "Z", "current"],
1228 },
1229 apex_available: ["otherapex"],
1230 min_sdk_version: "29",
1231 }
1232
1233 // platform module depending on libstub from otherapex should use the latest stub("current")
1234 cc_library {
1235 name: "libplatform",
1236 srcs: ["mylib.cpp"],
1237 shared_libs: ["libstub"],
1238 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001239 `,
1240 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1241 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1242 variables.Platform_sdk_final = proptools.BoolPtr(false)
1243 variables.Platform_version_active_codenames = []string{"Z"}
1244 }),
1245 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001246
Jiyong Park55549df2021-02-26 23:57:23 +09001247 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001248 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001249 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001250 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001251 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001252
1253 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1254 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1255 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1256 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1257 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1258}
1259
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001260func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001261 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001262 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001263 name: "myapex2",
1264 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001265 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001266 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001267 }
1268
1269 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001270 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001271 public_key: "testkey.avbpubkey",
1272 private_key: "testkey.pem",
1273 }
1274
1275 cc_library {
1276 name: "mylib",
1277 srcs: ["mylib.cpp"],
1278 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001279 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001280 system_shared_libs: [],
1281 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001282 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001283 }
1284
1285 cc_library {
1286 name: "libfoo",
1287 srcs: ["mylib.cpp"],
1288 shared_libs: ["libbar"],
1289 system_shared_libs: [],
1290 stl: "none",
1291 stubs: {
1292 versions: ["10", "20", "30"],
1293 },
1294 }
1295
1296 cc_library {
1297 name: "libbar",
1298 srcs: ["mylib.cpp"],
1299 system_shared_libs: [],
1300 stl: "none",
1301 }
1302
Jiyong Park678c8812020-02-07 17:25:49 +09001303 cc_library_static {
1304 name: "libbaz",
1305 srcs: ["mylib.cpp"],
1306 system_shared_libs: [],
1307 stl: "none",
1308 apex_available: [ "myapex2" ],
1309 }
1310
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001311 `)
1312
Jiyong Park83dc74b2020-01-14 18:38:44 +09001313 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001314 copyCmds := apexRule.Args["copy_commands"]
1315
1316 // Ensure that direct non-stubs dep is always included
1317 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1318
1319 // Ensure that indirect stubs dep is not included
1320 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1321
1322 // Ensure that dependency of stubs is not included
1323 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1324
Colin Crossaede88c2020-08-11 12:17:01 -07001325 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001326
1327 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001328 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001329 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001330 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001331
Jiyong Park3ff16992019-12-27 14:11:47 +09001332 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001333
1334 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1335 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001336
Artur Satayeva8bd1132020-04-27 18:07:06 +01001337 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001338 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001339
Artur Satayeva8bd1132020-04-27 18:07:06 +01001340 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001341 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001342}
1343
Jooyung Hand3639552019-08-09 12:57:43 +09001344func TestApexWithRuntimeLibsDependency(t *testing.T) {
1345 /*
1346 myapex
1347 |
1348 v (runtime_libs)
1349 mylib ------+------> libfoo [provides stub]
1350 |
1351 `------> libbar
1352 */
Colin Cross1c460562021-02-16 17:55:47 -08001353 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001354 apex {
1355 name: "myapex",
1356 key: "myapex.key",
1357 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001358 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001359 }
1360
1361 apex_key {
1362 name: "myapex.key",
1363 public_key: "testkey.avbpubkey",
1364 private_key: "testkey.pem",
1365 }
1366
1367 cc_library {
1368 name: "mylib",
1369 srcs: ["mylib.cpp"],
1370 runtime_libs: ["libfoo", "libbar"],
1371 system_shared_libs: [],
1372 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001373 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001374 }
1375
1376 cc_library {
1377 name: "libfoo",
1378 srcs: ["mylib.cpp"],
1379 system_shared_libs: [],
1380 stl: "none",
1381 stubs: {
1382 versions: ["10", "20", "30"],
1383 },
1384 }
1385
1386 cc_library {
1387 name: "libbar",
1388 srcs: ["mylib.cpp"],
1389 system_shared_libs: [],
1390 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001391 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001392 }
1393
1394 `)
1395
Sundong Ahnabb64432019-10-22 13:58:29 +09001396 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001397 copyCmds := apexRule.Args["copy_commands"]
1398
1399 // Ensure that direct non-stubs dep is always included
1400 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1401
1402 // Ensure that indirect stubs dep is not included
1403 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1404
1405 // Ensure that runtime_libs dep in included
1406 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1407
Sundong Ahnabb64432019-10-22 13:58:29 +09001408 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001409 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1410 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001411
1412}
1413
Paul Duffina02cae32021-03-09 01:44:06 +00001414var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1415 cc.PrepareForTestWithCcBuildComponents,
1416 PrepareForTestWithApexBuildComponents,
1417 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001418 apex {
1419 name: "com.android.runtime",
1420 key: "com.android.runtime.key",
1421 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001422 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001423 }
1424
1425 apex_key {
1426 name: "com.android.runtime.key",
1427 public_key: "testkey.avbpubkey",
1428 private_key: "testkey.pem",
1429 }
Paul Duffina02cae32021-03-09 01:44:06 +00001430 `),
1431 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1432)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001433
Paul Duffina02cae32021-03-09 01:44:06 +00001434func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001435 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001436 cc_library {
1437 name: "libc",
1438 no_libcrt: true,
1439 nocrt: true,
1440 stl: "none",
1441 system_shared_libs: [],
1442 stubs: { versions: ["1"] },
1443 apex_available: ["com.android.runtime"],
1444
1445 sanitize: {
1446 hwaddress: true,
1447 }
1448 }
1449
1450 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001451 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001452 no_libcrt: true,
1453 nocrt: true,
1454 stl: "none",
1455 system_shared_libs: [],
1456 srcs: [""],
1457 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001458 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001459
1460 sanitize: {
1461 never: true,
1462 },
Paul Duffina02cae32021-03-09 01:44:06 +00001463 } `)
1464 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001465
1466 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1467 "lib64/bionic/libc.so",
1468 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1469 })
1470
Colin Cross4c4c1be2022-02-10 11:41:18 -08001471 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001472
1473 installed := hwasan.Description("install libclang_rt.hwasan")
1474 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1475
1476 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1477 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1478 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1479}
1480
1481func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001482 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001483 prepareForTestOfRuntimeApexWithHwasan,
1484 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1485 variables.SanitizeDevice = []string{"hwaddress"}
1486 }),
1487 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001488 cc_library {
1489 name: "libc",
1490 no_libcrt: true,
1491 nocrt: true,
1492 stl: "none",
1493 system_shared_libs: [],
1494 stubs: { versions: ["1"] },
1495 apex_available: ["com.android.runtime"],
1496 }
1497
1498 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001499 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001500 no_libcrt: true,
1501 nocrt: true,
1502 stl: "none",
1503 system_shared_libs: [],
1504 srcs: [""],
1505 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001506 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001507
1508 sanitize: {
1509 never: true,
1510 },
1511 }
Paul Duffina02cae32021-03-09 01:44:06 +00001512 `)
1513 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001514
1515 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1516 "lib64/bionic/libc.so",
1517 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1518 })
1519
Colin Cross4c4c1be2022-02-10 11:41:18 -08001520 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001521
1522 installed := hwasan.Description("install libclang_rt.hwasan")
1523 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1524
1525 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1526 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1527 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1528}
1529
Jooyung Han61b66e92020-03-21 14:21:46 +00001530func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1531 testcases := []struct {
1532 name string
1533 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001534 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001535 shouldLink string
1536 shouldNotLink []string
1537 }{
1538 {
Jiyong Park55549df2021-02-26 23:57:23 +09001539 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001540 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001541 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001542 shouldLink: "current",
1543 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001544 },
1545 {
Jiyong Park55549df2021-02-26 23:57:23 +09001546 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001547 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001548 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001549 shouldLink: "current",
1550 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001551 },
1552 }
1553 for _, tc := range testcases {
1554 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001555 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001556 apex {
1557 name: "myapex",
1558 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001559 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001560 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001561 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001562 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001563
Jooyung Han61b66e92020-03-21 14:21:46 +00001564 apex_key {
1565 name: "myapex.key",
1566 public_key: "testkey.avbpubkey",
1567 private_key: "testkey.pem",
1568 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001569
Jooyung Han61b66e92020-03-21 14:21:46 +00001570 cc_library {
1571 name: "mylib",
1572 srcs: ["mylib.cpp"],
1573 vendor_available: true,
1574 shared_libs: ["libbar"],
1575 system_shared_libs: [],
1576 stl: "none",
1577 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001578 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001579 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001580
Jooyung Han61b66e92020-03-21 14:21:46 +00001581 cc_library {
1582 name: "libbar",
1583 srcs: ["mylib.cpp"],
1584 system_shared_libs: [],
1585 stl: "none",
1586 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001587 llndk: {
1588 symbol_file: "libbar.map.txt",
1589 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001590 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001591 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001592 withUnbundledBuild,
1593 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001594
Jooyung Han61b66e92020-03-21 14:21:46 +00001595 // Ensure that LLNDK dep is not included
1596 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1597 "lib64/mylib.so",
1598 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001599
Jooyung Han61b66e92020-03-21 14:21:46 +00001600 // Ensure that LLNDK dep is required
1601 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1602 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1603 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001604
Steven Moreland2c4000c2021-04-27 02:08:49 +00001605 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1606 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001607 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001608 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001609 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001610
Steven Moreland2c4000c2021-04-27 02:08:49 +00001611 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001612 ver := tc.shouldLink
1613 if tc.shouldLink == "current" {
1614 ver = strconv.Itoa(android.FutureApiLevelInt)
1615 }
1616 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001617 })
1618 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001619}
1620
Jiyong Park25fc6a92018-11-18 18:02:45 +09001621func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001622 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001623 apex {
1624 name: "myapex",
1625 key: "myapex.key",
1626 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001627 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001628 }
1629
1630 apex_key {
1631 name: "myapex.key",
1632 public_key: "testkey.avbpubkey",
1633 private_key: "testkey.pem",
1634 }
1635
1636 cc_library {
1637 name: "mylib",
1638 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001639 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001640 shared_libs: ["libdl#27"],
1641 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001642 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001643 }
1644
1645 cc_library_shared {
1646 name: "mylib_shared",
1647 srcs: ["mylib.cpp"],
1648 shared_libs: ["libdl#27"],
1649 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001650 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001651 }
1652
1653 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001654 name: "libBootstrap",
1655 srcs: ["mylib.cpp"],
1656 stl: "none",
1657 bootstrap: true,
1658 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001659 `)
1660
Sundong Ahnabb64432019-10-22 13:58:29 +09001661 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001662 copyCmds := apexRule.Args["copy_commands"]
1663
1664 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001665 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001666 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1667 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001668
1669 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001670 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001671
Colin Crossaede88c2020-08-11 12:17:01 -07001672 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1673 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1674 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001675
1676 // For dependency to libc
1677 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001678 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001679 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001680 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001681 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001682 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1683 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001684
1685 // For dependency to libm
1686 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001687 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001688 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001689 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001690 // ... and is not compiling with the stub
1691 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1692 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1693
1694 // For dependency to libdl
1695 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001696 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001697 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001698 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1699 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001700 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001701 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001702 // ... Cflags from stub is correctly exported to mylib
1703 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1704 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001705
1706 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001707 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1708 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1709 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1710 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001711}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001712
Jooyung Han749dc692020-04-15 11:03:39 +09001713func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001714 // there are three links between liba --> libz.
1715 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001716 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001717 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001718 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001719 apex {
1720 name: "myapex",
1721 key: "myapex.key",
1722 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001723 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001724 }
1725
1726 apex {
1727 name: "otherapex",
1728 key: "myapex.key",
1729 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001730 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001731 }
1732
1733 apex_key {
1734 name: "myapex.key",
1735 public_key: "testkey.avbpubkey",
1736 private_key: "testkey.pem",
1737 }
1738
1739 cc_library {
1740 name: "libx",
1741 shared_libs: ["liba"],
1742 system_shared_libs: [],
1743 stl: "none",
1744 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001745 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001746 }
1747
1748 cc_library {
1749 name: "liby",
1750 shared_libs: ["liba"],
1751 system_shared_libs: [],
1752 stl: "none",
1753 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001754 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001755 }
1756
1757 cc_library {
1758 name: "liba",
1759 shared_libs: ["libz"],
1760 system_shared_libs: [],
1761 stl: "none",
1762 apex_available: [
1763 "//apex_available:anyapex",
1764 "//apex_available:platform",
1765 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001766 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001767 }
1768
1769 cc_library {
1770 name: "libz",
1771 system_shared_libs: [],
1772 stl: "none",
1773 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001774 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001775 },
1776 }
Jooyung Han749dc692020-04-15 11:03:39 +09001777 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001778
1779 expectLink := func(from, from_variant, to, to_variant string) {
1780 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1781 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1782 }
1783 expectNoLink := func(from, from_variant, to, to_variant string) {
1784 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1785 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1786 }
1787 // platform liba is linked to non-stub version
1788 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001789 // liba in myapex is linked to current
1790 expectLink("liba", "shared_apex29", "libz", "shared_current")
1791 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001792 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001793 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001794 // liba in otherapex is linked to current
1795 expectLink("liba", "shared_apex30", "libz", "shared_current")
1796 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001797 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1798 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001799}
1800
Jooyung Hanaed150d2020-04-02 01:41:41 +09001801func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001802 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001803 apex {
1804 name: "myapex",
1805 key: "myapex.key",
1806 native_shared_libs: ["libx"],
1807 min_sdk_version: "R",
1808 }
1809
1810 apex_key {
1811 name: "myapex.key",
1812 public_key: "testkey.avbpubkey",
1813 private_key: "testkey.pem",
1814 }
1815
1816 cc_library {
1817 name: "libx",
1818 shared_libs: ["libz"],
1819 system_shared_libs: [],
1820 stl: "none",
1821 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001822 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001823 }
1824
1825 cc_library {
1826 name: "libz",
1827 system_shared_libs: [],
1828 stl: "none",
1829 stubs: {
1830 versions: ["29", "R"],
1831 },
1832 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001833 `,
1834 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1835 variables.Platform_version_active_codenames = []string{"R"}
1836 }),
1837 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001838
1839 expectLink := func(from, from_variant, to, to_variant string) {
1840 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1841 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1842 }
1843 expectNoLink := func(from, from_variant, to, to_variant string) {
1844 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1845 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1846 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001847 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1848 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001849 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1850 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001851}
1852
Jooyung Han4c4da062021-06-23 10:23:16 +09001853func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1854 testApex(t, `
1855 apex {
1856 name: "myapex",
1857 key: "myapex.key",
1858 java_libs: ["libx"],
1859 min_sdk_version: "S",
1860 }
1861
1862 apex_key {
1863 name: "myapex.key",
1864 public_key: "testkey.avbpubkey",
1865 private_key: "testkey.pem",
1866 }
1867
1868 java_library {
1869 name: "libx",
1870 srcs: ["a.java"],
1871 apex_available: [ "myapex" ],
1872 sdk_version: "current",
1873 min_sdk_version: "S", // should be okay
1874 }
1875 `,
1876 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1877 variables.Platform_version_active_codenames = []string{"S"}
1878 variables.Platform_sdk_codename = proptools.StringPtr("S")
1879 }),
1880 )
1881}
1882
Jooyung Han749dc692020-04-15 11:03:39 +09001883func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001884 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001885 apex {
1886 name: "myapex",
1887 key: "myapex.key",
1888 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001889 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001890 }
1891
1892 apex_key {
1893 name: "myapex.key",
1894 public_key: "testkey.avbpubkey",
1895 private_key: "testkey.pem",
1896 }
1897
1898 cc_library {
1899 name: "libx",
1900 shared_libs: ["libz"],
1901 system_shared_libs: [],
1902 stl: "none",
1903 apex_available: [ "myapex" ],
1904 }
1905
1906 cc_library {
1907 name: "libz",
1908 system_shared_libs: [],
1909 stl: "none",
1910 stubs: {
1911 versions: ["1", "2"],
1912 },
1913 }
1914 `)
1915
1916 expectLink := func(from, from_variant, to, to_variant string) {
1917 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1918 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1919 }
1920 expectNoLink := func(from, from_variant, to, to_variant string) {
1921 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1922 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1923 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001924 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001925 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001926 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001927 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001928}
1929
Jiyong Park5df7bd32021-08-25 16:18:46 +09001930func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1931 ctx := testApex(t, `
1932 apex {
1933 name: "myapex",
1934 key: "myapex.key",
1935 native_shared_libs: ["mylib"],
1936 updatable: false,
1937 vendor: true,
1938 min_sdk_version: "29",
1939 }
1940
1941 apex_key {
1942 name: "myapex.key",
1943 public_key: "testkey.avbpubkey",
1944 private_key: "testkey.pem",
1945 }
1946
1947 cc_library {
1948 name: "mylib",
1949 vendor_available: true,
1950 system_shared_libs: [],
1951 stl: "none",
1952 apex_available: [ "myapex" ],
1953 min_sdk_version: "29",
1954 }
1955 `)
1956
1957 vendorVariant := "android_vendor.29_arm64_armv8-a"
1958
1959 // First check that the correct variant of crtbegin_so is used.
1960 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1961 crtBegin := names(ldRule.Args["crtBegin"])
1962 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1963
1964 // Ensure that the crtbegin_so used by the APEX is targeting 29
1965 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1966 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1967}
1968
Jooyung Han03b51852020-02-26 22:45:42 +09001969func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001970 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001971 apex {
1972 name: "myapex",
1973 key: "myapex.key",
1974 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001975 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001976 }
1977
1978 apex_key {
1979 name: "myapex.key",
1980 public_key: "testkey.avbpubkey",
1981 private_key: "testkey.pem",
1982 }
1983
1984 cc_library {
1985 name: "libx",
1986 system_shared_libs: [],
1987 stl: "none",
1988 apex_available: [ "myapex" ],
1989 stubs: {
1990 versions: ["1", "2"],
1991 },
1992 }
1993
1994 cc_library {
1995 name: "libz",
1996 shared_libs: ["libx"],
1997 system_shared_libs: [],
1998 stl: "none",
1999 }
2000 `)
2001
2002 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002003 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002004 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2005 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2006 }
2007 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002008 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002009 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2010 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2011 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002012 expectLink("libz", "shared", "libx", "shared_current")
2013 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002014 expectNoLink("libz", "shared", "libz", "shared_1")
2015 expectNoLink("libz", "shared", "libz", "shared")
2016}
2017
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002018var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2019 func(variables android.FixtureProductVariables) {
2020 variables.SanitizeDevice = []string{"hwaddress"}
2021 },
2022)
2023
Jooyung Han75568392020-03-20 04:29:24 +09002024func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002025 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002026 apex {
2027 name: "myapex",
2028 key: "myapex.key",
2029 native_shared_libs: ["libx"],
2030 min_sdk_version: "29",
2031 }
2032
2033 apex_key {
2034 name: "myapex.key",
2035 public_key: "testkey.avbpubkey",
2036 private_key: "testkey.pem",
2037 }
2038
2039 cc_library {
2040 name: "libx",
2041 shared_libs: ["libbar"],
2042 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002043 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002044 }
2045
2046 cc_library {
2047 name: "libbar",
2048 stubs: {
2049 versions: ["29", "30"],
2050 },
2051 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002052 `,
2053 prepareForTestWithSantitizeHwaddress,
2054 )
Jooyung Han03b51852020-02-26 22:45:42 +09002055 expectLink := func(from, from_variant, to, to_variant string) {
2056 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2057 libFlags := ld.Args["libFlags"]
2058 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2059 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002060 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002061}
2062
Jooyung Han75568392020-03-20 04:29:24 +09002063func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002064 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002065 apex {
2066 name: "myapex",
2067 key: "myapex.key",
2068 native_shared_libs: ["libx"],
2069 min_sdk_version: "29",
2070 }
2071
2072 apex_key {
2073 name: "myapex.key",
2074 public_key: "testkey.avbpubkey",
2075 private_key: "testkey.pem",
2076 }
2077
2078 cc_library {
2079 name: "libx",
2080 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002081 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002082 }
Jooyung Han75568392020-03-20 04:29:24 +09002083 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002084
2085 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002086 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002087 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002088 // note that platform variant is not.
2089 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002090 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002091}
2092
Jooyung Han749dc692020-04-15 11:03:39 +09002093func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2094 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002095 apex {
2096 name: "myapex",
2097 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002098 native_shared_libs: ["mylib"],
2099 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002100 }
2101
2102 apex_key {
2103 name: "myapex.key",
2104 public_key: "testkey.avbpubkey",
2105 private_key: "testkey.pem",
2106 }
Jooyung Han749dc692020-04-15 11:03:39 +09002107
2108 cc_library {
2109 name: "mylib",
2110 srcs: ["mylib.cpp"],
2111 system_shared_libs: [],
2112 stl: "none",
2113 apex_available: [
2114 "myapex",
2115 ],
2116 min_sdk_version: "30",
2117 }
2118 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002119
2120 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2121 apex {
2122 name: "myapex",
2123 key: "myapex.key",
2124 native_shared_libs: ["libfoo.ffi"],
2125 min_sdk_version: "29",
2126 }
2127
2128 apex_key {
2129 name: "myapex.key",
2130 public_key: "testkey.avbpubkey",
2131 private_key: "testkey.pem",
2132 }
2133
2134 rust_ffi_shared {
2135 name: "libfoo.ffi",
2136 srcs: ["foo.rs"],
2137 crate_name: "foo",
2138 apex_available: [
2139 "myapex",
2140 ],
2141 min_sdk_version: "30",
2142 }
2143 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002144
2145 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2146 apex {
2147 name: "myapex",
2148 key: "myapex.key",
2149 java_libs: ["libfoo"],
2150 min_sdk_version: "29",
2151 }
2152
2153 apex_key {
2154 name: "myapex.key",
2155 public_key: "testkey.avbpubkey",
2156 private_key: "testkey.pem",
2157 }
2158
2159 java_import {
2160 name: "libfoo",
2161 jars: ["libfoo.jar"],
2162 apex_available: [
2163 "myapex",
2164 ],
2165 min_sdk_version: "30",
2166 }
2167 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002168
2169 // Skip check for modules compiling against core API surface
2170 testApex(t, `
2171 apex {
2172 name: "myapex",
2173 key: "myapex.key",
2174 java_libs: ["libfoo"],
2175 min_sdk_version: "29",
2176 }
2177
2178 apex_key {
2179 name: "myapex.key",
2180 public_key: "testkey.avbpubkey",
2181 private_key: "testkey.pem",
2182 }
2183
2184 java_library {
2185 name: "libfoo",
2186 srcs: ["Foo.java"],
2187 apex_available: [
2188 "myapex",
2189 ],
2190 // Compile against core API surface
2191 sdk_version: "core_current",
2192 min_sdk_version: "30",
2193 }
2194 `)
2195
Jooyung Han749dc692020-04-15 11:03:39 +09002196}
2197
2198func TestApexMinSdkVersion_Okay(t *testing.T) {
2199 testApex(t, `
2200 apex {
2201 name: "myapex",
2202 key: "myapex.key",
2203 native_shared_libs: ["libfoo"],
2204 java_libs: ["libbar"],
2205 min_sdk_version: "29",
2206 }
2207
2208 apex_key {
2209 name: "myapex.key",
2210 public_key: "testkey.avbpubkey",
2211 private_key: "testkey.pem",
2212 }
2213
2214 cc_library {
2215 name: "libfoo",
2216 srcs: ["mylib.cpp"],
2217 shared_libs: ["libfoo_dep"],
2218 apex_available: ["myapex"],
2219 min_sdk_version: "29",
2220 }
2221
2222 cc_library {
2223 name: "libfoo_dep",
2224 srcs: ["mylib.cpp"],
2225 apex_available: ["myapex"],
2226 min_sdk_version: "29",
2227 }
2228
2229 java_library {
2230 name: "libbar",
2231 sdk_version: "current",
2232 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002233 static_libs: [
2234 "libbar_dep",
2235 "libbar_import_dep",
2236 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002237 apex_available: ["myapex"],
2238 min_sdk_version: "29",
2239 }
2240
2241 java_library {
2242 name: "libbar_dep",
2243 sdk_version: "current",
2244 srcs: ["a.java"],
2245 apex_available: ["myapex"],
2246 min_sdk_version: "29",
2247 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002248
2249 java_import {
2250 name: "libbar_import_dep",
2251 jars: ["libbar.jar"],
2252 apex_available: ["myapex"],
2253 min_sdk_version: "29",
2254 }
Jooyung Han03b51852020-02-26 22:45:42 +09002255 `)
2256}
2257
Colin Cross8ca61c12022-10-06 21:00:14 -07002258func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2259 // Tests that an apex dependency with min_sdk_version higher than the
2260 // min_sdk_version of the apex is allowed as long as the dependency's
2261 // min_sdk_version is less than or equal to the api level that the
2262 // architecture was introduced in. In this case, arm64 didn't exist
2263 // until api level 21, so the arm64 code will never need to run on
2264 // an api level 20 device, even if other architectures of the apex
2265 // will.
2266 testApex(t, `
2267 apex {
2268 name: "myapex",
2269 key: "myapex.key",
2270 native_shared_libs: ["libfoo"],
2271 min_sdk_version: "20",
2272 }
2273
2274 apex_key {
2275 name: "myapex.key",
2276 public_key: "testkey.avbpubkey",
2277 private_key: "testkey.pem",
2278 }
2279
2280 cc_library {
2281 name: "libfoo",
2282 srcs: ["mylib.cpp"],
2283 apex_available: ["myapex"],
2284 min_sdk_version: "21",
2285 stl: "none",
2286 }
2287 `)
2288}
2289
Artur Satayev8cf899a2020-04-15 17:29:42 +01002290func TestJavaStableSdkVersion(t *testing.T) {
2291 testCases := []struct {
2292 name string
2293 expectedError string
2294 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002295 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002296 }{
2297 {
2298 name: "Non-updatable apex with non-stable dep",
2299 bp: `
2300 apex {
2301 name: "myapex",
2302 java_libs: ["myjar"],
2303 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002304 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002305 }
2306 apex_key {
2307 name: "myapex.key",
2308 public_key: "testkey.avbpubkey",
2309 private_key: "testkey.pem",
2310 }
2311 java_library {
2312 name: "myjar",
2313 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002314 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002315 apex_available: ["myapex"],
2316 }
2317 `,
2318 },
2319 {
2320 name: "Updatable apex with stable dep",
2321 bp: `
2322 apex {
2323 name: "myapex",
2324 java_libs: ["myjar"],
2325 key: "myapex.key",
2326 updatable: true,
2327 min_sdk_version: "29",
2328 }
2329 apex_key {
2330 name: "myapex.key",
2331 public_key: "testkey.avbpubkey",
2332 private_key: "testkey.pem",
2333 }
2334 java_library {
2335 name: "myjar",
2336 srcs: ["foo/bar/MyClass.java"],
2337 sdk_version: "current",
2338 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002339 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002340 }
2341 `,
2342 },
2343 {
2344 name: "Updatable apex with non-stable dep",
2345 expectedError: "cannot depend on \"myjar\"",
2346 bp: `
2347 apex {
2348 name: "myapex",
2349 java_libs: ["myjar"],
2350 key: "myapex.key",
2351 updatable: true,
2352 }
2353 apex_key {
2354 name: "myapex.key",
2355 public_key: "testkey.avbpubkey",
2356 private_key: "testkey.pem",
2357 }
2358 java_library {
2359 name: "myjar",
2360 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002361 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002362 apex_available: ["myapex"],
2363 }
2364 `,
2365 },
2366 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002367 name: "Updatable apex with non-stable legacy core platform dep",
2368 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2369 bp: `
2370 apex {
2371 name: "myapex",
2372 java_libs: ["myjar-uses-legacy"],
2373 key: "myapex.key",
2374 updatable: true,
2375 }
2376 apex_key {
2377 name: "myapex.key",
2378 public_key: "testkey.avbpubkey",
2379 private_key: "testkey.pem",
2380 }
2381 java_library {
2382 name: "myjar-uses-legacy",
2383 srcs: ["foo/bar/MyClass.java"],
2384 sdk_version: "core_platform",
2385 apex_available: ["myapex"],
2386 }
2387 `,
2388 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2389 },
2390 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002391 name: "Updatable apex with non-stable transitive dep",
2392 // This is not actually detecting that the transitive dependency is unstable, rather it is
2393 // detecting that the transitive dependency is building against a wider API surface than the
2394 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002395 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002396 bp: `
2397 apex {
2398 name: "myapex",
2399 java_libs: ["myjar"],
2400 key: "myapex.key",
2401 updatable: true,
2402 }
2403 apex_key {
2404 name: "myapex.key",
2405 public_key: "testkey.avbpubkey",
2406 private_key: "testkey.pem",
2407 }
2408 java_library {
2409 name: "myjar",
2410 srcs: ["foo/bar/MyClass.java"],
2411 sdk_version: "current",
2412 apex_available: ["myapex"],
2413 static_libs: ["transitive-jar"],
2414 }
2415 java_library {
2416 name: "transitive-jar",
2417 srcs: ["foo/bar/MyClass.java"],
2418 sdk_version: "core_platform",
2419 apex_available: ["myapex"],
2420 }
2421 `,
2422 },
2423 }
2424
2425 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002426 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2427 continue
2428 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002429 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002430 errorHandler := android.FixtureExpectsNoErrors
2431 if test.expectedError != "" {
2432 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002433 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002434 android.GroupFixturePreparers(
2435 java.PrepareForTestWithJavaDefaultModules,
2436 PrepareForTestWithApexBuildComponents,
2437 prepareForTestWithMyapex,
2438 android.OptionalFixturePreparer(test.preparer),
2439 ).
2440 ExtendWithErrorHandler(errorHandler).
2441 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002442 })
2443 }
2444}
2445
Jooyung Han749dc692020-04-15 11:03:39 +09002446func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2447 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2448 apex {
2449 name: "myapex",
2450 key: "myapex.key",
2451 native_shared_libs: ["mylib"],
2452 min_sdk_version: "29",
2453 }
2454
2455 apex_key {
2456 name: "myapex.key",
2457 public_key: "testkey.avbpubkey",
2458 private_key: "testkey.pem",
2459 }
2460
2461 cc_library {
2462 name: "mylib",
2463 srcs: ["mylib.cpp"],
2464 shared_libs: ["mylib2"],
2465 system_shared_libs: [],
2466 stl: "none",
2467 apex_available: [
2468 "myapex",
2469 ],
2470 min_sdk_version: "29",
2471 }
2472
2473 // indirect part of the apex
2474 cc_library {
2475 name: "mylib2",
2476 srcs: ["mylib.cpp"],
2477 system_shared_libs: [],
2478 stl: "none",
2479 apex_available: [
2480 "myapex",
2481 ],
2482 min_sdk_version: "30",
2483 }
2484 `)
2485}
2486
2487func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2488 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2489 apex {
2490 name: "myapex",
2491 key: "myapex.key",
2492 apps: ["AppFoo"],
2493 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002494 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002495 }
2496
2497 apex_key {
2498 name: "myapex.key",
2499 public_key: "testkey.avbpubkey",
2500 private_key: "testkey.pem",
2501 }
2502
2503 android_app {
2504 name: "AppFoo",
2505 srcs: ["foo/bar/MyClass.java"],
2506 sdk_version: "current",
2507 min_sdk_version: "29",
2508 system_modules: "none",
2509 stl: "none",
2510 static_libs: ["bar"],
2511 apex_available: [ "myapex" ],
2512 }
2513
2514 java_library {
2515 name: "bar",
2516 sdk_version: "current",
2517 srcs: ["a.java"],
2518 apex_available: [ "myapex" ],
2519 }
2520 `)
2521}
2522
2523func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002524 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002525 apex {
2526 name: "myapex",
2527 key: "myapex.key",
2528 native_shared_libs: ["mylib"],
2529 min_sdk_version: "29",
2530 }
2531
2532 apex_key {
2533 name: "myapex.key",
2534 public_key: "testkey.avbpubkey",
2535 private_key: "testkey.pem",
2536 }
2537
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002538 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002539 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2540 cc_library {
2541 name: "mylib",
2542 srcs: ["mylib.cpp"],
2543 shared_libs: ["mylib2"],
2544 system_shared_libs: [],
2545 stl: "none",
2546 apex_available: ["myapex", "otherapex"],
2547 min_sdk_version: "29",
2548 }
2549
2550 cc_library {
2551 name: "mylib2",
2552 srcs: ["mylib.cpp"],
2553 system_shared_libs: [],
2554 stl: "none",
2555 apex_available: ["otherapex"],
2556 stubs: { versions: ["29", "30"] },
2557 min_sdk_version: "30",
2558 }
2559
2560 apex {
2561 name: "otherapex",
2562 key: "myapex.key",
2563 native_shared_libs: ["mylib", "mylib2"],
2564 min_sdk_version: "30",
2565 }
2566 `)
2567 expectLink := func(from, from_variant, to, to_variant string) {
2568 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2569 libFlags := ld.Args["libFlags"]
2570 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2571 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002572 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002573 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002574}
2575
Jooyung Haned124c32021-01-26 11:43:46 +09002576func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002577 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2578 func(variables android.FixtureProductVariables) {
2579 variables.Platform_sdk_codename = proptools.StringPtr("S")
2580 variables.Platform_version_active_codenames = []string{"S"}
2581 },
2582 )
Jooyung Haned124c32021-01-26 11:43:46 +09002583 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2584 apex {
2585 name: "myapex",
2586 key: "myapex.key",
2587 native_shared_libs: ["libfoo"],
2588 min_sdk_version: "S",
2589 }
2590 apex_key {
2591 name: "myapex.key",
2592 public_key: "testkey.avbpubkey",
2593 private_key: "testkey.pem",
2594 }
2595 cc_library {
2596 name: "libfoo",
2597 shared_libs: ["libbar"],
2598 apex_available: ["myapex"],
2599 min_sdk_version: "29",
2600 }
2601 cc_library {
2602 name: "libbar",
2603 apex_available: ["myapex"],
2604 }
2605 `, withSAsActiveCodeNames)
2606}
2607
2608func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002609 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2610 variables.Platform_sdk_codename = proptools.StringPtr("S")
2611 variables.Platform_version_active_codenames = []string{"S", "T"}
2612 })
Colin Cross1c460562021-02-16 17:55:47 -08002613 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002614 apex {
2615 name: "myapex",
2616 key: "myapex.key",
2617 native_shared_libs: ["libfoo"],
2618 min_sdk_version: "S",
2619 }
2620 apex_key {
2621 name: "myapex.key",
2622 public_key: "testkey.avbpubkey",
2623 private_key: "testkey.pem",
2624 }
2625 cc_library {
2626 name: "libfoo",
2627 shared_libs: ["libbar"],
2628 apex_available: ["myapex"],
2629 min_sdk_version: "S",
2630 }
2631 cc_library {
2632 name: "libbar",
2633 stubs: {
2634 symbol_file: "libbar.map.txt",
2635 versions: ["30", "S", "T"],
2636 },
2637 }
2638 `, withSAsActiveCodeNames)
2639
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002640 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002641 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2642 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002643 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002644}
2645
Jiyong Park7c2ee712018-12-07 00:42:25 +09002646func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002647 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002648 apex {
2649 name: "myapex",
2650 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002651 native_shared_libs: ["mylib"],
2652 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002653 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002654 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002655 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002656 }
2657
2658 apex_key {
2659 name: "myapex.key",
2660 public_key: "testkey.avbpubkey",
2661 private_key: "testkey.pem",
2662 }
2663
2664 prebuilt_etc {
2665 name: "myetc",
2666 src: "myprebuilt",
2667 sub_dir: "foo/bar",
2668 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002669
2670 cc_library {
2671 name: "mylib",
2672 srcs: ["mylib.cpp"],
2673 relative_install_path: "foo/bar",
2674 system_shared_libs: [],
2675 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002676 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002677 }
2678
2679 cc_binary {
2680 name: "mybin",
2681 srcs: ["mylib.cpp"],
2682 relative_install_path: "foo/bar",
2683 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002684 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002685 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002686 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002687 `)
2688
Sundong Ahnabb64432019-10-22 13:58:29 +09002689 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002690 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002691
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002692 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002693 ensureContains(t, cmd, "/etc ")
2694 ensureContains(t, cmd, "/etc/foo ")
2695 ensureContains(t, cmd, "/etc/foo/bar ")
2696 ensureContains(t, cmd, "/lib64 ")
2697 ensureContains(t, cmd, "/lib64/foo ")
2698 ensureContains(t, cmd, "/lib64/foo/bar ")
2699 ensureContains(t, cmd, "/lib ")
2700 ensureContains(t, cmd, "/lib/foo ")
2701 ensureContains(t, cmd, "/lib/foo/bar ")
2702 ensureContains(t, cmd, "/bin ")
2703 ensureContains(t, cmd, "/bin/foo ")
2704 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002705}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002706
Jooyung Han35155c42020-02-06 17:33:20 +09002707func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002708 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002709 apex {
2710 name: "myapex",
2711 key: "myapex.key",
2712 multilib: {
2713 both: {
2714 native_shared_libs: ["mylib"],
2715 binaries: ["mybin"],
2716 },
2717 },
2718 compile_multilib: "both",
2719 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002720 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002721 }
2722
2723 apex_key {
2724 name: "myapex.key",
2725 public_key: "testkey.avbpubkey",
2726 private_key: "testkey.pem",
2727 }
2728
2729 cc_library {
2730 name: "mylib",
2731 relative_install_path: "foo/bar",
2732 system_shared_libs: [],
2733 stl: "none",
2734 apex_available: [ "myapex" ],
2735 native_bridge_supported: true,
2736 }
2737
2738 cc_binary {
2739 name: "mybin",
2740 relative_install_path: "foo/bar",
2741 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002742 stl: "none",
2743 apex_available: [ "myapex" ],
2744 native_bridge_supported: true,
2745 compile_multilib: "both", // default is "first" for binary
2746 multilib: {
2747 lib64: {
2748 suffix: "64",
2749 },
2750 },
2751 }
2752 `, withNativeBridgeEnabled)
2753 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2754 "bin/foo/bar/mybin",
2755 "bin/foo/bar/mybin64",
2756 "bin/arm/foo/bar/mybin",
2757 "bin/arm64/foo/bar/mybin64",
2758 "lib/foo/bar/mylib.so",
2759 "lib/arm/foo/bar/mylib.so",
2760 "lib64/foo/bar/mylib.so",
2761 "lib64/arm64/foo/bar/mylib.so",
2762 })
2763}
2764
Jooyung Han85d61762020-06-24 23:50:26 +09002765func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002766 result := android.GroupFixturePreparers(
2767 prepareForApexTest,
2768 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2769 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002770 apex {
2771 name: "myapex",
2772 key: "myapex.key",
2773 binaries: ["mybin"],
2774 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002775 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002776 }
2777 apex_key {
2778 name: "myapex.key",
2779 public_key: "testkey.avbpubkey",
2780 private_key: "testkey.pem",
2781 }
2782 cc_binary {
2783 name: "mybin",
2784 vendor: true,
2785 shared_libs: ["libfoo"],
2786 }
2787 cc_library {
2788 name: "libfoo",
2789 proprietary: true,
2790 }
2791 `)
2792
Colin Crossc68db4b2021-11-11 18:59:15 -08002793 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002794 "bin/mybin",
2795 "lib64/libfoo.so",
2796 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2797 "lib64/libc++.so",
2798 })
2799
Colin Crossc68db4b2021-11-11 18:59:15 -08002800 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2801 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002802 name := apexBundle.BaseModuleName()
2803 prefix := "TARGET_"
2804 var builder strings.Builder
2805 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002806 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002807 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002808 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002809
Colin Crossc68db4b2021-11-11 18:59:15 -08002810 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002811 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2812 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002813}
2814
Jooyung Hanc5a96762022-02-04 11:54:50 +09002815func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2816 testApexError(t, `Trying to include a VNDK library`, `
2817 apex {
2818 name: "myapex",
2819 key: "myapex.key",
2820 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2821 vendor: true,
2822 use_vndk_as_stable: true,
2823 updatable: false,
2824 }
2825 apex_key {
2826 name: "myapex.key",
2827 public_key: "testkey.avbpubkey",
2828 private_key: "testkey.pem",
2829 }`)
2830}
2831
Jooyung Handf78e212020-07-22 15:54:47 +09002832func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002833 // myapex myapex2
2834 // | |
2835 // mybin ------. mybin2
2836 // \ \ / |
2837 // (stable) .---\--------` |
2838 // \ / \ |
2839 // \ / \ /
2840 // libvndk libvendor
2841 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002842 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002843 apex {
2844 name: "myapex",
2845 key: "myapex.key",
2846 binaries: ["mybin"],
2847 vendor: true,
2848 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002849 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002850 }
2851 apex_key {
2852 name: "myapex.key",
2853 public_key: "testkey.avbpubkey",
2854 private_key: "testkey.pem",
2855 }
2856 cc_binary {
2857 name: "mybin",
2858 vendor: true,
2859 shared_libs: ["libvndk", "libvendor"],
2860 }
2861 cc_library {
2862 name: "libvndk",
2863 vndk: {
2864 enabled: true,
2865 },
2866 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002867 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002868 }
2869 cc_library {
2870 name: "libvendor",
2871 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002872 stl: "none",
2873 }
2874 apex {
2875 name: "myapex2",
2876 key: "myapex.key",
2877 binaries: ["mybin2"],
2878 vendor: true,
2879 use_vndk_as_stable: false,
2880 updatable: false,
2881 }
2882 cc_binary {
2883 name: "mybin2",
2884 vendor: true,
2885 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002886 }
2887 `)
2888
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002889 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002890
Jooyung Han91f92032022-02-04 12:36:33 +09002891 for _, tc := range []struct {
2892 name string
2893 apexName string
2894 moduleName string
2895 moduleVariant string
2896 libs []string
2897 contents []string
2898 requireVndkNamespace bool
2899 }{
2900 {
2901 name: "use_vndk_as_stable",
2902 apexName: "myapex",
2903 moduleName: "mybin",
2904 moduleVariant: vendorVariant + "_apex10000",
2905 libs: []string{
2906 // should link with vendor variants of VNDK libs(libvndk/libc++)
2907 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2908 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2909 // unstable Vendor libs as APEX variant
2910 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2911 },
2912 contents: []string{
2913 "bin/mybin",
2914 "lib64/libvendor.so",
2915 // VNDK libs (libvndk/libc++) are not included
2916 },
2917 requireVndkNamespace: true,
2918 },
2919 {
2920 name: "!use_vndk_as_stable",
2921 apexName: "myapex2",
2922 moduleName: "mybin2",
2923 moduleVariant: vendorVariant + "_myapex2",
2924 libs: []string{
2925 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2926 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2927 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2928 // unstable vendor libs have "merged" APEX variants
2929 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2930 },
2931 contents: []string{
2932 "bin/mybin2",
2933 "lib64/libvendor.so",
2934 // VNDK libs are included as well
2935 "lib64/libvndk.so",
2936 "lib64/libc++.so",
2937 },
2938 requireVndkNamespace: false,
2939 },
2940 } {
2941 t.Run(tc.name, func(t *testing.T) {
2942 // Check linked libs
2943 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2944 libs := names(ldRule.Args["libFlags"])
2945 for _, lib := range tc.libs {
2946 ensureListContains(t, libs, lib)
2947 }
2948 // Check apex contents
2949 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002950
Jooyung Han91f92032022-02-04 12:36:33 +09002951 // Check "requireNativeLibs"
2952 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2953 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2954 if tc.requireVndkNamespace {
2955 ensureListContains(t, requireNativeLibs, ":vndk")
2956 } else {
2957 ensureListNotContains(t, requireNativeLibs, ":vndk")
2958 }
2959 })
2960 }
Jooyung Handf78e212020-07-22 15:54:47 +09002961}
2962
Justin Yun13decfb2021-03-08 19:25:55 +09002963func TestProductVariant(t *testing.T) {
2964 ctx := testApex(t, `
2965 apex {
2966 name: "myapex",
2967 key: "myapex.key",
2968 updatable: false,
2969 product_specific: true,
2970 binaries: ["foo"],
2971 }
2972
2973 apex_key {
2974 name: "myapex.key",
2975 public_key: "testkey.avbpubkey",
2976 private_key: "testkey.pem",
2977 }
2978
2979 cc_binary {
2980 name: "foo",
2981 product_available: true,
2982 apex_available: ["myapex"],
2983 srcs: ["foo.cpp"],
2984 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002985 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2986 variables.ProductVndkVersion = proptools.StringPtr("current")
2987 }),
2988 )
Justin Yun13decfb2021-03-08 19:25:55 +09002989
2990 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002991 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002992 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2993 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2994 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2995 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2996}
2997
Jooyung Han8e5685d2020-09-21 11:02:57 +09002998func TestApex_withPrebuiltFirmware(t *testing.T) {
2999 testCases := []struct {
3000 name string
3001 additionalProp string
3002 }{
3003 {"system apex with prebuilt_firmware", ""},
3004 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3005 }
3006 for _, tc := range testCases {
3007 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003008 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003009 apex {
3010 name: "myapex",
3011 key: "myapex.key",
3012 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003013 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003014 `+tc.additionalProp+`
3015 }
3016 apex_key {
3017 name: "myapex.key",
3018 public_key: "testkey.avbpubkey",
3019 private_key: "testkey.pem",
3020 }
3021 prebuilt_firmware {
3022 name: "myfirmware",
3023 src: "myfirmware.bin",
3024 filename_from_src: true,
3025 `+tc.additionalProp+`
3026 }
3027 `)
3028 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3029 "etc/firmware/myfirmware.bin",
3030 })
3031 })
3032 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003033}
3034
Jooyung Hanefb184e2020-06-25 17:14:25 +09003035func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003036 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003037 apex {
3038 name: "myapex",
3039 key: "myapex.key",
3040 vendor: true,
3041 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003042 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003043 }
3044
3045 apex_key {
3046 name: "myapex.key",
3047 public_key: "testkey.avbpubkey",
3048 private_key: "testkey.pem",
3049 }
3050
3051 cc_library {
3052 name: "mylib",
3053 vendor_available: true,
3054 }
3055 `)
3056
3057 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003058 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003059 name := apexBundle.BaseModuleName()
3060 prefix := "TARGET_"
3061 var builder strings.Builder
3062 data.Custom(&builder, name, prefix, "", data)
3063 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00003064 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003065}
3066
Jooyung Han2ed99d02020-06-24 23:26:26 +09003067func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003068 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003069 apex {
3070 name: "myapex",
3071 key: "myapex.key",
3072 vintf_fragments: ["fragment.xml"],
3073 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003074 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003075 }
3076 apex_key {
3077 name: "myapex.key",
3078 public_key: "testkey.avbpubkey",
3079 private_key: "testkey.pem",
3080 }
3081 cc_binary {
3082 name: "mybin",
3083 }
3084 `)
3085
3086 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003087 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003088 name := apexBundle.BaseModuleName()
3089 prefix := "TARGET_"
3090 var builder strings.Builder
3091 data.Custom(&builder, name, prefix, "", data)
3092 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003093 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003094 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003095}
3096
Jiyong Park16e91a02018-12-20 18:18:08 +09003097func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003098 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003099 apex {
3100 name: "myapex",
3101 key: "myapex.key",
3102 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003103 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003104 }
3105
3106 apex_key {
3107 name: "myapex.key",
3108 public_key: "testkey.avbpubkey",
3109 private_key: "testkey.pem",
3110 }
3111
3112 cc_library {
3113 name: "mylib",
3114 srcs: ["mylib.cpp"],
3115 system_shared_libs: [],
3116 stl: "none",
3117 stubs: {
3118 versions: ["1", "2", "3"],
3119 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003120 apex_available: [
3121 "//apex_available:platform",
3122 "myapex",
3123 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003124 }
3125
3126 cc_binary {
3127 name: "not_in_apex",
3128 srcs: ["mylib.cpp"],
3129 static_libs: ["mylib"],
3130 static_executable: true,
3131 system_shared_libs: [],
3132 stl: "none",
3133 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003134 `)
3135
Colin Cross7113d202019-11-20 16:39:12 -08003136 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003137
3138 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003139 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003140}
Jiyong Park9335a262018-12-24 11:31:58 +09003141
3142func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003143 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003144 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003145 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003146 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003147 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003148 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003149 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003150 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003151 }
3152
3153 cc_library {
3154 name: "mylib",
3155 srcs: ["mylib.cpp"],
3156 system_shared_libs: [],
3157 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003158 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003159 }
3160
3161 apex_key {
3162 name: "myapex.key",
3163 public_key: "testkey.avbpubkey",
3164 private_key: "testkey.pem",
3165 }
3166
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003167 android_app_certificate {
3168 name: "myapex.certificate",
3169 certificate: "testkey",
3170 }
3171
3172 android_app_certificate {
3173 name: "myapex.certificate.override",
3174 certificate: "testkey.override",
3175 }
3176
Jiyong Park9335a262018-12-24 11:31:58 +09003177 `)
3178
3179 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003180 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003181
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003182 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3183 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003184 "vendor/foo/devkeys/testkey.avbpubkey")
3185 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003186 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3187 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003188 "vendor/foo/devkeys/testkey.pem")
3189 }
3190
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003191 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003192 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003193 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003194 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003195 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003196 }
3197}
Jiyong Park58e364a2019-01-19 19:24:06 +09003198
Jooyung Hanf121a652019-12-17 14:30:11 +09003199func TestCertificate(t *testing.T) {
3200 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003201 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003202 apex {
3203 name: "myapex",
3204 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003205 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003206 }
3207 apex_key {
3208 name: "myapex.key",
3209 public_key: "testkey.avbpubkey",
3210 private_key: "testkey.pem",
3211 }`)
3212 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3213 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3214 if actual := rule.Args["certificates"]; actual != expected {
3215 t.Errorf("certificates should be %q, not %q", expected, actual)
3216 }
3217 })
3218 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003219 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003220 apex {
3221 name: "myapex_keytest",
3222 key: "myapex.key",
3223 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003224 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003225 }
3226 apex_key {
3227 name: "myapex.key",
3228 public_key: "testkey.avbpubkey",
3229 private_key: "testkey.pem",
3230 }
3231 android_app_certificate {
3232 name: "myapex.certificate.override",
3233 certificate: "testkey.override",
3234 }`)
3235 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3236 expected := "testkey.override.x509.pem testkey.override.pk8"
3237 if actual := rule.Args["certificates"]; actual != expected {
3238 t.Errorf("certificates should be %q, not %q", expected, actual)
3239 }
3240 })
3241 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003242 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003243 apex {
3244 name: "myapex",
3245 key: "myapex.key",
3246 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003247 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003248 }
3249 apex_key {
3250 name: "myapex.key",
3251 public_key: "testkey.avbpubkey",
3252 private_key: "testkey.pem",
3253 }
3254 android_app_certificate {
3255 name: "myapex.certificate",
3256 certificate: "testkey",
3257 }`)
3258 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3259 expected := "testkey.x509.pem testkey.pk8"
3260 if actual := rule.Args["certificates"]; actual != expected {
3261 t.Errorf("certificates should be %q, not %q", expected, actual)
3262 }
3263 })
3264 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003265 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003266 apex {
3267 name: "myapex_keytest",
3268 key: "myapex.key",
3269 file_contexts: ":myapex-file_contexts",
3270 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003271 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003272 }
3273 apex_key {
3274 name: "myapex.key",
3275 public_key: "testkey.avbpubkey",
3276 private_key: "testkey.pem",
3277 }
3278 android_app_certificate {
3279 name: "myapex.certificate.override",
3280 certificate: "testkey.override",
3281 }`)
3282 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3283 expected := "testkey.override.x509.pem testkey.override.pk8"
3284 if actual := rule.Args["certificates"]; actual != expected {
3285 t.Errorf("certificates should be %q, not %q", expected, actual)
3286 }
3287 })
3288 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003289 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003290 apex {
3291 name: "myapex",
3292 key: "myapex.key",
3293 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003294 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003295 }
3296 apex_key {
3297 name: "myapex.key",
3298 public_key: "testkey.avbpubkey",
3299 private_key: "testkey.pem",
3300 }`)
3301 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3302 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3303 if actual := rule.Args["certificates"]; actual != expected {
3304 t.Errorf("certificates should be %q, not %q", expected, actual)
3305 }
3306 })
3307 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003308 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003309 apex {
3310 name: "myapex_keytest",
3311 key: "myapex.key",
3312 file_contexts: ":myapex-file_contexts",
3313 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003314 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003315 }
3316 apex_key {
3317 name: "myapex.key",
3318 public_key: "testkey.avbpubkey",
3319 private_key: "testkey.pem",
3320 }
3321 android_app_certificate {
3322 name: "myapex.certificate.override",
3323 certificate: "testkey.override",
3324 }`)
3325 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3326 expected := "testkey.override.x509.pem testkey.override.pk8"
3327 if actual := rule.Args["certificates"]; actual != expected {
3328 t.Errorf("certificates should be %q, not %q", expected, actual)
3329 }
3330 })
3331}
3332
Jiyong Park58e364a2019-01-19 19:24:06 +09003333func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003334 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003335 apex {
3336 name: "myapex",
3337 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003338 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003339 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003340 }
3341
3342 apex {
3343 name: "otherapex",
3344 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003345 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003346 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003347 }
3348
3349 apex_key {
3350 name: "myapex.key",
3351 public_key: "testkey.avbpubkey",
3352 private_key: "testkey.pem",
3353 }
3354
3355 cc_library {
3356 name: "mylib",
3357 srcs: ["mylib.cpp"],
3358 system_shared_libs: [],
3359 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003360 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003361 "myapex",
3362 "otherapex",
3363 ],
Jooyung Han24282772020-03-21 23:20:55 +09003364 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003365 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003366 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003367 cc_library {
3368 name: "mylib2",
3369 srcs: ["mylib.cpp"],
3370 system_shared_libs: [],
3371 stl: "none",
3372 apex_available: [
3373 "myapex",
3374 "otherapex",
3375 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003376 static_libs: ["mylib3"],
3377 recovery_available: true,
3378 min_sdk_version: "29",
3379 }
3380 cc_library {
3381 name: "mylib3",
3382 srcs: ["mylib.cpp"],
3383 system_shared_libs: [],
3384 stl: "none",
3385 apex_available: [
3386 "myapex",
3387 "otherapex",
3388 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003389 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003390 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003391 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003392 `)
3393
Jooyung Hanc87a0592020-03-02 17:44:33 +09003394 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003395 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003396 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003397
Vinh Tranf9754732023-01-19 22:41:46 -05003398 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003399 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003400 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003401
Vinh Tranf9754732023-01-19 22:41:46 -05003402 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003403 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003404 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003405
Colin Crossaede88c2020-08-11 12:17:01 -07003406 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3407 // each variant defines additional macros to distinguish which apex variant it is built for
3408
3409 // non-APEX variant does not have __ANDROID_APEX__ defined
3410 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3411 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3412
Vinh Tranf9754732023-01-19 22:41:46 -05003413 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003414 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3415 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003416
Jooyung Hanc87a0592020-03-02 17:44:33 +09003417 // non-APEX variant does not have __ANDROID_APEX__ defined
3418 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3419 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3420
Vinh Tranf9754732023-01-19 22:41:46 -05003421 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003422 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003423 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003424}
Jiyong Park7e636d02019-01-28 16:16:54 +09003425
3426func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003427 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003428 apex {
3429 name: "myapex",
3430 key: "myapex.key",
3431 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003432 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003433 }
3434
3435 apex_key {
3436 name: "myapex.key",
3437 public_key: "testkey.avbpubkey",
3438 private_key: "testkey.pem",
3439 }
3440
3441 cc_library_headers {
3442 name: "mylib_headers",
3443 export_include_dirs: ["my_include"],
3444 system_shared_libs: [],
3445 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003446 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003447 }
3448
3449 cc_library {
3450 name: "mylib",
3451 srcs: ["mylib.cpp"],
3452 system_shared_libs: [],
3453 stl: "none",
3454 header_libs: ["mylib_headers"],
3455 export_header_lib_headers: ["mylib_headers"],
3456 stubs: {
3457 versions: ["1", "2", "3"],
3458 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003459 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003460 }
3461
3462 cc_library {
3463 name: "otherlib",
3464 srcs: ["mylib.cpp"],
3465 system_shared_libs: [],
3466 stl: "none",
3467 shared_libs: ["mylib"],
3468 }
3469 `)
3470
Colin Cross7113d202019-11-20 16:39:12 -08003471 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003472
3473 // Ensure that the include path of the header lib is exported to 'otherlib'
3474 ensureContains(t, cFlags, "-Imy_include")
3475}
Alex Light9670d332019-01-29 18:07:33 -08003476
Jiyong Park7cd10e32020-01-14 09:22:18 +09003477type fileInApex struct {
3478 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003479 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003480 isLink bool
3481}
3482
Jooyung Han1724d582022-12-21 10:17:44 +09003483func (f fileInApex) String() string {
3484 return f.src + ":" + f.path
3485}
3486
3487func (f fileInApex) match(expectation string) bool {
3488 parts := strings.Split(expectation, ":")
3489 if len(parts) == 1 {
3490 match, _ := path.Match(parts[0], f.path)
3491 return match
3492 }
3493 if len(parts) == 2 {
3494 matchSrc, _ := path.Match(parts[0], f.src)
3495 matchDst, _ := path.Match(parts[1], f.path)
3496 return matchSrc && matchDst
3497 }
3498 panic("invalid expected file specification: " + expectation)
3499}
3500
Jooyung Hana57af4a2020-01-23 05:36:59 +00003501func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003502 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003503 module := ctx.ModuleForTests(moduleName, variant)
3504 apexRule := module.MaybeRule("apexRule")
3505 apexDir := "/image.apex/"
3506 if apexRule.Rule == nil {
3507 apexRule = module.Rule("zipApexRule")
3508 apexDir = "/image.zipapex/"
3509 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003510 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003511 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003512 for _, cmd := range strings.Split(copyCmds, "&&") {
3513 cmd = strings.TrimSpace(cmd)
3514 if cmd == "" {
3515 continue
3516 }
3517 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003518 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003519 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003520 switch terms[0] {
3521 case "mkdir":
3522 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003523 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003524 t.Fatal("copyCmds contains invalid cp command", cmd)
3525 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003526 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003527 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003528 isLink = false
3529 case "ln":
3530 if len(terms) != 3 && len(terms) != 4 {
3531 // ln LINK TARGET or ln -s LINK TARGET
3532 t.Fatal("copyCmds contains invalid ln command", cmd)
3533 }
3534 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003535 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003536 isLink = true
3537 default:
3538 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3539 }
3540 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003541 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003542 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003543 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003544 }
Jooyung Han1724d582022-12-21 10:17:44 +09003545 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003546 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003547 }
3548 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003549 return ret
3550}
3551
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003552func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003553 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003554 var failed bool
3555 var surplus []string
3556 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003557 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003558 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003559 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003560 if file.match(expected) {
3561 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003562 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003563 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003564 }
3565 }
Jooyung Han1724d582022-12-21 10:17:44 +09003566 if !matchFound {
3567 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003568 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003569 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003570
Jooyung Han31c470b2019-10-18 16:26:59 +09003571 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003572 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003573 t.Log("surplus files", surplus)
3574 failed = true
3575 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003576
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003577 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003578 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003579 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003580 if !filesMatched[expected] {
3581 missing = append(missing, expected)
3582 }
3583 }
3584 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003585 t.Log("missing files", missing)
3586 failed = true
3587 }
3588 if failed {
3589 t.Fail()
3590 }
3591}
3592
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003593func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3594 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3595}
3596
3597func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3598 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3599 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3600 if deapexer.Output != nil {
3601 outputs = append(outputs, deapexer.Output.String())
3602 }
3603 for _, output := range deapexer.ImplicitOutputs {
3604 outputs = append(outputs, output.String())
3605 }
3606 actualFiles := make([]fileInApex, 0, len(outputs))
3607 for _, output := range outputs {
3608 dir := "/deapexer/"
3609 pos := strings.LastIndex(output, dir)
3610 if pos == -1 {
3611 t.Fatal("Unknown deapexer output ", output)
3612 }
3613 path := output[pos+len(dir):]
3614 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3615 }
3616 assertFileListEquals(t, files, actualFiles)
3617}
3618
Jooyung Han344d5432019-08-23 11:17:39 +09003619func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003620 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003621 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003622 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003623 "etc/llndk.libraries.29.txt",
3624 "etc/vndkcore.libraries.29.txt",
3625 "etc/vndksp.libraries.29.txt",
3626 "etc/vndkprivate.libraries.29.txt",
3627 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003628 }
3629 testCases := []struct {
3630 vndkVersion string
3631 expectedFiles []string
3632 }{
3633 {
3634 vndkVersion: "current",
3635 expectedFiles: append(commonFiles,
3636 "lib/libvndk.so",
3637 "lib/libvndksp.so",
3638 "lib64/libvndk.so",
3639 "lib64/libvndksp.so"),
3640 },
3641 {
3642 vndkVersion: "",
3643 expectedFiles: append(commonFiles,
3644 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3645 "lib/libvndksp.so",
3646 "lib64/libvndksp.so"),
3647 },
3648 }
3649 for _, tc := range testCases {
3650 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3651 ctx := testApex(t, `
3652 apex_vndk {
3653 name: "com.android.vndk.current",
3654 key: "com.android.vndk.current.key",
3655 updatable: false,
3656 }
3657
3658 apex_key {
3659 name: "com.android.vndk.current.key",
3660 public_key: "testkey.avbpubkey",
3661 private_key: "testkey.pem",
3662 }
3663
3664 cc_library {
3665 name: "libvndk",
3666 srcs: ["mylib.cpp"],
3667 vendor_available: true,
3668 product_available: true,
3669 vndk: {
3670 enabled: true,
3671 },
3672 system_shared_libs: [],
3673 stl: "none",
3674 apex_available: [ "com.android.vndk.current" ],
3675 }
3676
3677 cc_library {
3678 name: "libvndksp",
3679 srcs: ["mylib.cpp"],
3680 vendor_available: true,
3681 product_available: true,
3682 vndk: {
3683 enabled: true,
3684 support_system_process: true,
3685 },
3686 system_shared_libs: [],
3687 stl: "none",
3688 apex_available: [ "com.android.vndk.current" ],
3689 }
3690
3691 // VNDK-Ext should not cause any problems
3692
3693 cc_library {
3694 name: "libvndk.ext",
3695 srcs: ["mylib2.cpp"],
3696 vendor: true,
3697 vndk: {
3698 enabled: true,
3699 extends: "libvndk",
3700 },
3701 system_shared_libs: [],
3702 stl: "none",
3703 }
3704
3705 cc_library {
3706 name: "libvndksp.ext",
3707 srcs: ["mylib2.cpp"],
3708 vendor: true,
3709 vndk: {
3710 enabled: true,
3711 support_system_process: true,
3712 extends: "libvndksp",
3713 },
3714 system_shared_libs: [],
3715 stl: "none",
3716 }
3717 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3718 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3719 }))
3720 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3721 })
3722 }
Jooyung Han344d5432019-08-23 11:17:39 +09003723}
3724
3725func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003726 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003727 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003728 name: "com.android.vndk.current",
3729 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003730 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003731 }
3732
3733 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003734 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003735 public_key: "testkey.avbpubkey",
3736 private_key: "testkey.pem",
3737 }
3738
3739 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003740 name: "libvndk",
3741 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003742 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003743 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003744 vndk: {
3745 enabled: true,
3746 },
3747 system_shared_libs: [],
3748 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003749 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003750 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003751
3752 cc_prebuilt_library_shared {
3753 name: "libvndk.arm",
3754 srcs: ["libvndk.arm.so"],
3755 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003756 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003757 vndk: {
3758 enabled: true,
3759 },
3760 enabled: false,
3761 arch: {
3762 arm: {
3763 enabled: true,
3764 },
3765 },
3766 system_shared_libs: [],
3767 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003768 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003769 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003770 `+vndkLibrariesTxtFiles("current"),
3771 withFiles(map[string][]byte{
3772 "libvndk.so": nil,
3773 "libvndk.arm.so": nil,
3774 }))
Colin Cross2807f002021-03-02 10:15:29 -08003775 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003776 "lib/libvndk.so",
3777 "lib/libvndk.arm.so",
3778 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003779 "lib/libc++.so",
3780 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003781 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003782 })
Jooyung Han344d5432019-08-23 11:17:39 +09003783}
3784
Jooyung Han39edb6c2019-11-06 16:53:07 +09003785func vndkLibrariesTxtFiles(vers ...string) (result string) {
3786 for _, v := range vers {
3787 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003788 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003789 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003790 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003791 name: "` + txt + `.libraries.txt",
3792 }
3793 `
3794 }
3795 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003796 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003797 result += `
3798 prebuilt_etc {
3799 name: "` + txt + `.libraries.` + v + `.txt",
3800 src: "dummy.txt",
3801 }
3802 `
3803 }
3804 }
3805 }
3806 return
3807}
3808
Jooyung Han344d5432019-08-23 11:17:39 +09003809func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003810 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003811 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003812 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003813 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003814 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003815 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003816 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003817 }
3818
3819 apex_key {
3820 name: "myapex.key",
3821 public_key: "testkey.avbpubkey",
3822 private_key: "testkey.pem",
3823 }
3824
Jooyung Han31c470b2019-10-18 16:26:59 +09003825 vndk_prebuilt_shared {
3826 name: "libvndk27",
3827 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003828 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003829 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003830 vndk: {
3831 enabled: true,
3832 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003833 target_arch: "arm64",
3834 arch: {
3835 arm: {
3836 srcs: ["libvndk27_arm.so"],
3837 },
3838 arm64: {
3839 srcs: ["libvndk27_arm64.so"],
3840 },
3841 },
Colin Cross2807f002021-03-02 10:15:29 -08003842 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003843 }
3844
3845 vndk_prebuilt_shared {
3846 name: "libvndk27",
3847 version: "27",
3848 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003849 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003850 vndk: {
3851 enabled: true,
3852 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003853 target_arch: "x86_64",
3854 arch: {
3855 x86: {
3856 srcs: ["libvndk27_x86.so"],
3857 },
3858 x86_64: {
3859 srcs: ["libvndk27_x86_64.so"],
3860 },
3861 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003862 }
3863 `+vndkLibrariesTxtFiles("27"),
3864 withFiles(map[string][]byte{
3865 "libvndk27_arm.so": nil,
3866 "libvndk27_arm64.so": nil,
3867 "libvndk27_x86.so": nil,
3868 "libvndk27_x86_64.so": nil,
3869 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003870
Colin Cross2807f002021-03-02 10:15:29 -08003871 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003872 "lib/libvndk27_arm.so",
3873 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003874 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003875 })
Jooyung Han344d5432019-08-23 11:17:39 +09003876}
3877
Jooyung Han90eee022019-10-01 20:02:42 +09003878func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003879 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003880 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003881 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003882 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003883 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003884 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003885 }
3886 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003887 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003888 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003889 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003890 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003891 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003892 }
3893 apex_key {
3894 name: "myapex.key",
3895 public_key: "testkey.avbpubkey",
3896 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003897 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003898
3899 assertApexName := func(expected, moduleName string) {
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09003900 module := ctx.ModuleForTests(moduleName, "android_common_image")
3901 apexManifestRule := module.Rule("apexManifestRule")
3902 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09003903 }
3904
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003905 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003906 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003907}
3908
Jooyung Han344d5432019-08-23 11:17:39 +09003909func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003910 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003911 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003912 name: "com.android.vndk.current",
3913 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003914 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003915 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003916 }
3917
3918 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003919 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003920 public_key: "testkey.avbpubkey",
3921 private_key: "testkey.pem",
3922 }
3923
3924 cc_library {
3925 name: "libvndk",
3926 srcs: ["mylib.cpp"],
3927 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003928 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003929 native_bridge_supported: true,
3930 host_supported: true,
3931 vndk: {
3932 enabled: true,
3933 },
3934 system_shared_libs: [],
3935 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003936 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003937 }
Colin Cross2807f002021-03-02 10:15:29 -08003938 `+vndkLibrariesTxtFiles("current"),
3939 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003940
Colin Cross2807f002021-03-02 10:15:29 -08003941 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003942 "lib/libvndk.so",
3943 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003944 "lib/libc++.so",
3945 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003946 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003947 })
Jooyung Han344d5432019-08-23 11:17:39 +09003948}
3949
3950func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003951 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003952 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003953 name: "com.android.vndk.current",
3954 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003955 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003956 native_bridge_supported: true,
3957 }
3958
3959 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003960 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003961 public_key: "testkey.avbpubkey",
3962 private_key: "testkey.pem",
3963 }
3964
3965 cc_library {
3966 name: "libvndk",
3967 srcs: ["mylib.cpp"],
3968 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003969 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003970 native_bridge_supported: true,
3971 host_supported: true,
3972 vndk: {
3973 enabled: true,
3974 },
3975 system_shared_libs: [],
3976 stl: "none",
3977 }
3978 `)
3979}
3980
Jooyung Han31c470b2019-10-18 16:26:59 +09003981func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003982 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003983 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003984 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003985 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003986 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003987 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003988 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003989 }
3990
3991 apex_key {
3992 name: "myapex.key",
3993 public_key: "testkey.avbpubkey",
3994 private_key: "testkey.pem",
3995 }
3996
3997 vndk_prebuilt_shared {
3998 name: "libvndk27",
3999 version: "27",
4000 target_arch: "arm",
4001 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004002 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004003 vndk: {
4004 enabled: true,
4005 },
4006 arch: {
4007 arm: {
4008 srcs: ["libvndk27.so"],
4009 }
4010 },
4011 }
4012
4013 vndk_prebuilt_shared {
4014 name: "libvndk27",
4015 version: "27",
4016 target_arch: "arm",
4017 binder32bit: true,
4018 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004019 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004020 vndk: {
4021 enabled: true,
4022 },
4023 arch: {
4024 arm: {
4025 srcs: ["libvndk27binder32.so"],
4026 }
4027 },
Colin Cross2807f002021-03-02 10:15:29 -08004028 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004029 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004030 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004031 withFiles(map[string][]byte{
4032 "libvndk27.so": nil,
4033 "libvndk27binder32.so": nil,
4034 }),
4035 withBinder32bit,
4036 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004037 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004038 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4039 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004040 },
4041 }),
4042 )
4043
Colin Cross2807f002021-03-02 10:15:29 -08004044 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004045 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004046 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004047 })
4048}
4049
Jooyung Han45a96772020-06-15 14:59:42 +09004050func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004051 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004052 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004053 name: "com.android.vndk.current",
4054 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004055 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004056 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004057 }
4058
4059 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004060 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004061 public_key: "testkey.avbpubkey",
4062 private_key: "testkey.pem",
4063 }
4064
4065 cc_library {
4066 name: "libz",
4067 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004068 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004069 vndk: {
4070 enabled: true,
4071 },
4072 stubs: {
4073 symbol_file: "libz.map.txt",
4074 versions: ["30"],
4075 }
4076 }
4077 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4078 "libz.map.txt": nil,
4079 }))
4080
Colin Cross2807f002021-03-02 10:15:29 -08004081 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004082 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4083 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09004084 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
4085 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4086 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4087 "*/*",
4088 })
Jooyung Han45a96772020-06-15 14:59:42 +09004089}
4090
Jooyung Hane1633032019-08-01 17:41:43 +09004091func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004092 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004093 apex {
4094 name: "myapex_nodep",
4095 key: "myapex.key",
4096 native_shared_libs: ["lib_nodep"],
4097 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004098 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004099 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004100 }
4101
4102 apex {
4103 name: "myapex_dep",
4104 key: "myapex.key",
4105 native_shared_libs: ["lib_dep"],
4106 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004107 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004108 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004109 }
4110
4111 apex {
4112 name: "myapex_provider",
4113 key: "myapex.key",
4114 native_shared_libs: ["libfoo"],
4115 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004116 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004117 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004118 }
4119
4120 apex {
4121 name: "myapex_selfcontained",
4122 key: "myapex.key",
4123 native_shared_libs: ["lib_dep", "libfoo"],
4124 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004125 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004126 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004127 }
4128
4129 apex_key {
4130 name: "myapex.key",
4131 public_key: "testkey.avbpubkey",
4132 private_key: "testkey.pem",
4133 }
4134
4135 cc_library {
4136 name: "lib_nodep",
4137 srcs: ["mylib.cpp"],
4138 system_shared_libs: [],
4139 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004140 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004141 }
4142
4143 cc_library {
4144 name: "lib_dep",
4145 srcs: ["mylib.cpp"],
4146 shared_libs: ["libfoo"],
4147 system_shared_libs: [],
4148 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004149 apex_available: [
4150 "myapex_dep",
4151 "myapex_provider",
4152 "myapex_selfcontained",
4153 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004154 }
4155
4156 cc_library {
4157 name: "libfoo",
4158 srcs: ["mytest.cpp"],
4159 stubs: {
4160 versions: ["1"],
4161 },
4162 system_shared_libs: [],
4163 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004164 apex_available: [
4165 "myapex_provider",
4166 "myapex_selfcontained",
4167 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004168 }
4169 `)
4170
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004171 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004172 var provideNativeLibs, requireNativeLibs []string
4173
Sundong Ahnabb64432019-10-22 13:58:29 +09004174 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004175 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4176 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004177 ensureListEmpty(t, provideNativeLibs)
4178 ensureListEmpty(t, requireNativeLibs)
4179
Sundong Ahnabb64432019-10-22 13:58:29 +09004180 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004181 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4182 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004183 ensureListEmpty(t, provideNativeLibs)
4184 ensureListContains(t, requireNativeLibs, "libfoo.so")
4185
Sundong Ahnabb64432019-10-22 13:58:29 +09004186 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004187 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4188 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004189 ensureListContains(t, provideNativeLibs, "libfoo.so")
4190 ensureListEmpty(t, requireNativeLibs)
4191
Sundong Ahnabb64432019-10-22 13:58:29 +09004192 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004193 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4194 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004195 ensureListContains(t, provideNativeLibs, "libfoo.so")
4196 ensureListEmpty(t, requireNativeLibs)
4197}
4198
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004199func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4200 ctx := testApex(t, `
4201 apex {
4202 name: "myapex",
4203 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004204 native_shared_libs: ["mylib"],
4205 updatable: false,
4206 }
4207
4208 apex_key {
4209 name: "myapex.key",
4210 public_key: "testkey.avbpubkey",
4211 private_key: "testkey.pem",
4212 }
4213
4214 cc_library {
4215 name: "mylib",
4216 srcs: ["mylib.cpp"],
4217 system_shared_libs: [],
4218 stl: "none",
4219 apex_available: [
4220 "//apex_available:platform",
4221 "myapex",
4222 ],
4223 }
4224 `, android.FixtureMergeEnv(map[string]string{
4225 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4226 }))
4227
Jooyung Han63dff462023-02-09 00:11:27 +00004228 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004229 apexManifestRule := module.Rule("apexManifestRule")
4230 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4231}
4232
Vinh Tran8f5310f2022-10-07 18:16:47 -04004233func TestCompileMultilibProp(t *testing.T) {
4234 testCases := []struct {
4235 compileMultiLibProp string
4236 containedLibs []string
4237 notContainedLibs []string
4238 }{
4239 {
4240 containedLibs: []string{
4241 "image.apex/lib64/mylib.so",
4242 "image.apex/lib/mylib.so",
4243 },
4244 compileMultiLibProp: `compile_multilib: "both",`,
4245 },
4246 {
4247 containedLibs: []string{"image.apex/lib64/mylib.so"},
4248 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4249 compileMultiLibProp: `compile_multilib: "first",`,
4250 },
4251 {
4252 containedLibs: []string{"image.apex/lib64/mylib.so"},
4253 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4254 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4255 },
4256 {
4257 containedLibs: []string{"image.apex/lib64/mylib.so"},
4258 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4259 compileMultiLibProp: `compile_multilib: "64",`,
4260 },
4261 {
4262 containedLibs: []string{"image.apex/lib/mylib.so"},
4263 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4264 compileMultiLibProp: `compile_multilib: "32",`,
4265 },
4266 }
4267 for _, testCase := range testCases {
4268 ctx := testApex(t, fmt.Sprintf(`
4269 apex {
4270 name: "myapex",
4271 key: "myapex.key",
4272 %s
4273 native_shared_libs: ["mylib"],
4274 updatable: false,
4275 }
4276 apex_key {
4277 name: "myapex.key",
4278 public_key: "testkey.avbpubkey",
4279 private_key: "testkey.pem",
4280 }
4281 cc_library {
4282 name: "mylib",
4283 srcs: ["mylib.cpp"],
4284 apex_available: [
4285 "//apex_available:platform",
4286 "myapex",
4287 ],
4288 }
4289 `, testCase.compileMultiLibProp),
4290 )
4291 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4292 apexRule := module.Rule("apexRule")
4293 copyCmds := apexRule.Args["copy_commands"]
4294 for _, containedLib := range testCase.containedLibs {
4295 ensureContains(t, copyCmds, containedLib)
4296 }
4297 for _, notContainedLib := range testCase.notContainedLibs {
4298 ensureNotContains(t, copyCmds, notContainedLib)
4299 }
4300 }
4301}
4302
Alex Light0851b882019-02-07 13:20:53 -08004303func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004304 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004305 apex {
4306 name: "myapex",
4307 key: "myapex.key",
4308 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004309 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004310 }
4311
4312 apex_key {
4313 name: "myapex.key",
4314 public_key: "testkey.avbpubkey",
4315 private_key: "testkey.pem",
4316 }
4317
4318 cc_library {
4319 name: "mylib_common",
4320 srcs: ["mylib.cpp"],
4321 system_shared_libs: [],
4322 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004323 apex_available: [
4324 "//apex_available:platform",
4325 "myapex",
4326 ],
Alex Light0851b882019-02-07 13:20:53 -08004327 }
4328 `)
4329
Sundong Ahnabb64432019-10-22 13:58:29 +09004330 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004331 apexRule := module.Rule("apexRule")
4332 copyCmds := apexRule.Args["copy_commands"]
4333
4334 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4335 t.Log("Apex was a test apex!")
4336 t.Fail()
4337 }
4338 // Ensure that main rule creates an output
4339 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4340
4341 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004342 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004343
4344 // Ensure that both direct and indirect deps are copied into apex
4345 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4346
Colin Cross7113d202019-11-20 16:39:12 -08004347 // Ensure that the platform variant ends with _shared
4348 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004349
Colin Cross56a83212020-09-15 18:30:11 -07004350 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004351 t.Log("Found mylib_common not in any apex!")
4352 t.Fail()
4353 }
4354}
4355
4356func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004357 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004358 apex_test {
4359 name: "myapex",
4360 key: "myapex.key",
4361 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004362 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004363 }
4364
4365 apex_key {
4366 name: "myapex.key",
4367 public_key: "testkey.avbpubkey",
4368 private_key: "testkey.pem",
4369 }
4370
4371 cc_library {
4372 name: "mylib_common_test",
4373 srcs: ["mylib.cpp"],
4374 system_shared_libs: [],
4375 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004376 // TODO: remove //apex_available:platform
4377 apex_available: [
4378 "//apex_available:platform",
4379 "myapex",
4380 ],
Alex Light0851b882019-02-07 13:20:53 -08004381 }
4382 `)
4383
Sundong Ahnabb64432019-10-22 13:58:29 +09004384 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004385 apexRule := module.Rule("apexRule")
4386 copyCmds := apexRule.Args["copy_commands"]
4387
4388 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4389 t.Log("Apex was not a test apex!")
4390 t.Fail()
4391 }
4392 // Ensure that main rule creates an output
4393 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4394
4395 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004396 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004397
4398 // Ensure that both direct and indirect deps are copied into apex
4399 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4400
Colin Cross7113d202019-11-20 16:39:12 -08004401 // Ensure that the platform variant ends with _shared
4402 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004403}
4404
Alex Light9670d332019-01-29 18:07:33 -08004405func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004406 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004407 apex {
4408 name: "myapex",
4409 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004410 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004411 multilib: {
4412 first: {
4413 native_shared_libs: ["mylib_common"],
4414 }
4415 },
4416 target: {
4417 android: {
4418 multilib: {
4419 first: {
4420 native_shared_libs: ["mylib"],
4421 }
4422 }
4423 },
4424 host: {
4425 multilib: {
4426 first: {
4427 native_shared_libs: ["mylib2"],
4428 }
4429 }
4430 }
4431 }
4432 }
4433
4434 apex_key {
4435 name: "myapex.key",
4436 public_key: "testkey.avbpubkey",
4437 private_key: "testkey.pem",
4438 }
4439
4440 cc_library {
4441 name: "mylib",
4442 srcs: ["mylib.cpp"],
4443 system_shared_libs: [],
4444 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004445 // TODO: remove //apex_available:platform
4446 apex_available: [
4447 "//apex_available:platform",
4448 "myapex",
4449 ],
Alex Light9670d332019-01-29 18:07:33 -08004450 }
4451
4452 cc_library {
4453 name: "mylib_common",
4454 srcs: ["mylib.cpp"],
4455 system_shared_libs: [],
4456 stl: "none",
4457 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004458 // TODO: remove //apex_available:platform
4459 apex_available: [
4460 "//apex_available:platform",
4461 "myapex",
4462 ],
Alex Light9670d332019-01-29 18:07:33 -08004463 }
4464
4465 cc_library {
4466 name: "mylib2",
4467 srcs: ["mylib.cpp"],
4468 system_shared_libs: [],
4469 stl: "none",
4470 compile_multilib: "first",
4471 }
4472 `)
4473
Sundong Ahnabb64432019-10-22 13:58:29 +09004474 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004475 copyCmds := apexRule.Args["copy_commands"]
4476
4477 // Ensure that main rule creates an output
4478 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4479
4480 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004481 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4482 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4483 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004484
4485 // Ensure that both direct and indirect deps are copied into apex
4486 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4487 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4488 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4489
Colin Cross7113d202019-11-20 16:39:12 -08004490 // Ensure that the platform variant ends with _shared
4491 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4492 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4493 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004494}
Jiyong Park04480cf2019-02-06 00:16:29 +09004495
Jiyong Park59140302020-12-14 18:44:04 +09004496func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004497 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004498 apex {
4499 name: "myapex",
4500 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004501 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004502 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004503 arch: {
4504 arm64: {
4505 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004506 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004507 },
4508 x86_64: {
4509 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004510 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004511 },
4512 }
4513 }
4514
4515 apex_key {
4516 name: "myapex.key",
4517 public_key: "testkey.avbpubkey",
4518 private_key: "testkey.pem",
4519 }
4520
4521 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004522 name: "mylib.generic",
4523 srcs: ["mylib.cpp"],
4524 system_shared_libs: [],
4525 stl: "none",
4526 // TODO: remove //apex_available:platform
4527 apex_available: [
4528 "//apex_available:platform",
4529 "myapex",
4530 ],
4531 }
4532
4533 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004534 name: "mylib.arm64",
4535 srcs: ["mylib.cpp"],
4536 system_shared_libs: [],
4537 stl: "none",
4538 // TODO: remove //apex_available:platform
4539 apex_available: [
4540 "//apex_available:platform",
4541 "myapex",
4542 ],
4543 }
4544
4545 cc_library {
4546 name: "mylib.x64",
4547 srcs: ["mylib.cpp"],
4548 system_shared_libs: [],
4549 stl: "none",
4550 // TODO: remove //apex_available:platform
4551 apex_available: [
4552 "//apex_available:platform",
4553 "myapex",
4554 ],
4555 }
4556 `)
4557
4558 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4559 copyCmds := apexRule.Args["copy_commands"]
4560
4561 // Ensure that apex variant is created for the direct dep
4562 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004563 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004564 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4565
4566 // Ensure that both direct and indirect deps are copied into apex
4567 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4568 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4569}
4570
Jiyong Park04480cf2019-02-06 00:16:29 +09004571func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004572 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004573 apex {
4574 name: "myapex",
4575 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004576 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004577 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004578 }
4579
4580 apex_key {
4581 name: "myapex.key",
4582 public_key: "testkey.avbpubkey",
4583 private_key: "testkey.pem",
4584 }
4585
4586 sh_binary {
4587 name: "myscript",
4588 src: "mylib.cpp",
4589 filename: "myscript.sh",
4590 sub_dir: "script",
4591 }
4592 `)
4593
Sundong Ahnabb64432019-10-22 13:58:29 +09004594 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004595 copyCmds := apexRule.Args["copy_commands"]
4596
4597 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4598}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004599
Jooyung Han91df2082019-11-20 01:49:42 +09004600func TestApexInVariousPartition(t *testing.T) {
4601 testcases := []struct {
4602 propName, parition, flattenedPartition string
4603 }{
4604 {"", "system", "system_ext"},
4605 {"product_specific: true", "product", "product"},
4606 {"soc_specific: true", "vendor", "vendor"},
4607 {"proprietary: true", "vendor", "vendor"},
4608 {"vendor: true", "vendor", "vendor"},
4609 {"system_ext_specific: true", "system_ext", "system_ext"},
4610 }
4611 for _, tc := range testcases {
4612 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004613 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004614 apex {
4615 name: "myapex",
4616 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004617 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004618 `+tc.propName+`
4619 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004620
Jooyung Han91df2082019-11-20 01:49:42 +09004621 apex_key {
4622 name: "myapex.key",
4623 public_key: "testkey.avbpubkey",
4624 private_key: "testkey.pem",
4625 }
4626 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004627
Jooyung Han91df2082019-11-20 01:49:42 +09004628 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004629 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4630 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004631 if actual != expected {
4632 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4633 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004634
Jooyung Han91df2082019-11-20 01:49:42 +09004635 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004636 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4637 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004638 if actual != expected {
4639 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4640 }
4641 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004642 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004643}
Jiyong Park67882562019-03-21 01:11:21 +09004644
Jooyung Han580eb4f2020-06-24 19:33:06 +09004645func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004646 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004647 apex {
4648 name: "myapex",
4649 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004650 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004651 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004652
Jooyung Han580eb4f2020-06-24 19:33:06 +09004653 apex_key {
4654 name: "myapex.key",
4655 public_key: "testkey.avbpubkey",
4656 private_key: "testkey.pem",
4657 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004658 `)
4659 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004660 rule := module.Output("file_contexts")
4661 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4662}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004663
Jooyung Han580eb4f2020-06-24 19:33:06 +09004664func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004665 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004666 apex {
4667 name: "myapex",
4668 key: "myapex.key",
4669 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004670 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004671 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004672
Jooyung Han580eb4f2020-06-24 19:33:06 +09004673 apex_key {
4674 name: "myapex.key",
4675 public_key: "testkey.avbpubkey",
4676 private_key: "testkey.pem",
4677 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004678 `, withFiles(map[string][]byte{
4679 "my_own_file_contexts": nil,
4680 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004681}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004682
Jooyung Han580eb4f2020-06-24 19:33:06 +09004683func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004684 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004685 apex {
4686 name: "myapex",
4687 key: "myapex.key",
4688 product_specific: true,
4689 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004690 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004691 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004692
Jooyung Han580eb4f2020-06-24 19:33:06 +09004693 apex_key {
4694 name: "myapex.key",
4695 public_key: "testkey.avbpubkey",
4696 private_key: "testkey.pem",
4697 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004698 `)
4699
Colin Cross1c460562021-02-16 17:55:47 -08004700 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004701 apex {
4702 name: "myapex",
4703 key: "myapex.key",
4704 product_specific: true,
4705 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004706 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004707 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004708
Jooyung Han580eb4f2020-06-24 19:33:06 +09004709 apex_key {
4710 name: "myapex.key",
4711 public_key: "testkey.avbpubkey",
4712 private_key: "testkey.pem",
4713 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004714 `, withFiles(map[string][]byte{
4715 "product_specific_file_contexts": nil,
4716 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004717 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4718 rule := module.Output("file_contexts")
4719 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4720}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004721
Jooyung Han580eb4f2020-06-24 19:33:06 +09004722func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004723 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004724 apex {
4725 name: "myapex",
4726 key: "myapex.key",
4727 product_specific: true,
4728 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004729 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004730 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004731
Jooyung Han580eb4f2020-06-24 19:33:06 +09004732 apex_key {
4733 name: "myapex.key",
4734 public_key: "testkey.avbpubkey",
4735 private_key: "testkey.pem",
4736 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004737
Jooyung Han580eb4f2020-06-24 19:33:06 +09004738 filegroup {
4739 name: "my-file-contexts",
4740 srcs: ["product_specific_file_contexts"],
4741 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004742 `, withFiles(map[string][]byte{
4743 "product_specific_file_contexts": nil,
4744 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004745 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4746 rule := module.Output("file_contexts")
4747 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004748}
4749
Jiyong Park67882562019-03-21 01:11:21 +09004750func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004751 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004752 apex_key {
4753 name: "myapex.key",
4754 public_key: ":my.avbpubkey",
4755 private_key: ":my.pem",
4756 product_specific: true,
4757 }
4758
4759 filegroup {
4760 name: "my.avbpubkey",
4761 srcs: ["testkey2.avbpubkey"],
4762 }
4763
4764 filegroup {
4765 name: "my.pem",
4766 srcs: ["testkey2.pem"],
4767 }
4768 `)
4769
4770 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4771 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004772 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004773 if actual_pubkey != expected_pubkey {
4774 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4775 }
4776 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004777 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004778 if actual_privkey != expected_privkey {
4779 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4780 }
4781}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004782
4783func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004784 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004785 prebuilt_apex {
4786 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004787 arch: {
4788 arm64: {
4789 src: "myapex-arm64.apex",
4790 },
4791 arm: {
4792 src: "myapex-arm.apex",
4793 },
4794 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004795 }
4796 `)
4797
Wei Li340ee8e2022-03-18 17:33:24 -07004798 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4799 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004800
Jiyong Parkc95714e2019-03-29 14:23:10 +09004801 expectedInput := "myapex-arm64.apex"
4802 if prebuilt.inputApex.String() != expectedInput {
4803 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4804 }
Wei Li340ee8e2022-03-18 17:33:24 -07004805 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4806 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4807 rule := testingModule.Rule("genProvenanceMetaData")
4808 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4809 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4810 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4811 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004812
4813 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4814 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004815}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004816
Paul Duffinc0609c62021-03-01 17:27:16 +00004817func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004818 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004819 prebuilt_apex {
4820 name: "myapex",
4821 }
4822 `)
4823}
4824
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004825func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004826 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004827 prebuilt_apex {
4828 name: "myapex",
4829 src: "myapex-arm.apex",
4830 filename: "notmyapex.apex",
4831 }
4832 `)
4833
Wei Li340ee8e2022-03-18 17:33:24 -07004834 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4835 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004836
4837 expected := "notmyapex.apex"
4838 if p.installFilename != expected {
4839 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4840 }
Wei Li340ee8e2022-03-18 17:33:24 -07004841 rule := testingModule.Rule("genProvenanceMetaData")
4842 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4843 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4844 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4845 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004846}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004847
Samiul Islam7c02e262021-09-08 17:48:28 +01004848func TestApexSetFilenameOverride(t *testing.T) {
4849 testApex(t, `
4850 apex_set {
4851 name: "com.company.android.myapex",
4852 apex_name: "com.android.myapex",
4853 set: "company-myapex.apks",
4854 filename: "com.company.android.myapex.apex"
4855 }
4856 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4857
4858 testApex(t, `
4859 apex_set {
4860 name: "com.company.android.myapex",
4861 apex_name: "com.android.myapex",
4862 set: "company-myapex.apks",
4863 filename: "com.company.android.myapex.capex"
4864 }
4865 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4866
4867 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4868 apex_set {
4869 name: "com.company.android.myapex",
4870 apex_name: "com.android.myapex",
4871 set: "company-myapex.apks",
4872 filename: "some-random-suffix"
4873 }
4874 `)
4875}
4876
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004877func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004878 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004879 prebuilt_apex {
4880 name: "myapex.prebuilt",
4881 src: "myapex-arm.apex",
4882 overrides: [
4883 "myapex",
4884 ],
4885 }
4886 `)
4887
Wei Li340ee8e2022-03-18 17:33:24 -07004888 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4889 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004890
4891 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004892 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004893 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004894 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004895 }
Wei Li340ee8e2022-03-18 17:33:24 -07004896 rule := testingModule.Rule("genProvenanceMetaData")
4897 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4898 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4899 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4900 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004901}
4902
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004903func TestPrebuiltApexName(t *testing.T) {
4904 testApex(t, `
4905 prebuilt_apex {
4906 name: "com.company.android.myapex",
4907 apex_name: "com.android.myapex",
4908 src: "company-myapex-arm.apex",
4909 }
4910 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4911
4912 testApex(t, `
4913 apex_set {
4914 name: "com.company.android.myapex",
4915 apex_name: "com.android.myapex",
4916 set: "company-myapex.apks",
4917 }
4918 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4919}
4920
4921func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4922 _ = android.GroupFixturePreparers(
4923 java.PrepareForTestWithJavaDefaultModules,
4924 PrepareForTestWithApexBuildComponents,
4925 android.FixtureWithRootAndroidBp(`
4926 platform_bootclasspath {
4927 name: "platform-bootclasspath",
4928 fragments: [
4929 {
4930 apex: "com.android.art",
4931 module: "art-bootclasspath-fragment",
4932 },
4933 ],
4934 }
4935
4936 prebuilt_apex {
4937 name: "com.company.android.art",
4938 apex_name: "com.android.art",
4939 src: "com.company.android.art-arm.apex",
4940 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4941 }
4942
4943 prebuilt_bootclasspath_fragment {
4944 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004945 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004946 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004947 hidden_api: {
4948 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4949 metadata: "my-bootclasspath-fragment/metadata.csv",
4950 index: "my-bootclasspath-fragment/index.csv",
4951 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4952 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4953 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004954 }
4955
4956 java_import {
4957 name: "core-oj",
4958 jars: ["prebuilt.jar"],
4959 }
4960 `),
4961 ).RunTest(t)
4962}
4963
Paul Duffin092153d2021-01-26 11:42:39 +00004964// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4965// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004966func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004967 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004968
Paul Duffin89886cb2021-02-05 16:44:03 +00004969 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004970 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004971 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004972 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004973 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004974 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004975 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4976 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4977 android.NormalizePathForTesting(dexJarBuildPath))
4978 }
4979
4980 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004981 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004982 // Make sure the import has been given the correct path to the dex jar.
4983 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4984 dexJarBuildPath := p.DexJarInstallPath()
4985 stem := android.RemoveOptionalPrebuiltPrefix(name)
4986 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4987 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4988 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004989 }
4990
Paul Duffin39853512021-02-26 11:09:39 +00004991 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004992 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004993 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004994 android.AssertArrayString(t, "Check if there is no source variant",
4995 []string{"android_common"},
4996 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004997 }
4998
4999 t.Run("prebuilt only", func(t *testing.T) {
5000 bp := `
5001 prebuilt_apex {
5002 name: "myapex",
5003 arch: {
5004 arm64: {
5005 src: "myapex-arm64.apex",
5006 },
5007 arm: {
5008 src: "myapex-arm.apex",
5009 },
5010 },
Paul Duffin39853512021-02-26 11:09:39 +00005011 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005012 }
5013
5014 java_import {
5015 name: "libfoo",
5016 jars: ["libfoo.jar"],
5017 }
Paul Duffin39853512021-02-26 11:09:39 +00005018
5019 java_sdk_library_import {
5020 name: "libbar",
5021 public: {
5022 jars: ["libbar.jar"],
5023 },
5024 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005025 `
5026
5027 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5028 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5029
Martin Stjernholm44825602021-09-17 01:44:12 +01005030 deapexerName := deapexerModuleName("myapex")
5031 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5032
Paul Duffinf6932af2021-02-26 18:21:56 +00005033 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005034 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005035 rule := deapexer.Rule("deapexer")
5036 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5037 t.Errorf("expected: %q, found: %q", expected, actual)
5038 }
5039
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005040 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005041 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005042 rule = prebuiltApex.Rule("android/soong/android.Cp")
5043 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5044 t.Errorf("expected: %q, found: %q", expected, actual)
5045 }
5046
Paul Duffin89886cb2021-02-05 16:44:03 +00005047 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005048 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005049
5050 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005051 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005052 })
5053
5054 t.Run("prebuilt with source preferred", func(t *testing.T) {
5055
5056 bp := `
5057 prebuilt_apex {
5058 name: "myapex",
5059 arch: {
5060 arm64: {
5061 src: "myapex-arm64.apex",
5062 },
5063 arm: {
5064 src: "myapex-arm.apex",
5065 },
5066 },
Paul Duffin39853512021-02-26 11:09:39 +00005067 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005068 }
5069
5070 java_import {
5071 name: "libfoo",
5072 jars: ["libfoo.jar"],
5073 }
5074
5075 java_library {
5076 name: "libfoo",
5077 }
Paul Duffin39853512021-02-26 11:09:39 +00005078
5079 java_sdk_library_import {
5080 name: "libbar",
5081 public: {
5082 jars: ["libbar.jar"],
5083 },
5084 }
5085
5086 java_sdk_library {
5087 name: "libbar",
5088 srcs: ["foo/bar/MyClass.java"],
5089 unsafe_ignore_missing_latest_api: true,
5090 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005091 `
5092
5093 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5094 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5095
Paul Duffin89886cb2021-02-05 16:44:03 +00005096 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005097 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005098 ensureNoSourceVariant(t, ctx, "libfoo")
5099
5100 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005101 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005102 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005103 })
5104
5105 t.Run("prebuilt preferred with source", func(t *testing.T) {
5106 bp := `
5107 prebuilt_apex {
5108 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005109 arch: {
5110 arm64: {
5111 src: "myapex-arm64.apex",
5112 },
5113 arm: {
5114 src: "myapex-arm.apex",
5115 },
5116 },
Paul Duffin39853512021-02-26 11:09:39 +00005117 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005118 }
5119
5120 java_import {
5121 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005122 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005123 jars: ["libfoo.jar"],
5124 }
5125
5126 java_library {
5127 name: "libfoo",
5128 }
Paul Duffin39853512021-02-26 11:09:39 +00005129
5130 java_sdk_library_import {
5131 name: "libbar",
5132 prefer: true,
5133 public: {
5134 jars: ["libbar.jar"],
5135 },
5136 }
5137
5138 java_sdk_library {
5139 name: "libbar",
5140 srcs: ["foo/bar/MyClass.java"],
5141 unsafe_ignore_missing_latest_api: true,
5142 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005143 `
5144
5145 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5146 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5147
Paul Duffin89886cb2021-02-05 16:44:03 +00005148 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005149 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005150 ensureNoSourceVariant(t, ctx, "libfoo")
5151
5152 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005153 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005154 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005155 })
5156}
5157
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005158func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005159 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005160 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005161 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5162 // is disabled.
5163 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5164 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005165
Paul Duffin37856732021-02-26 14:24:15 +00005166 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5167 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005168 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005169 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005170 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005171 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005172 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005173 foundLibfooJar = true
5174 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005175 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005176 }
5177 }
5178 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005179 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 +00005180 }
5181 }
5182
Paul Duffin40a3f652021-07-19 13:11:24 +01005183 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005184 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005185 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005186 var rule android.TestingBuildParams
5187
5188 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5189 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005190 }
5191
Paul Duffin40a3f652021-07-19 13:11:24 +01005192 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5193 t.Helper()
5194 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5195 var rule android.TestingBuildParams
5196
5197 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5198 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5199 }
5200
Paul Duffin89f570a2021-06-16 01:42:33 +01005201 fragment := java.ApexVariantReference{
5202 Apex: proptools.StringPtr("myapex"),
5203 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5204 }
5205
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005206 t.Run("prebuilt only", func(t *testing.T) {
5207 bp := `
5208 prebuilt_apex {
5209 name: "myapex",
5210 arch: {
5211 arm64: {
5212 src: "myapex-arm64.apex",
5213 },
5214 arm: {
5215 src: "myapex-arm.apex",
5216 },
5217 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005218 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5219 }
5220
5221 prebuilt_bootclasspath_fragment {
5222 name: "my-bootclasspath-fragment",
5223 contents: ["libfoo", "libbar"],
5224 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005225 hidden_api: {
5226 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5227 metadata: "my-bootclasspath-fragment/metadata.csv",
5228 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005229 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5230 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5231 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005232 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005233 }
5234
5235 java_import {
5236 name: "libfoo",
5237 jars: ["libfoo.jar"],
5238 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005239 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005240 }
Paul Duffin37856732021-02-26 14:24:15 +00005241
5242 java_sdk_library_import {
5243 name: "libbar",
5244 public: {
5245 jars: ["libbar.jar"],
5246 },
5247 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005248 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005249 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005250 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005251 `
5252
Paul Duffin89f570a2021-06-16 01:42:33 +01005253 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005254 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5255 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005256
Paul Duffin537ea3d2021-05-14 10:38:00 +01005257 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005258 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005259 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005260 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005261 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5262 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005263 })
5264
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005265 t.Run("apex_set only", func(t *testing.T) {
5266 bp := `
5267 apex_set {
5268 name: "myapex",
5269 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005270 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5271 }
5272
5273 prebuilt_bootclasspath_fragment {
5274 name: "my-bootclasspath-fragment",
5275 contents: ["libfoo", "libbar"],
5276 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005277 hidden_api: {
5278 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5279 metadata: "my-bootclasspath-fragment/metadata.csv",
5280 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005281 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5282 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5283 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005284 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005285 }
5286
5287 java_import {
5288 name: "libfoo",
5289 jars: ["libfoo.jar"],
5290 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005291 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005292 }
5293
5294 java_sdk_library_import {
5295 name: "libbar",
5296 public: {
5297 jars: ["libbar.jar"],
5298 },
5299 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005300 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005301 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005302 }
5303 `
5304
Paul Duffin89f570a2021-06-16 01:42:33 +01005305 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005306 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5307 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5308
Paul Duffin537ea3d2021-05-14 10:38:00 +01005309 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005310 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005311 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005312 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005313 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5314 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005315 })
5316
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005317 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5318 bp := `
5319 prebuilt_apex {
5320 name: "myapex",
5321 arch: {
5322 arm64: {
5323 src: "myapex-arm64.apex",
5324 },
5325 arm: {
5326 src: "myapex-arm.apex",
5327 },
5328 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005329 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5330 }
5331
5332 prebuilt_bootclasspath_fragment {
5333 name: "my-bootclasspath-fragment",
5334 contents: ["libfoo", "libbar"],
5335 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005336 hidden_api: {
5337 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5338 metadata: "my-bootclasspath-fragment/metadata.csv",
5339 index: "my-bootclasspath-fragment/index.csv",
5340 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5341 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5342 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005343 }
5344
5345 java_import {
5346 name: "libfoo",
5347 jars: ["libfoo.jar"],
5348 apex_available: ["myapex"],
5349 }
5350
5351 java_library {
5352 name: "libfoo",
5353 srcs: ["foo/bar/MyClass.java"],
5354 apex_available: ["myapex"],
5355 }
Paul Duffin37856732021-02-26 14:24:15 +00005356
5357 java_sdk_library_import {
5358 name: "libbar",
5359 public: {
5360 jars: ["libbar.jar"],
5361 },
5362 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005363 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005364 }
5365
5366 java_sdk_library {
5367 name: "libbar",
5368 srcs: ["foo/bar/MyClass.java"],
5369 unsafe_ignore_missing_latest_api: true,
5370 apex_available: ["myapex"],
5371 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005372 `
5373
5374 // In this test the source (java_library) libfoo is active since the
5375 // prebuilt (java_import) defaults to prefer:false. However the
5376 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5377 // find the dex boot jar in it. We either need to disable the source libfoo
5378 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005379 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005380 // dexbootjar check is skipped if AllowMissingDependencies is true
5381 preparerAllowMissingDeps := android.GroupFixturePreparers(
5382 preparer,
5383 android.PrepareForTestWithAllowMissingDependencies,
5384 )
5385 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005386 })
5387
5388 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5389 bp := `
5390 prebuilt_apex {
5391 name: "myapex",
5392 arch: {
5393 arm64: {
5394 src: "myapex-arm64.apex",
5395 },
5396 arm: {
5397 src: "myapex-arm.apex",
5398 },
5399 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005400 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5401 }
5402
5403 prebuilt_bootclasspath_fragment {
5404 name: "my-bootclasspath-fragment",
5405 contents: ["libfoo", "libbar"],
5406 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005407 hidden_api: {
5408 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5409 metadata: "my-bootclasspath-fragment/metadata.csv",
5410 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005411 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5412 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5413 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005414 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005415 }
5416
5417 java_import {
5418 name: "libfoo",
5419 prefer: true,
5420 jars: ["libfoo.jar"],
5421 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005422 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005423 }
5424
5425 java_library {
5426 name: "libfoo",
5427 srcs: ["foo/bar/MyClass.java"],
5428 apex_available: ["myapex"],
5429 }
Paul Duffin37856732021-02-26 14:24:15 +00005430
5431 java_sdk_library_import {
5432 name: "libbar",
5433 prefer: true,
5434 public: {
5435 jars: ["libbar.jar"],
5436 },
5437 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005438 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005439 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005440 }
5441
5442 java_sdk_library {
5443 name: "libbar",
5444 srcs: ["foo/bar/MyClass.java"],
5445 unsafe_ignore_missing_latest_api: true,
5446 apex_available: ["myapex"],
5447 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005448 `
5449
Paul Duffin89f570a2021-06-16 01:42:33 +01005450 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005451 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5452 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005453
Paul Duffin537ea3d2021-05-14 10:38:00 +01005454 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005455 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005456 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005457 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005458 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5459 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005460 })
5461
5462 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5463 bp := `
5464 apex {
5465 name: "myapex",
5466 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005467 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005468 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005469 }
5470
5471 apex_key {
5472 name: "myapex.key",
5473 public_key: "testkey.avbpubkey",
5474 private_key: "testkey.pem",
5475 }
5476
5477 prebuilt_apex {
5478 name: "myapex",
5479 arch: {
5480 arm64: {
5481 src: "myapex-arm64.apex",
5482 },
5483 arm: {
5484 src: "myapex-arm.apex",
5485 },
5486 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005487 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5488 }
5489
5490 prebuilt_bootclasspath_fragment {
5491 name: "my-bootclasspath-fragment",
5492 contents: ["libfoo", "libbar"],
5493 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005494 hidden_api: {
5495 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5496 metadata: "my-bootclasspath-fragment/metadata.csv",
5497 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005498 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5499 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5500 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005501 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005502 }
5503
5504 java_import {
5505 name: "libfoo",
5506 jars: ["libfoo.jar"],
5507 apex_available: ["myapex"],
5508 }
5509
5510 java_library {
5511 name: "libfoo",
5512 srcs: ["foo/bar/MyClass.java"],
5513 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005514 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005515 }
Paul Duffin37856732021-02-26 14:24:15 +00005516
5517 java_sdk_library_import {
5518 name: "libbar",
5519 public: {
5520 jars: ["libbar.jar"],
5521 },
5522 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005523 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005524 }
5525
5526 java_sdk_library {
5527 name: "libbar",
5528 srcs: ["foo/bar/MyClass.java"],
5529 unsafe_ignore_missing_latest_api: true,
5530 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005531 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005532 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005533 `
5534
Paul Duffin89f570a2021-06-16 01:42:33 +01005535 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005536 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5537 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005538
Paul Duffin537ea3d2021-05-14 10:38:00 +01005539 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005540 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005541 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005542 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005543 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5544 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005545 })
5546
5547 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5548 bp := `
5549 apex {
5550 name: "myapex",
5551 enabled: false,
5552 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005553 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005554 }
5555
5556 apex_key {
5557 name: "myapex.key",
5558 public_key: "testkey.avbpubkey",
5559 private_key: "testkey.pem",
5560 }
5561
5562 prebuilt_apex {
5563 name: "myapex",
5564 arch: {
5565 arm64: {
5566 src: "myapex-arm64.apex",
5567 },
5568 arm: {
5569 src: "myapex-arm.apex",
5570 },
5571 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005572 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5573 }
5574
5575 prebuilt_bootclasspath_fragment {
5576 name: "my-bootclasspath-fragment",
5577 contents: ["libfoo", "libbar"],
5578 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005579 hidden_api: {
5580 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5581 metadata: "my-bootclasspath-fragment/metadata.csv",
5582 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005583 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5584 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5585 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005586 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005587 }
5588
5589 java_import {
5590 name: "libfoo",
5591 prefer: true,
5592 jars: ["libfoo.jar"],
5593 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005594 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005595 }
5596
5597 java_library {
5598 name: "libfoo",
5599 srcs: ["foo/bar/MyClass.java"],
5600 apex_available: ["myapex"],
5601 }
Paul Duffin37856732021-02-26 14:24:15 +00005602
5603 java_sdk_library_import {
5604 name: "libbar",
5605 prefer: true,
5606 public: {
5607 jars: ["libbar.jar"],
5608 },
5609 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005610 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005611 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005612 }
5613
5614 java_sdk_library {
5615 name: "libbar",
5616 srcs: ["foo/bar/MyClass.java"],
5617 unsafe_ignore_missing_latest_api: true,
5618 apex_available: ["myapex"],
5619 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005620 `
5621
Paul Duffin89f570a2021-06-16 01:42:33 +01005622 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005623 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5624 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005625
Paul Duffin537ea3d2021-05-14 10:38:00 +01005626 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005627 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005628 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005629 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005630 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5631 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005632 })
5633}
5634
Roland Levillain630846d2019-06-26 12:48:34 +01005635func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005636 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005637 apex_test {
5638 name: "myapex",
5639 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005640 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005641 tests: [
5642 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005643 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005644 ],
5645 }
5646
5647 apex_key {
5648 name: "myapex.key",
5649 public_key: "testkey.avbpubkey",
5650 private_key: "testkey.pem",
5651 }
5652
Liz Kammer1c14a212020-05-12 15:26:55 -07005653 filegroup {
5654 name: "fg",
5655 srcs: [
5656 "baz",
5657 "bar/baz"
5658 ],
5659 }
5660
Roland Levillain630846d2019-06-26 12:48:34 +01005661 cc_test {
5662 name: "mytest",
5663 gtest: false,
5664 srcs: ["mytest.cpp"],
5665 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005666 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005667 system_shared_libs: [],
5668 static_executable: true,
5669 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005670 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005671 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005672
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005673 cc_library {
5674 name: "mylib",
5675 srcs: ["mylib.cpp"],
5676 system_shared_libs: [],
5677 stl: "none",
5678 }
5679
Liz Kammer5bd365f2020-05-27 15:15:11 -07005680 filegroup {
5681 name: "fg2",
5682 srcs: [
5683 "testdata/baz"
5684 ],
5685 }
5686
Roland Levillain9b5fde92019-06-28 15:41:19 +01005687 cc_test {
5688 name: "mytests",
5689 gtest: false,
5690 srcs: [
5691 "mytest1.cpp",
5692 "mytest2.cpp",
5693 "mytest3.cpp",
5694 ],
5695 test_per_src: true,
5696 relative_install_path: "test",
5697 system_shared_libs: [],
5698 static_executable: true,
5699 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005700 data: [
5701 ":fg",
5702 ":fg2",
5703 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005704 }
Roland Levillain630846d2019-06-26 12:48:34 +01005705 `)
5706
Sundong Ahnabb64432019-10-22 13:58:29 +09005707 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005708 copyCmds := apexRule.Args["copy_commands"]
5709
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005710 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005711 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005712 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005713
Liz Kammer1c14a212020-05-12 15:26:55 -07005714 //Ensure that test data are copied into apex.
5715 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5716 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5717
Roland Levillain9b5fde92019-06-28 15:41:19 +01005718 // Ensure that test deps built with `test_per_src` are copied into apex.
5719 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5720 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5721 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005722
5723 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005724 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005725 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005726 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005727 prefix := "TARGET_"
5728 var builder strings.Builder
5729 data.Custom(&builder, name, prefix, "", data)
5730 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005731 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5732 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5733 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5734 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
5735 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
5736 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005737 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005738
5739 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005740 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005741 data.Custom(&builder, name, prefix, "", data)
5742 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005743 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5744 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005745}
5746
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005747func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005748 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005749 apex {
5750 name: "myapex",
5751 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005752 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005753 }
5754 apex_key {
5755 name: "myapex.key",
5756 public_key: "testkey.avbpubkey",
5757 private_key: "testkey.pem",
5758 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005759 `,
5760 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5761 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5762 }),
5763 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005764 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00005765 ensureListContains(t, ab.makeModulesToInstall, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005766 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005767 var builder strings.Builder
5768 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5769 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005770 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex myapex.flattened\n")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005771}
5772
Jooyung Hand48f3c32019-08-23 11:18:57 +09005773func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5774 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5775 apex {
5776 name: "myapex",
5777 key: "myapex.key",
5778 native_shared_libs: ["libfoo"],
5779 }
5780
5781 apex_key {
5782 name: "myapex.key",
5783 public_key: "testkey.avbpubkey",
5784 private_key: "testkey.pem",
5785 }
5786
5787 cc_library {
5788 name: "libfoo",
5789 stl: "none",
5790 system_shared_libs: [],
5791 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005792 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005793 }
5794 `)
5795 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5796 apex {
5797 name: "myapex",
5798 key: "myapex.key",
5799 java_libs: ["myjar"],
5800 }
5801
5802 apex_key {
5803 name: "myapex.key",
5804 public_key: "testkey.avbpubkey",
5805 private_key: "testkey.pem",
5806 }
5807
5808 java_library {
5809 name: "myjar",
5810 srcs: ["foo/bar/MyClass.java"],
5811 sdk_version: "none",
5812 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005813 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005814 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005815 }
5816 `)
5817}
5818
Bill Peckhama41a6962021-01-11 10:58:54 -08005819func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005820 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005821 apex {
5822 name: "myapex",
5823 key: "myapex.key",
5824 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005825 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005826 }
5827
5828 apex_key {
5829 name: "myapex.key",
5830 public_key: "testkey.avbpubkey",
5831 private_key: "testkey.pem",
5832 }
5833
5834 java_import {
5835 name: "myjavaimport",
5836 apex_available: ["myapex"],
5837 jars: ["my.jar"],
5838 compile_dex: true,
5839 }
5840 `)
5841
5842 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5843 apexRule := module.Rule("apexRule")
5844 copyCmds := apexRule.Args["copy_commands"]
5845 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5846}
5847
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005848func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005849 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005850 apex {
5851 name: "myapex",
5852 key: "myapex.key",
5853 apps: [
5854 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005855 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005856 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005857 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005858 }
5859
5860 apex_key {
5861 name: "myapex.key",
5862 public_key: "testkey.avbpubkey",
5863 private_key: "testkey.pem",
5864 }
5865
5866 android_app {
5867 name: "AppFoo",
5868 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005869 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005870 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005871 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005872 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005873 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005874 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005875
5876 android_app {
5877 name: "AppFooPriv",
5878 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005879 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005880 system_modules: "none",
5881 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005882 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005883 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005884 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005885
5886 cc_library_shared {
5887 name: "libjni",
5888 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005889 shared_libs: ["libfoo"],
5890 stl: "none",
5891 system_shared_libs: [],
5892 apex_available: [ "myapex" ],
5893 sdk_version: "current",
5894 }
5895
5896 cc_library_shared {
5897 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005898 stl: "none",
5899 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005900 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005901 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005902 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005903 `)
5904
Sundong Ahnabb64432019-10-22 13:58:29 +09005905 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005906 apexRule := module.Rule("apexRule")
5907 copyCmds := apexRule.Args["copy_commands"]
5908
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005909 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5910 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005911
Colin Crossaede88c2020-08-11 12:17:01 -07005912 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005913 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005914 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005915 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005916 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005917 // JNI libraries including transitive deps are
5918 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005919 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005920 // ... embedded inside APK (jnilibs.zip)
5921 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5922 // ... and not directly inside the APEX
5923 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5924 }
Dario Frenicde2a032019-10-27 00:29:22 +01005925}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005926
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005927func TestApexWithAppImportBuildId(t *testing.T) {
5928 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5929 for _, id := range invalidBuildIds {
5930 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5931 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5932 variables.BuildId = proptools.StringPtr(id)
5933 })
5934 testApexError(t, message, `apex {
5935 name: "myapex",
5936 key: "myapex.key",
5937 apps: ["AppFooPrebuilt"],
5938 updatable: false,
5939 }
5940
5941 apex_key {
5942 name: "myapex.key",
5943 public_key: "testkey.avbpubkey",
5944 private_key: "testkey.pem",
5945 }
5946
5947 android_app_import {
5948 name: "AppFooPrebuilt",
5949 apk: "PrebuiltAppFoo.apk",
5950 presigned: true,
5951 apex_available: ["myapex"],
5952 }
5953 `, fixture)
5954 }
5955}
5956
Dario Frenicde2a032019-10-27 00:29:22 +01005957func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005958 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005959 apex {
5960 name: "myapex",
5961 key: "myapex.key",
5962 apps: [
5963 "AppFooPrebuilt",
5964 "AppFooPrivPrebuilt",
5965 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005966 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005967 }
5968
5969 apex_key {
5970 name: "myapex.key",
5971 public_key: "testkey.avbpubkey",
5972 private_key: "testkey.pem",
5973 }
5974
5975 android_app_import {
5976 name: "AppFooPrebuilt",
5977 apk: "PrebuiltAppFoo.apk",
5978 presigned: true,
5979 dex_preopt: {
5980 enabled: false,
5981 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005982 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005983 }
5984
5985 android_app_import {
5986 name: "AppFooPrivPrebuilt",
5987 apk: "PrebuiltAppFooPriv.apk",
5988 privileged: true,
5989 presigned: true,
5990 dex_preopt: {
5991 enabled: false,
5992 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005993 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005994 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005995 }
5996 `)
5997
Sundong Ahnabb64432019-10-22 13:58:29 +09005998 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005999 apexRule := module.Rule("apexRule")
6000 copyCmds := apexRule.Args["copy_commands"]
6001
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006002 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6003 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006004}
6005
6006func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006007 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006008 apex {
6009 name: "myapex",
6010 key: "myapex.key",
6011 apps: [
6012 "AppFoo",
6013 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006014 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006015 }
6016
6017 apex_key {
6018 name: "myapex.key",
6019 public_key: "testkey.avbpubkey",
6020 private_key: "testkey.pem",
6021 }
6022
6023 android_app {
6024 name: "AppFoo",
6025 srcs: ["foo/bar/MyClass.java"],
6026 sdk_version: "none",
6027 system_modules: "none",
6028 apex_available: [ "myapex" ],
6029 }
6030
6031 android_app_import {
6032 name: "AppFoo",
6033 apk: "AppFooPrebuilt.apk",
6034 filename: "AppFooPrebuilt.apk",
6035 presigned: true,
6036 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006037 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006038 }
6039 `, withFiles(map[string][]byte{
6040 "AppFooPrebuilt.apk": nil,
6041 }))
6042
6043 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006044 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006045 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006046}
6047
Dario Freni6f3937c2019-12-20 22:58:03 +00006048func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006049 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006050 apex {
6051 name: "myapex",
6052 key: "myapex.key",
6053 apps: [
6054 "TesterHelpAppFoo",
6055 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006056 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006057 }
6058
6059 apex_key {
6060 name: "myapex.key",
6061 public_key: "testkey.avbpubkey",
6062 private_key: "testkey.pem",
6063 }
6064
6065 android_test_helper_app {
6066 name: "TesterHelpAppFoo",
6067 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006068 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006069 }
6070
6071 `)
6072
6073 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6074 apexRule := module.Rule("apexRule")
6075 copyCmds := apexRule.Args["copy_commands"]
6076
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006077 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006078}
6079
Jooyung Han18020ea2019-11-13 10:50:48 +09006080func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6081 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006082 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006083 apex {
6084 name: "myapex",
6085 key: "myapex.key",
6086 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006087 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006088 }
6089
6090 apex_key {
6091 name: "myapex.key",
6092 public_key: "testkey.avbpubkey",
6093 private_key: "testkey.pem",
6094 }
6095
6096 apex {
6097 name: "otherapex",
6098 key: "myapex.key",
6099 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006100 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006101 }
6102
6103 cc_defaults {
6104 name: "libfoo-defaults",
6105 apex_available: ["otherapex"],
6106 }
6107
6108 cc_library {
6109 name: "libfoo",
6110 defaults: ["libfoo-defaults"],
6111 stl: "none",
6112 system_shared_libs: [],
6113 }`)
6114}
6115
Paul Duffine52e66f2020-03-30 17:54:29 +01006116func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006117 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006118 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006119 apex {
6120 name: "myapex",
6121 key: "myapex.key",
6122 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006123 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006124 }
6125
6126 apex_key {
6127 name: "myapex.key",
6128 public_key: "testkey.avbpubkey",
6129 private_key: "testkey.pem",
6130 }
6131
6132 apex {
6133 name: "otherapex",
6134 key: "otherapex.key",
6135 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006136 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006137 }
6138
6139 apex_key {
6140 name: "otherapex.key",
6141 public_key: "testkey.avbpubkey",
6142 private_key: "testkey.pem",
6143 }
6144
6145 cc_library {
6146 name: "libfoo",
6147 stl: "none",
6148 system_shared_libs: [],
6149 apex_available: ["otherapex"],
6150 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006151}
Jiyong Park127b40b2019-09-30 16:04:35 +09006152
Paul Duffine52e66f2020-03-30 17:54:29 +01006153func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006154 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006155 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006156.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006157.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006158.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006159.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006160.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006161.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006162 apex {
6163 name: "myapex",
6164 key: "myapex.key",
6165 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006166 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006167 }
6168
6169 apex_key {
6170 name: "myapex.key",
6171 public_key: "testkey.avbpubkey",
6172 private_key: "testkey.pem",
6173 }
6174
Jiyong Park127b40b2019-09-30 16:04:35 +09006175 cc_library {
6176 name: "libfoo",
6177 stl: "none",
6178 shared_libs: ["libbar"],
6179 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006180 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006181 }
6182
6183 cc_library {
6184 name: "libbar",
6185 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006186 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006187 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006188 apex_available: ["myapex"],
6189 }
6190
6191 cc_library {
6192 name: "libbaz",
6193 stl: "none",
6194 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006195 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006196}
Jiyong Park127b40b2019-09-30 16:04:35 +09006197
Paul Duffine52e66f2020-03-30 17:54:29 +01006198func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006199 testApexError(t, "\"otherapex\" is not a valid module name", `
6200 apex {
6201 name: "myapex",
6202 key: "myapex.key",
6203 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006204 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006205 }
6206
6207 apex_key {
6208 name: "myapex.key",
6209 public_key: "testkey.avbpubkey",
6210 private_key: "testkey.pem",
6211 }
6212
6213 cc_library {
6214 name: "libfoo",
6215 stl: "none",
6216 system_shared_libs: [],
6217 apex_available: ["otherapex"],
6218 }`)
6219
Paul Duffine52e66f2020-03-30 17:54:29 +01006220 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006221 apex {
6222 name: "myapex",
6223 key: "myapex.key",
6224 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006225 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006226 }
6227
6228 apex_key {
6229 name: "myapex.key",
6230 public_key: "testkey.avbpubkey",
6231 private_key: "testkey.pem",
6232 }
6233
6234 cc_library {
6235 name: "libfoo",
6236 stl: "none",
6237 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006238 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006239 apex_available: ["myapex"],
6240 }
6241
6242 cc_library {
6243 name: "libbar",
6244 stl: "none",
6245 system_shared_libs: [],
6246 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006247 }
6248
6249 cc_library {
6250 name: "libbaz",
6251 stl: "none",
6252 system_shared_libs: [],
6253 stubs: {
6254 versions: ["10", "20", "30"],
6255 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006256 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006257}
Jiyong Park127b40b2019-09-30 16:04:35 +09006258
Jiyong Park89e850a2020-04-07 16:37:39 +09006259func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006260 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006261 apex {
6262 name: "myapex",
6263 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006264 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006265 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006266 }
6267
6268 apex_key {
6269 name: "myapex.key",
6270 public_key: "testkey.avbpubkey",
6271 private_key: "testkey.pem",
6272 }
6273
6274 cc_library {
6275 name: "libfoo",
6276 stl: "none",
6277 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006278 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006279 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006280 }
6281
6282 cc_library {
6283 name: "libfoo2",
6284 stl: "none",
6285 system_shared_libs: [],
6286 shared_libs: ["libbaz"],
6287 apex_available: ["//apex_available:platform"],
6288 }
6289
6290 cc_library {
6291 name: "libbar",
6292 stl: "none",
6293 system_shared_libs: [],
6294 apex_available: ["myapex"],
6295 }
6296
6297 cc_library {
6298 name: "libbaz",
6299 stl: "none",
6300 system_shared_libs: [],
6301 apex_available: ["myapex"],
6302 stubs: {
6303 versions: ["1"],
6304 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006305 }`)
6306
Jiyong Park89e850a2020-04-07 16:37:39 +09006307 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6308 // because it depends on libbar which isn't available to platform
6309 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6310 if libfoo.NotAvailableForPlatform() != true {
6311 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6312 }
6313
6314 // libfoo2 however can be available to platform because it depends on libbaz which provides
6315 // stubs
6316 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6317 if libfoo2.NotAvailableForPlatform() == true {
6318 t.Errorf("%q should be available to platform", libfoo2.String())
6319 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006320}
Jiyong Parka90ca002019-10-07 15:47:24 +09006321
Paul Duffine52e66f2020-03-30 17:54:29 +01006322func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006323 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006324 apex {
6325 name: "myapex",
6326 key: "myapex.key",
6327 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006328 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006329 }
6330
6331 apex_key {
6332 name: "myapex.key",
6333 public_key: "testkey.avbpubkey",
6334 private_key: "testkey.pem",
6335 }
6336
6337 cc_library {
6338 name: "libfoo",
6339 stl: "none",
6340 system_shared_libs: [],
6341 apex_available: ["myapex"],
6342 static: {
6343 apex_available: ["//apex_available:platform"],
6344 },
6345 }`)
6346
Jiyong Park89e850a2020-04-07 16:37:39 +09006347 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6348 if libfooShared.NotAvailableForPlatform() != true {
6349 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6350 }
6351 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6352 if libfooStatic.NotAvailableForPlatform() != false {
6353 t.Errorf("%q should be available to platform", libfooStatic.String())
6354 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006355}
6356
Jiyong Park5d790c32019-11-15 18:40:32 +09006357func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006358 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006359 apex {
6360 name: "myapex",
6361 key: "myapex.key",
6362 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006363 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006364 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006365 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006366 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006367 }
6368
6369 override_apex {
6370 name: "override_myapex",
6371 base: "myapex",
6372 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006373 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006374 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006375 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006376 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006377 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006378 key: "mynewapex.key",
6379 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006380 }
6381
6382 apex_key {
6383 name: "myapex.key",
6384 public_key: "testkey.avbpubkey",
6385 private_key: "testkey.pem",
6386 }
6387
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006388 apex_key {
6389 name: "mynewapex.key",
6390 public_key: "testkey2.avbpubkey",
6391 private_key: "testkey2.pem",
6392 }
6393
6394 android_app_certificate {
6395 name: "myapex.certificate",
6396 certificate: "testkey",
6397 }
6398
Jiyong Park5d790c32019-11-15 18:40:32 +09006399 android_app {
6400 name: "app",
6401 srcs: ["foo/bar/MyClass.java"],
6402 package_name: "foo",
6403 sdk_version: "none",
6404 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006405 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006406 }
6407
6408 override_android_app {
6409 name: "override_app",
6410 base: "app",
6411 package_name: "bar",
6412 }
markchien7c803b82021-08-26 22:10:06 +08006413
6414 bpf {
6415 name: "bpf",
6416 srcs: ["bpf.c"],
6417 }
6418
6419 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006420 name: "overrideBpf",
6421 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006422 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006423
6424 prebuilt_etc {
6425 name: "myetc",
6426 src: "myprebuilt",
6427 }
6428
6429 prebuilt_etc {
6430 name: "override_myetc",
6431 src: "override_myprebuilt",
6432 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006433 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006434
Jiyong Park317645e2019-12-05 13:20:58 +09006435 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6436 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6437 if originalVariant.GetOverriddenBy() != "" {
6438 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6439 }
6440 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6441 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6442 }
6443
Jiyong Park5d790c32019-11-15 18:40:32 +09006444 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6445 apexRule := module.Rule("apexRule")
6446 copyCmds := apexRule.Args["copy_commands"]
6447
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006448 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6449 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006450
markchien7c803b82021-08-26 22:10:06 +08006451 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006452 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006453
Daniel Norman5a3ce132021-08-26 15:44:43 -07006454 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6455 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6456
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006457 apexBundle := module.Module().(*apexBundle)
6458 name := apexBundle.Name()
6459 if name != "override_myapex" {
6460 t.Errorf("name should be \"override_myapex\", but was %q", name)
6461 }
6462
Baligh Uddin004d7172020-02-19 21:29:28 -08006463 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6464 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6465 }
6466
Jiyong Park20bacab2020-03-03 11:45:41 +09006467 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006468 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006469 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6470
6471 signApkRule := module.Rule("signapk")
6472 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006473
Colin Crossaa255532020-07-03 13:18:24 -07006474 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006475 var builder strings.Builder
6476 data.Custom(&builder, name, "TARGET_", "", data)
6477 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006478 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6479 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
6480 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006481 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006482 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006483 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006484 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006485 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006486 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
6487 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006488}
6489
Albert Martineefabcf2022-03-21 20:11:16 +00006490func TestMinSdkVersionOverride(t *testing.T) {
6491 // Override from 29 to 31
6492 minSdkOverride31 := "31"
6493 ctx := testApex(t, `
6494 apex {
6495 name: "myapex",
6496 key: "myapex.key",
6497 native_shared_libs: ["mylib"],
6498 updatable: true,
6499 min_sdk_version: "29"
6500 }
6501
6502 override_apex {
6503 name: "override_myapex",
6504 base: "myapex",
6505 logging_parent: "com.foo.bar",
6506 package_name: "test.overridden.package"
6507 }
6508
6509 apex_key {
6510 name: "myapex.key",
6511 public_key: "testkey.avbpubkey",
6512 private_key: "testkey.pem",
6513 }
6514
6515 cc_library {
6516 name: "mylib",
6517 srcs: ["mylib.cpp"],
6518 runtime_libs: ["libbar"],
6519 system_shared_libs: [],
6520 stl: "none",
6521 apex_available: [ "myapex" ],
6522 min_sdk_version: "apex_inherit"
6523 }
6524
6525 cc_library {
6526 name: "libbar",
6527 srcs: ["mylib.cpp"],
6528 system_shared_libs: [],
6529 stl: "none",
6530 apex_available: [ "myapex" ],
6531 min_sdk_version: "apex_inherit"
6532 }
6533
6534 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6535
6536 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6537 copyCmds := apexRule.Args["copy_commands"]
6538
6539 // Ensure that direct non-stubs dep is always included
6540 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6541
6542 // Ensure that runtime_libs dep in included
6543 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6544
6545 // Ensure libraries target overridden min_sdk_version value
6546 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6547}
6548
6549func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6550 // Attempt to override from 31 to 29, should be a NOOP
6551 minSdkOverride29 := "29"
6552 ctx := testApex(t, `
6553 apex {
6554 name: "myapex",
6555 key: "myapex.key",
6556 native_shared_libs: ["mylib"],
6557 updatable: true,
6558 min_sdk_version: "31"
6559 }
6560
6561 override_apex {
6562 name: "override_myapex",
6563 base: "myapex",
6564 logging_parent: "com.foo.bar",
6565 package_name: "test.overridden.package"
6566 }
6567
6568 apex_key {
6569 name: "myapex.key",
6570 public_key: "testkey.avbpubkey",
6571 private_key: "testkey.pem",
6572 }
6573
6574 cc_library {
6575 name: "mylib",
6576 srcs: ["mylib.cpp"],
6577 runtime_libs: ["libbar"],
6578 system_shared_libs: [],
6579 stl: "none",
6580 apex_available: [ "myapex" ],
6581 min_sdk_version: "apex_inherit"
6582 }
6583
6584 cc_library {
6585 name: "libbar",
6586 srcs: ["mylib.cpp"],
6587 system_shared_libs: [],
6588 stl: "none",
6589 apex_available: [ "myapex" ],
6590 min_sdk_version: "apex_inherit"
6591 }
6592
6593 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6594
6595 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6596 copyCmds := apexRule.Args["copy_commands"]
6597
6598 // Ensure that direct non-stubs dep is always included
6599 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6600
6601 // Ensure that runtime_libs dep in included
6602 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6603
6604 // Ensure libraries target the original min_sdk_version value rather than the overridden
6605 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6606}
6607
Jooyung Han214bf372019-11-12 13:03:50 +09006608func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006609 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006610 apex {
6611 name: "myapex",
6612 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006613 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006614 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006615 }
6616
6617 apex_key {
6618 name: "myapex.key",
6619 public_key: "testkey.avbpubkey",
6620 private_key: "testkey.pem",
6621 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006622
6623 cc_library {
6624 name: "mylib",
6625 srcs: ["mylib.cpp"],
6626 stl: "libc++",
6627 system_shared_libs: [],
6628 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006629 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006630 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006631 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006632
6633 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6634 args := module.Rule("apexRule").Args
6635 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006636 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006637
6638 // The copies of the libraries in the apex should have one more dependency than
6639 // the ones outside the apex, namely the unwinder. Ideally we should check
6640 // the dependency names directly here but for some reason the names are blank in
6641 // this test.
6642 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006643 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006644 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6645 if len(apexImplicits) != len(nonApexImplicits)+1 {
6646 t.Errorf("%q missing unwinder dep", lib)
6647 }
6648 }
Jooyung Han214bf372019-11-12 13:03:50 +09006649}
6650
Paul Duffine05480a2021-03-08 15:07:14 +00006651var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006652 "api/current.txt": nil,
6653 "api/removed.txt": nil,
6654 "api/system-current.txt": nil,
6655 "api/system-removed.txt": nil,
6656 "api/test-current.txt": nil,
6657 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006658
Anton Hanssondff2c782020-12-21 17:10:01 +00006659 "100/public/api/foo.txt": nil,
6660 "100/public/api/foo-removed.txt": nil,
6661 "100/system/api/foo.txt": nil,
6662 "100/system/api/foo-removed.txt": nil,
6663
Paul Duffineedc5d52020-06-12 17:46:39 +01006664 // For java_sdk_library_import
6665 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006666}
6667
Jooyung Han58f26ab2019-12-18 15:34:32 +09006668func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006669 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006670 apex {
6671 name: "myapex",
6672 key: "myapex.key",
6673 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006674 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006675 }
6676
6677 apex_key {
6678 name: "myapex.key",
6679 public_key: "testkey.avbpubkey",
6680 private_key: "testkey.pem",
6681 }
6682
6683 java_sdk_library {
6684 name: "foo",
6685 srcs: ["a.java"],
6686 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006687 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006688 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006689
6690 prebuilt_apis {
6691 name: "sdk",
6692 api_dirs: ["100"],
6693 }
Paul Duffin9b879592020-05-26 13:21:35 +01006694 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006695
6696 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006697 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006698 "javalib/foo.jar",
6699 "etc/permissions/foo.xml",
6700 })
6701 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006702 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006703 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 +09006704}
6705
Paul Duffin9b879592020-05-26 13:21:35 +01006706func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006707 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006708 apex {
6709 name: "myapex",
6710 key: "myapex.key",
6711 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006712 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006713 }
6714
6715 apex_key {
6716 name: "myapex.key",
6717 public_key: "testkey.avbpubkey",
6718 private_key: "testkey.pem",
6719 }
6720
6721 java_sdk_library {
6722 name: "foo",
6723 srcs: ["a.java"],
6724 api_packages: ["foo"],
6725 apex_available: ["myapex"],
6726 sdk_version: "none",
6727 system_modules: "none",
6728 }
6729
6730 java_library {
6731 name: "bar",
6732 srcs: ["a.java"],
6733 libs: ["foo"],
6734 apex_available: ["myapex"],
6735 sdk_version: "none",
6736 system_modules: "none",
6737 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006738
6739 prebuilt_apis {
6740 name: "sdk",
6741 api_dirs: ["100"],
6742 }
Paul Duffin9b879592020-05-26 13:21:35 +01006743 `, withFiles(filesForSdkLibrary))
6744
6745 // java_sdk_library installs both impl jar and permission XML
6746 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6747 "javalib/bar.jar",
6748 "javalib/foo.jar",
6749 "etc/permissions/foo.xml",
6750 })
6751
6752 // The bar library should depend on the implementation jar.
6753 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006754 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006755 t.Errorf("expected %q, found %#q", expected, actual)
6756 }
6757}
6758
6759func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006760 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006761 apex {
6762 name: "myapex",
6763 key: "myapex.key",
6764 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006765 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006766 }
6767
6768 apex_key {
6769 name: "myapex.key",
6770 public_key: "testkey.avbpubkey",
6771 private_key: "testkey.pem",
6772 }
6773
6774 java_sdk_library {
6775 name: "foo",
6776 srcs: ["a.java"],
6777 api_packages: ["foo"],
6778 apex_available: ["myapex"],
6779 sdk_version: "none",
6780 system_modules: "none",
6781 }
6782
6783 java_library {
6784 name: "bar",
6785 srcs: ["a.java"],
6786 libs: ["foo"],
6787 sdk_version: "none",
6788 system_modules: "none",
6789 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006790
6791 prebuilt_apis {
6792 name: "sdk",
6793 api_dirs: ["100"],
6794 }
Paul Duffin9b879592020-05-26 13:21:35 +01006795 `, withFiles(filesForSdkLibrary))
6796
6797 // java_sdk_library installs both impl jar and permission XML
6798 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6799 "javalib/foo.jar",
6800 "etc/permissions/foo.xml",
6801 })
6802
6803 // The bar library should depend on the stubs jar.
6804 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006805 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006806 t.Errorf("expected %q, found %#q", expected, actual)
6807 }
6808}
6809
Paul Duffineedc5d52020-06-12 17:46:39 +01006810func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006811 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006812 prebuilt_apis {
6813 name: "sdk",
6814 api_dirs: ["100"],
6815 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006816 withFiles(map[string][]byte{
6817 "apex/a.java": nil,
6818 "apex/apex_manifest.json": nil,
6819 "apex/Android.bp": []byte(`
6820 package {
6821 default_visibility: ["//visibility:private"],
6822 }
6823
6824 apex {
6825 name: "myapex",
6826 key: "myapex.key",
6827 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006828 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006829 }
6830
6831 apex_key {
6832 name: "myapex.key",
6833 public_key: "testkey.avbpubkey",
6834 private_key: "testkey.pem",
6835 }
6836
6837 java_library {
6838 name: "bar",
6839 srcs: ["a.java"],
6840 libs: ["foo"],
6841 apex_available: ["myapex"],
6842 sdk_version: "none",
6843 system_modules: "none",
6844 }
6845`),
6846 "source/a.java": nil,
6847 "source/api/current.txt": nil,
6848 "source/api/removed.txt": nil,
6849 "source/Android.bp": []byte(`
6850 package {
6851 default_visibility: ["//visibility:private"],
6852 }
6853
6854 java_sdk_library {
6855 name: "foo",
6856 visibility: ["//apex"],
6857 srcs: ["a.java"],
6858 api_packages: ["foo"],
6859 apex_available: ["myapex"],
6860 sdk_version: "none",
6861 system_modules: "none",
6862 public: {
6863 enabled: true,
6864 },
6865 }
6866`),
6867 "prebuilt/a.jar": nil,
6868 "prebuilt/Android.bp": []byte(`
6869 package {
6870 default_visibility: ["//visibility:private"],
6871 }
6872
6873 java_sdk_library_import {
6874 name: "foo",
6875 visibility: ["//apex", "//source"],
6876 apex_available: ["myapex"],
6877 prefer: true,
6878 public: {
6879 jars: ["a.jar"],
6880 },
6881 }
6882`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006883 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006884 )
6885
6886 // java_sdk_library installs both impl jar and permission XML
6887 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6888 "javalib/bar.jar",
6889 "javalib/foo.jar",
6890 "etc/permissions/foo.xml",
6891 })
6892
6893 // The bar library should depend on the implementation jar.
6894 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006895 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006896 t.Errorf("expected %q, found %#q", expected, actual)
6897 }
6898}
6899
6900func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6901 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6902 apex {
6903 name: "myapex",
6904 key: "myapex.key",
6905 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006906 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006907 }
6908
6909 apex_key {
6910 name: "myapex.key",
6911 public_key: "testkey.avbpubkey",
6912 private_key: "testkey.pem",
6913 }
6914
6915 java_sdk_library_import {
6916 name: "foo",
6917 apex_available: ["myapex"],
6918 prefer: true,
6919 public: {
6920 jars: ["a.jar"],
6921 },
6922 }
6923
6924 `, withFiles(filesForSdkLibrary))
6925}
6926
atrost6e126252020-01-27 17:01:16 +00006927func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006928 result := android.GroupFixturePreparers(
6929 prepareForApexTest,
6930 java.PrepareForTestWithPlatformCompatConfig,
6931 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006932 apex {
6933 name: "myapex",
6934 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006935 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006936 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006937 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006938 }
6939
6940 apex_key {
6941 name: "myapex.key",
6942 public_key: "testkey.avbpubkey",
6943 private_key: "testkey.pem",
6944 }
6945
6946 platform_compat_config {
6947 name: "myjar-platform-compat-config",
6948 src: ":myjar",
6949 }
6950
6951 java_library {
6952 name: "myjar",
6953 srcs: ["foo/bar/MyClass.java"],
6954 sdk_version: "none",
6955 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006956 apex_available: [ "myapex" ],
6957 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006958
6959 // Make sure that a preferred prebuilt does not affect the apex contents.
6960 prebuilt_platform_compat_config {
6961 name: "myjar-platform-compat-config",
6962 metadata: "compat-config/metadata.xml",
6963 prefer: true,
6964 }
atrost6e126252020-01-27 17:01:16 +00006965 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006966 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006967 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6968 "etc/compatconfig/myjar-platform-compat-config.xml",
6969 "javalib/myjar.jar",
6970 })
6971}
6972
Jooyung Han862c0d62022-12-21 10:15:37 +09006973func TestNoDupeApexFiles(t *testing.T) {
6974 android.GroupFixturePreparers(
6975 android.PrepareForTestWithAndroidBuildComponents,
6976 PrepareForTestWithApexBuildComponents,
6977 prepareForTestWithMyapex,
6978 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
6979 ).
6980 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
6981 RunTestWithBp(t, `
6982 apex {
6983 name: "myapex",
6984 key: "myapex.key",
6985 prebuilts: ["foo", "bar"],
6986 updatable: false,
6987 }
6988
6989 apex_key {
6990 name: "myapex.key",
6991 public_key: "testkey.avbpubkey",
6992 private_key: "testkey.pem",
6993 }
6994
6995 prebuilt_etc {
6996 name: "foo",
6997 src: "myprebuilt",
6998 filename_from_src: true,
6999 }
7000
7001 prebuilt_etc {
7002 name: "bar",
7003 src: "myprebuilt",
7004 filename_from_src: true,
7005 }
7006 `)
7007}
7008
Jiyong Park479321d2019-12-16 11:47:12 +09007009func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7010 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7011 apex {
7012 name: "myapex",
7013 key: "myapex.key",
7014 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007015 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007016 }
7017
7018 apex_key {
7019 name: "myapex.key",
7020 public_key: "testkey.avbpubkey",
7021 private_key: "testkey.pem",
7022 }
7023
7024 java_library {
7025 name: "myjar",
7026 srcs: ["foo/bar/MyClass.java"],
7027 sdk_version: "none",
7028 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007029 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007030 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007031 }
7032 `)
7033}
7034
Jiyong Park7afd1072019-12-30 16:56:33 +09007035func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007036 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007037 apex {
7038 name: "myapex",
7039 key: "myapex.key",
7040 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007041 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007042 }
7043
7044 apex_key {
7045 name: "myapex.key",
7046 public_key: "testkey.avbpubkey",
7047 private_key: "testkey.pem",
7048 }
7049
7050 cc_library {
7051 name: "mylib",
7052 srcs: ["mylib.cpp"],
7053 system_shared_libs: [],
7054 stl: "none",
7055 required: ["a", "b"],
7056 host_required: ["c", "d"],
7057 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007058 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007059 }
7060 `)
7061
7062 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007063 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007064 name := apexBundle.BaseModuleName()
7065 prefix := "TARGET_"
7066 var builder strings.Builder
7067 data.Custom(&builder, name, prefix, "", data)
7068 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007069 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 -08007070 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7071 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007072}
7073
Jiyong Park7cd10e32020-01-14 09:22:18 +09007074func TestSymlinksFromApexToSystem(t *testing.T) {
7075 bp := `
7076 apex {
7077 name: "myapex",
7078 key: "myapex.key",
7079 native_shared_libs: ["mylib"],
7080 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007081 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007082 }
7083
Jiyong Park9d677202020-02-19 16:29:35 +09007084 apex {
7085 name: "myapex.updatable",
7086 key: "myapex.key",
7087 native_shared_libs: ["mylib"],
7088 java_libs: ["myjar"],
7089 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09007090 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09007091 }
7092
Jiyong Park7cd10e32020-01-14 09:22:18 +09007093 apex_key {
7094 name: "myapex.key",
7095 public_key: "testkey.avbpubkey",
7096 private_key: "testkey.pem",
7097 }
7098
7099 cc_library {
7100 name: "mylib",
7101 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007102 shared_libs: [
7103 "myotherlib",
7104 "myotherlib_ext",
7105 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007106 system_shared_libs: [],
7107 stl: "none",
7108 apex_available: [
7109 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007110 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007111 "//apex_available:platform",
7112 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007113 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007114 }
7115
7116 cc_library {
7117 name: "myotherlib",
7118 srcs: ["mylib.cpp"],
7119 system_shared_libs: [],
7120 stl: "none",
7121 apex_available: [
7122 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007123 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007124 "//apex_available:platform",
7125 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007126 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007127 }
7128
Jiyong Parkce243632023-02-17 18:22:25 +09007129 cc_library {
7130 name: "myotherlib_ext",
7131 srcs: ["mylib.cpp"],
7132 system_shared_libs: [],
7133 system_ext_specific: true,
7134 stl: "none",
7135 apex_available: [
7136 "myapex",
7137 "myapex.updatable",
7138 "//apex_available:platform",
7139 ],
7140 min_sdk_version: "current",
7141 }
7142
Jiyong Park7cd10e32020-01-14 09:22:18 +09007143 java_library {
7144 name: "myjar",
7145 srcs: ["foo/bar/MyClass.java"],
7146 sdk_version: "none",
7147 system_modules: "none",
7148 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007149 apex_available: [
7150 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007151 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007152 "//apex_available:platform",
7153 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007154 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007155 }
7156
7157 java_library {
7158 name: "myotherjar",
7159 srcs: ["foo/bar/MyClass.java"],
7160 sdk_version: "none",
7161 system_modules: "none",
7162 apex_available: [
7163 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007164 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007165 "//apex_available:platform",
7166 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007167 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007168 }
7169 `
7170
7171 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7172 for _, f := range files {
7173 if f.path == file {
7174 if f.isLink {
7175 t.Errorf("%q is not a real file", file)
7176 }
7177 return
7178 }
7179 }
7180 t.Errorf("%q is not found", file)
7181 }
7182
Jiyong Parkce243632023-02-17 18:22:25 +09007183 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007184 for _, f := range files {
7185 if f.path == file {
7186 if !f.isLink {
7187 t.Errorf("%q is not a symlink", file)
7188 }
Jiyong Parkce243632023-02-17 18:22:25 +09007189 if f.src != target {
7190 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7191 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007192 return
7193 }
7194 }
7195 t.Errorf("%q is not found", file)
7196 }
7197
Jiyong Park9d677202020-02-19 16:29:35 +09007198 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7199 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007200 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007201 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007202 ensureRealfileExists(t, files, "javalib/myjar.jar")
7203 ensureRealfileExists(t, files, "lib64/mylib.so")
7204 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007205 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007206
Jiyong Park9d677202020-02-19 16:29:35 +09007207 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7208 ensureRealfileExists(t, files, "javalib/myjar.jar")
7209 ensureRealfileExists(t, files, "lib64/mylib.so")
7210 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007211 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007212
7213 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007214 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007215 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007216 ensureRealfileExists(t, files, "javalib/myjar.jar")
7217 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007218 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7219 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007220
7221 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7222 ensureRealfileExists(t, files, "javalib/myjar.jar")
7223 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007224 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7225 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007226}
7227
Yo Chiange8128052020-07-23 20:09:18 +08007228func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007229 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007230 apex {
7231 name: "myapex",
7232 key: "myapex.key",
7233 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007234 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007235 }
7236
7237 apex_key {
7238 name: "myapex.key",
7239 public_key: "testkey.avbpubkey",
7240 private_key: "testkey.pem",
7241 }
7242
7243 cc_library_shared {
7244 name: "mylib",
7245 srcs: ["mylib.cpp"],
7246 shared_libs: ["myotherlib"],
7247 system_shared_libs: [],
7248 stl: "none",
7249 apex_available: [
7250 "myapex",
7251 "//apex_available:platform",
7252 ],
7253 }
7254
7255 cc_prebuilt_library_shared {
7256 name: "myotherlib",
7257 srcs: ["prebuilt.so"],
7258 system_shared_libs: [],
7259 stl: "none",
7260 apex_available: [
7261 "myapex",
7262 "//apex_available:platform",
7263 ],
7264 }
7265 `)
7266
Prerana Patilb1896c82022-11-09 18:14:34 +00007267 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007268 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007269 var builder strings.Builder
7270 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7271 androidMk := builder.String()
7272 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007273 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007274 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7275 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7276 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007277 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 +08007278}
7279
Jooyung Han643adc42020-02-27 13:50:06 +09007280func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007281 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007282 apex {
7283 name: "myapex",
7284 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007285 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007286 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007287 }
7288
7289 apex_key {
7290 name: "myapex.key",
7291 public_key: "testkey.avbpubkey",
7292 private_key: "testkey.pem",
7293 }
7294
7295 cc_library {
7296 name: "mylib",
7297 srcs: ["mylib.cpp"],
7298 shared_libs: ["mylib2"],
7299 system_shared_libs: [],
7300 stl: "none",
7301 apex_available: [ "myapex" ],
7302 }
7303
7304 cc_library {
7305 name: "mylib2",
7306 srcs: ["mylib.cpp"],
7307 system_shared_libs: [],
7308 stl: "none",
7309 apex_available: [ "myapex" ],
7310 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007311
7312 rust_ffi_shared {
7313 name: "libfoo.rust",
7314 crate_name: "foo",
7315 srcs: ["foo.rs"],
7316 shared_libs: ["libfoo.shared_from_rust"],
7317 prefer_rlib: true,
7318 apex_available: ["myapex"],
7319 }
7320
7321 cc_library_shared {
7322 name: "libfoo.shared_from_rust",
7323 srcs: ["mylib.cpp"],
7324 system_shared_libs: [],
7325 stl: "none",
7326 stubs: {
7327 versions: ["10", "11", "12"],
7328 },
7329 }
7330
Jooyung Han643adc42020-02-27 13:50:06 +09007331 `)
7332
7333 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7334 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007335 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007336 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7337 "lib64/mylib.so",
7338 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007339 "lib64/libfoo.rust.so",
7340 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7341 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007342 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007343
7344 // b/220397949
7345 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007346}
7347
Jooyung Han49f67012020-04-17 13:43:10 +09007348func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007349 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007350 apex {
7351 name: "myapex",
7352 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007353 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007354 }
7355 apex_key {
7356 name: "myapex.key",
7357 public_key: "testkey.avbpubkey",
7358 private_key: "testkey.pem",
7359 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007360 `,
7361 android.FixtureModifyConfig(func(config android.Config) {
7362 delete(config.Targets, android.Android)
7363 config.AndroidCommonTarget = android.Target{}
7364 }),
7365 )
Jooyung Han49f67012020-04-17 13:43:10 +09007366
7367 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7368 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7369 }
7370}
7371
Jiyong Parkbd159612020-02-28 15:22:21 +09007372func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007373 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007374 apex {
7375 name: "myapex",
7376 key: "myapex.key",
7377 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007378 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007379 }
7380
7381 apex_key {
7382 name: "myapex.key",
7383 public_key: "testkey.avbpubkey",
7384 private_key: "testkey.pem",
7385 }
7386
7387 android_app {
7388 name: "AppFoo",
7389 srcs: ["foo/bar/MyClass.java"],
7390 sdk_version: "none",
7391 system_modules: "none",
7392 apex_available: [ "myapex" ],
7393 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007394 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007395
Colin Crosscf371cc2020-11-13 11:48:42 -08007396 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007397 content := bundleConfigRule.Args["content"]
7398
7399 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007400 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 +09007401}
7402
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007403func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007404 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007405 apex {
7406 name: "myapex",
7407 key: "myapex.key",
7408 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007409 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007410 }
7411
7412 apex_key {
7413 name: "myapex.key",
7414 public_key: "testkey.avbpubkey",
7415 private_key: "testkey.pem",
7416 }
7417
7418 android_app_set {
7419 name: "AppSet",
7420 set: "AppSet.apks",
7421 }`)
7422 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007423 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007424 content := bundleConfigRule.Args["content"]
7425 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7426 s := mod.Rule("apexRule").Args["copy_commands"]
7427 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007428 if len(copyCmds) != 4 {
7429 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007430 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007431 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7432 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007433 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7434 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007435
7436 // Ensure that canned_fs_config has an entry for the app set zip file
7437 generateFsRule := mod.Rule("generateFsConfig")
7438 cmd := generateFsRule.RuleParams.Command
7439 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007440}
7441
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007442func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007443 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007444 apex_set {
7445 name: "myapex",
7446 filename: "foo_v2.apex",
7447 sanitized: {
7448 none: { set: "myapex.apks", },
7449 hwaddress: { set: "myapex.hwasan.apks", },
7450 },
Paul Duffin24704672021-04-06 16:09:30 +01007451 }
7452 `
7453 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007454
Paul Duffin24704672021-04-06 16:09:30 +01007455 // Check that the extractor produces the correct output file from the correct input file.
7456 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007457
Paul Duffin24704672021-04-06 16:09:30 +01007458 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7459 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007460
Paul Duffin24704672021-04-06 16:09:30 +01007461 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7462
7463 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007464 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7465 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007466
7467 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007468}
7469
Pranav Guptaeba03b02022-09-27 00:27:08 +00007470func TestApexSetApksModuleAssignment(t *testing.T) {
7471 ctx := testApex(t, `
7472 apex_set {
7473 name: "myapex",
7474 set: ":myapex_apks_file",
7475 }
7476
7477 filegroup {
7478 name: "myapex_apks_file",
7479 srcs: ["myapex.apks"],
7480 }
7481 `)
7482
7483 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7484
7485 // Check that the extractor produces the correct apks file from the input module
7486 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7487 extractedApex := m.Output(extractorOutput)
7488
7489 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7490}
7491
Paul Duffin89f570a2021-06-16 01:42:33 +01007492func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007493 t.Helper()
7494
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007495 bp := `
7496 java_library {
7497 name: "some-updatable-apex-lib",
7498 srcs: ["a.java"],
7499 sdk_version: "current",
7500 apex_available: [
7501 "some-updatable-apex",
7502 ],
satayevabcd5972021-08-06 17:49:46 +01007503 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007504 }
7505
7506 java_library {
7507 name: "some-non-updatable-apex-lib",
7508 srcs: ["a.java"],
7509 apex_available: [
7510 "some-non-updatable-apex",
7511 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007512 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007513 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007514 }
7515
7516 bootclasspath_fragment {
7517 name: "some-non-updatable-fragment",
7518 contents: ["some-non-updatable-apex-lib"],
7519 apex_available: [
7520 "some-non-updatable-apex",
7521 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007522 hidden_api: {
7523 split_packages: ["*"],
7524 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007525 }
7526
7527 java_library {
7528 name: "some-platform-lib",
7529 srcs: ["a.java"],
7530 sdk_version: "current",
7531 installable: true,
7532 }
7533
7534 java_library {
7535 name: "some-art-lib",
7536 srcs: ["a.java"],
7537 sdk_version: "current",
7538 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007539 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007540 ],
7541 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007542 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007543 }
7544
7545 apex {
7546 name: "some-updatable-apex",
7547 key: "some-updatable-apex.key",
7548 java_libs: ["some-updatable-apex-lib"],
7549 updatable: true,
7550 min_sdk_version: "current",
7551 }
7552
7553 apex {
7554 name: "some-non-updatable-apex",
7555 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007556 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007557 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007558 }
7559
7560 apex_key {
7561 name: "some-updatable-apex.key",
7562 }
7563
7564 apex_key {
7565 name: "some-non-updatable-apex.key",
7566 }
7567
7568 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007569 name: "com.android.art.debug",
7570 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007571 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007572 updatable: true,
7573 min_sdk_version: "current",
7574 }
7575
Paul Duffinf23bc472021-04-27 12:42:20 +01007576 bootclasspath_fragment {
7577 name: "art-bootclasspath-fragment",
7578 image_name: "art",
7579 contents: ["some-art-lib"],
7580 apex_available: [
7581 "com.android.art.debug",
7582 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007583 hidden_api: {
7584 split_packages: ["*"],
7585 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007586 }
7587
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007588 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007589 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007590 }
7591
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007592 filegroup {
7593 name: "some-updatable-apex-file_contexts",
7594 srcs: [
7595 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7596 ],
7597 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007598
7599 filegroup {
7600 name: "some-non-updatable-apex-file_contexts",
7601 srcs: [
7602 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7603 ],
7604 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007605 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007606
Paul Duffin89f570a2021-06-16 01:42:33 +01007607 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007608}
7609
Paul Duffin89f570a2021-06-16 01:42:33 +01007610func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007611 t.Helper()
7612
Paul Duffin55607122021-03-30 23:32:51 +01007613 fs := android.MockFS{
7614 "a.java": nil,
7615 "a.jar": nil,
7616 "apex_manifest.json": nil,
7617 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007618 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007619 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7620 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7621 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007622 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007623 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007624
Paul Duffin55607122021-03-30 23:32:51 +01007625 errorHandler := android.FixtureExpectsNoErrors
7626 if errmsg != "" {
7627 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007628 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007629
Paul Duffin55607122021-03-30 23:32:51 +01007630 result := android.GroupFixturePreparers(
7631 cc.PrepareForTestWithCcDefaultModules,
7632 java.PrepareForTestWithHiddenApiBuildComponents,
7633 java.PrepareForTestWithJavaDefaultModules,
7634 java.PrepareForTestWithJavaSdkLibraryFiles,
7635 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007636 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007637 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007638 android.FixtureModifyMockFS(func(fs android.MockFS) {
7639 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7640 insert := ""
7641 for _, fragment := range fragments {
7642 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7643 }
7644 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7645 platform_bootclasspath {
7646 name: "platform-bootclasspath",
7647 fragments: [
7648 %s
7649 ],
7650 }
7651 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007652 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007653 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007654 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007655 ).
7656 ExtendWithErrorHandler(errorHandler).
7657 RunTestWithBp(t, bp)
7658
7659 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007660}
7661
Paul Duffin5556c5f2022-06-09 17:32:21 +00007662func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007663 preparers := android.GroupFixturePreparers(
7664 java.PrepareForTestWithJavaDefaultModules,
7665 PrepareForTestWithApexBuildComponents,
7666 ).
7667 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7668 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7669
7670 bpBase := `
7671 apex_set {
7672 name: "com.android.myapex",
7673 installable: true,
7674 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7675 set: "myapex.apks",
7676 }
7677
7678 apex_set {
7679 name: "com.mycompany.android.myapex",
7680 apex_name: "com.android.myapex",
7681 installable: true,
7682 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7683 set: "company-myapex.apks",
7684 }
7685
7686 prebuilt_bootclasspath_fragment {
7687 name: "my-bootclasspath-fragment",
7688 apex_available: ["com.android.myapex"],
7689 %s
7690 }
7691 `
7692
7693 t.Run("java_import", func(t *testing.T) {
7694 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7695 java_import {
7696 name: "libfoo",
7697 jars: ["libfoo.jar"],
7698 apex_available: ["com.android.myapex"],
7699 }
7700 `)
7701 })
7702
7703 t.Run("java_sdk_library_import", func(t *testing.T) {
7704 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7705 java_sdk_library_import {
7706 name: "libfoo",
7707 public: {
7708 jars: ["libbar.jar"],
7709 },
7710 apex_available: ["com.android.myapex"],
7711 }
7712 `)
7713 })
7714
7715 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7716 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7717 image_name: "art",
7718 contents: ["libfoo"],
7719 `)+`
7720 java_sdk_library_import {
7721 name: "libfoo",
7722 public: {
7723 jars: ["libbar.jar"],
7724 },
7725 apex_available: ["com.android.myapex"],
7726 }
7727 `)
7728 })
7729}
7730
Paul Duffin5556c5f2022-06-09 17:32:21 +00007731func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7732 preparers := android.GroupFixturePreparers(
7733 java.PrepareForTestWithJavaDefaultModules,
7734 PrepareForTestWithApexBuildComponents,
7735 )
7736
7737 bpBase := `
7738 apex_set {
7739 name: "com.android.myapex",
7740 installable: true,
7741 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7742 set: "myapex.apks",
7743 }
7744
7745 apex_set {
7746 name: "com.android.myapex_compressed",
7747 apex_name: "com.android.myapex",
7748 installable: true,
7749 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7750 set: "myapex_compressed.apks",
7751 }
7752
7753 prebuilt_bootclasspath_fragment {
7754 name: "my-bootclasspath-fragment",
7755 apex_available: [
7756 "com.android.myapex",
7757 "com.android.myapex_compressed",
7758 ],
7759 hidden_api: {
7760 annotation_flags: "annotation-flags.csv",
7761 metadata: "metadata.csv",
7762 index: "index.csv",
7763 signature_patterns: "signature_patterns.csv",
7764 },
7765 %s
7766 }
7767 `
7768
7769 t.Run("java_import", func(t *testing.T) {
7770 result := preparers.RunTestWithBp(t,
7771 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7772 java_import {
7773 name: "libfoo",
7774 jars: ["libfoo.jar"],
7775 apex_available: [
7776 "com.android.myapex",
7777 "com.android.myapex_compressed",
7778 ],
7779 }
7780 `)
7781
7782 module := result.Module("libfoo", "android_common_com.android.myapex")
7783 usesLibraryDep := module.(java.UsesLibraryDependency)
7784 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7785 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7786 usesLibraryDep.DexJarBuildPath().Path())
7787 })
7788
7789 t.Run("java_sdk_library_import", func(t *testing.T) {
7790 result := preparers.RunTestWithBp(t,
7791 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7792 java_sdk_library_import {
7793 name: "libfoo",
7794 public: {
7795 jars: ["libbar.jar"],
7796 },
7797 apex_available: [
7798 "com.android.myapex",
7799 "com.android.myapex_compressed",
7800 ],
7801 compile_dex: true,
7802 }
7803 `)
7804
7805 module := result.Module("libfoo", "android_common_com.android.myapex")
7806 usesLibraryDep := module.(java.UsesLibraryDependency)
7807 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7808 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7809 usesLibraryDep.DexJarBuildPath().Path())
7810 })
7811
7812 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7813 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7814 image_name: "art",
7815 contents: ["libfoo"],
7816 `)+`
7817 java_sdk_library_import {
7818 name: "libfoo",
7819 public: {
7820 jars: ["libbar.jar"],
7821 },
7822 apex_available: [
7823 "com.android.myapex",
7824 "com.android.myapex_compressed",
7825 ],
7826 compile_dex: true,
7827 }
7828 `)
7829 })
7830}
7831
Jooyung Han548640b2020-04-27 12:10:30 +09007832func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7833 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7834 apex {
7835 name: "myapex",
7836 key: "myapex.key",
7837 updatable: true,
7838 }
7839
7840 apex_key {
7841 name: "myapex.key",
7842 public_key: "testkey.avbpubkey",
7843 private_key: "testkey.pem",
7844 }
7845 `)
7846}
7847
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007848func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7849 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7850 apex {
7851 name: "myapex",
7852 key: "myapex.key",
7853 }
7854
7855 apex_key {
7856 name: "myapex.key",
7857 public_key: "testkey.avbpubkey",
7858 private_key: "testkey.pem",
7859 }
7860 `)
7861}
7862
Daniel Norman69109112021-12-02 12:52:42 -08007863func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7864 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7865 apex {
7866 name: "myapex",
7867 key: "myapex.key",
7868 updatable: true,
7869 soc_specific: true,
7870 }
7871
7872 apex_key {
7873 name: "myapex.key",
7874 public_key: "testkey.avbpubkey",
7875 private_key: "testkey.pem",
7876 }
7877 `)
7878}
7879
satayevb98371c2021-06-15 16:49:50 +01007880func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7881 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7882 apex {
7883 name: "myapex",
7884 key: "myapex.key",
7885 systemserverclasspath_fragments: [
7886 "mysystemserverclasspathfragment",
7887 ],
7888 min_sdk_version: "29",
7889 updatable: true,
7890 }
7891
7892 apex_key {
7893 name: "myapex.key",
7894 public_key: "testkey.avbpubkey",
7895 private_key: "testkey.pem",
7896 }
7897
7898 java_library {
7899 name: "foo",
7900 srcs: ["b.java"],
7901 min_sdk_version: "29",
7902 installable: true,
7903 apex_available: [
7904 "myapex",
7905 ],
7906 }
7907
7908 systemserverclasspath_fragment {
7909 name: "mysystemserverclasspathfragment",
7910 generate_classpaths_proto: false,
7911 contents: [
7912 "foo",
7913 ],
7914 apex_available: [
7915 "myapex",
7916 ],
7917 }
satayevabcd5972021-08-06 17:49:46 +01007918 `,
7919 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7920 )
satayevb98371c2021-06-15 16:49:50 +01007921}
7922
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007923func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007924 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7925 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7926 // modules to be included in the BootJars.
7927 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7928 return android.GroupFixturePreparers(
7929 dexpreopt.FixtureSetBootJars(bootJars...),
7930 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7931 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7932 }),
7933 )
7934 }
7935
7936 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7937 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7938 // specified in the ArtApexJars configuration.
7939 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7940 return android.GroupFixturePreparers(
7941 dexpreopt.FixtureSetArtBootJars(bootJars...),
7942 dexpreopt.FixtureSetBootJars(bootJars...),
7943 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7944 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7945 }),
7946 )
7947 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007948
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007949 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007950 preparer := android.GroupFixturePreparers(
7951 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7952 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7953 )
7954 fragments := []java.ApexVariantReference{
7955 {
7956 Apex: proptools.StringPtr("com.android.art.debug"),
7957 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7958 },
7959 {
7960 Apex: proptools.StringPtr("some-non-updatable-apex"),
7961 Module: proptools.StringPtr("some-non-updatable-fragment"),
7962 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007963 }
satayevabcd5972021-08-06 17:49:46 +01007964 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007965 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007966
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007967 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007968 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7969 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007970 preparer := android.GroupFixturePreparers(
7971 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7972 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7973 )
Paul Duffin60264a02021-04-12 20:02:36 +01007974 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007975 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007976
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007977 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 +01007978 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 +01007979 // Update the dexpreopt ArtApexJars directly.
7980 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7981 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007982 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007983
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007984 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 +01007985 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 +01007986 // Update the dexpreopt ArtApexJars directly.
7987 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7988 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007989 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007990
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007991 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 +01007992 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 +01007993 preparer := android.GroupFixturePreparers(
7994 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7995 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7996 )
Paul Duffin60264a02021-04-12 20:02:36 +01007997 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007998 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007999
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008000 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 +01008001 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01008002 fragment := java.ApexVariantReference{
8003 Apex: proptools.StringPtr("some-non-updatable-apex"),
8004 Module: proptools.StringPtr("some-non-updatable-fragment"),
8005 }
8006 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008007 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008008
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008009 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008010 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008011 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8012 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008013 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008014
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008015 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008016 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008017 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8018 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008019 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008020
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008021 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008022 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01008023 // Update the dexpreopt ArtApexJars directly.
8024 preparer := prepareSetArtJars("platform:some-platform-lib")
8025 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008026 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008027
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008028 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008029 preparer := android.GroupFixturePreparers(
8030 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8031 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8032 )
8033 fragments := []java.ApexVariantReference{
8034 {
8035 Apex: proptools.StringPtr("some-non-updatable-apex"),
8036 Module: proptools.StringPtr("some-non-updatable-fragment"),
8037 },
8038 }
8039 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008040 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008041}
8042
8043func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008044 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008045 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008046 fragment := java.ApexVariantReference{
8047 Apex: proptools.StringPtr("myapex"),
8048 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8049 }
8050
Paul Duffin064b70c2020-11-02 17:32:38 +00008051 testDexpreoptWithApexes(t, `
8052 prebuilt_apex {
8053 name: "myapex" ,
8054 arch: {
8055 arm64: {
8056 src: "myapex-arm64.apex",
8057 },
8058 arm: {
8059 src: "myapex-arm.apex",
8060 },
8061 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008062 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8063 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008064
Paul Duffin89f570a2021-06-16 01:42:33 +01008065 prebuilt_bootclasspath_fragment {
8066 name: "my-bootclasspath-fragment",
8067 contents: ["libfoo"],
8068 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008069 hidden_api: {
8070 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8071 metadata: "my-bootclasspath-fragment/metadata.csv",
8072 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008073 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8074 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8075 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008076 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008077 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008078
Paul Duffin89f570a2021-06-16 01:42:33 +01008079 java_import {
8080 name: "libfoo",
8081 jars: ["libfoo.jar"],
8082 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008083 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008084 }
8085 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008086 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008087}
8088
Spandan Dasf14e2542021-11-12 00:01:37 +00008089func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008090 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008091 bp += `
8092 apex_key {
8093 name: "myapex.key",
8094 public_key: "testkey.avbpubkey",
8095 private_key: "testkey.pem",
8096 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008097 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008098 "lib1/src/A.java": nil,
8099 "lib2/src/B.java": nil,
8100 "system/sepolicy/apex/myapex-file_contexts": nil,
8101 }
8102
Paul Duffin45338f02021-03-30 23:07:52 +01008103 errorHandler := android.FixtureExpectsNoErrors
8104 if errmsg != "" {
8105 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008106 }
Colin Crossae8600b2020-10-29 17:09:13 -07008107
Paul Duffin45338f02021-03-30 23:07:52 +01008108 android.GroupFixturePreparers(
8109 android.PrepareForTestWithAndroidBuildComponents,
8110 java.PrepareForTestWithJavaBuildComponents,
8111 PrepareForTestWithApexBuildComponents,
8112 android.PrepareForTestWithNeverallowRules(rules),
8113 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008114 apexBootJars := make([]string, 0, len(bootJars))
8115 for _, apexBootJar := range bootJars {
8116 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008117 }
satayevd604b212021-07-21 14:23:52 +01008118 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008119 }),
8120 fs.AddToFixture(),
8121 ).
8122 ExtendWithErrorHandler(errorHandler).
8123 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008124}
8125
8126func TestApexPermittedPackagesRules(t *testing.T) {
8127 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008128 name string
8129 expectedError string
8130 bp string
8131 bootJars []string
8132 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008133 }{
8134
8135 {
8136 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8137 expectedError: "",
8138 bp: `
8139 java_library {
8140 name: "bcp_lib1",
8141 srcs: ["lib1/src/*.java"],
8142 permitted_packages: ["foo.bar"],
8143 apex_available: ["myapex"],
8144 sdk_version: "none",
8145 system_modules: "none",
8146 }
8147 java_library {
8148 name: "nonbcp_lib2",
8149 srcs: ["lib2/src/*.java"],
8150 apex_available: ["myapex"],
8151 permitted_packages: ["a.b"],
8152 sdk_version: "none",
8153 system_modules: "none",
8154 }
8155 apex {
8156 name: "myapex",
8157 key: "myapex.key",
8158 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008159 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008160 }`,
8161 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008162 bcpPermittedPackages: map[string][]string{
8163 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008164 "foo.bar",
8165 },
8166 },
8167 },
8168 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008169 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008170 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 +01008171 bp: `
8172 java_library {
8173 name: "bcp_lib1",
8174 srcs: ["lib1/src/*.java"],
8175 apex_available: ["myapex"],
8176 permitted_packages: ["foo.bar"],
8177 sdk_version: "none",
8178 system_modules: "none",
8179 }
8180 java_library {
8181 name: "bcp_lib2",
8182 srcs: ["lib2/src/*.java"],
8183 apex_available: ["myapex"],
8184 permitted_packages: ["foo.bar", "bar.baz"],
8185 sdk_version: "none",
8186 system_modules: "none",
8187 }
8188 apex {
8189 name: "myapex",
8190 key: "myapex.key",
8191 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008192 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008193 }
8194 `,
8195 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008196 bcpPermittedPackages: map[string][]string{
8197 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008198 "foo.bar",
8199 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008200 "bcp_lib2": []string{
8201 "foo.bar",
8202 },
8203 },
8204 },
8205 {
8206 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8207 expectedError: "",
8208 bp: `
8209 java_library {
8210 name: "bcp_lib_restricted",
8211 srcs: ["lib1/src/*.java"],
8212 apex_available: ["myapex"],
8213 permitted_packages: ["foo.bar"],
8214 sdk_version: "none",
8215 min_sdk_version: "29",
8216 system_modules: "none",
8217 }
8218 java_library {
8219 name: "bcp_lib_unrestricted",
8220 srcs: ["lib2/src/*.java"],
8221 apex_available: ["myapex"],
8222 permitted_packages: ["foo.bar", "bar.baz"],
8223 sdk_version: "none",
8224 min_sdk_version: "29",
8225 system_modules: "none",
8226 }
8227 apex {
8228 name: "myapex",
8229 key: "myapex.key",
8230 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8231 updatable: true,
8232 min_sdk_version: "29",
8233 }
8234 `,
8235 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8236 bcpPermittedPackages: map[string][]string{
8237 "bcp_lib1_non_updateable": []string{
8238 "foo.bar",
8239 },
8240 // 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 +01008241 },
8242 },
8243 }
8244 for _, tc := range testcases {
8245 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008246 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8247 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008248 })
8249 }
8250}
8251
Jiyong Park62304bb2020-04-13 16:19:48 +09008252func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008253 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008254 apex {
8255 name: "myapex",
8256 key: "myapex.key",
8257 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008258 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008259 }
8260
8261 apex_key {
8262 name: "myapex.key",
8263 public_key: "testkey.avbpubkey",
8264 private_key: "testkey.pem",
8265 }
8266
8267 cc_library {
8268 name: "mylib",
8269 srcs: ["mylib.cpp"],
8270 system_shared_libs: [],
8271 stl: "none",
8272 stubs: {
8273 versions: ["1"],
8274 },
8275 apex_available: ["myapex"],
8276 }
8277
8278 cc_library {
8279 name: "myprivlib",
8280 srcs: ["mylib.cpp"],
8281 system_shared_libs: [],
8282 stl: "none",
8283 apex_available: ["myapex"],
8284 }
8285
8286
8287 cc_test {
8288 name: "mytest",
8289 gtest: false,
8290 srcs: ["mylib.cpp"],
8291 system_shared_libs: [],
8292 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008293 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008294 test_for: ["myapex"]
8295 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008296
8297 cc_library {
8298 name: "mytestlib",
8299 srcs: ["mylib.cpp"],
8300 system_shared_libs: [],
8301 shared_libs: ["mylib", "myprivlib"],
8302 stl: "none",
8303 test_for: ["myapex"],
8304 }
8305
8306 cc_benchmark {
8307 name: "mybench",
8308 srcs: ["mylib.cpp"],
8309 system_shared_libs: [],
8310 shared_libs: ["mylib", "myprivlib"],
8311 stl: "none",
8312 test_for: ["myapex"],
8313 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008314 `)
8315
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008316 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008317 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008318 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8319 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8320 }
8321
8322 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008323 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008324 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8325 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8326 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8327}
Jiyong Park46a512f2020-12-04 18:02:13 +09008328
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008329func TestIndirectTestFor(t *testing.T) {
8330 ctx := testApex(t, `
8331 apex {
8332 name: "myapex",
8333 key: "myapex.key",
8334 native_shared_libs: ["mylib", "myprivlib"],
8335 updatable: false,
8336 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008337
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008338 apex_key {
8339 name: "myapex.key",
8340 public_key: "testkey.avbpubkey",
8341 private_key: "testkey.pem",
8342 }
8343
8344 cc_library {
8345 name: "mylib",
8346 srcs: ["mylib.cpp"],
8347 system_shared_libs: [],
8348 stl: "none",
8349 stubs: {
8350 versions: ["1"],
8351 },
8352 apex_available: ["myapex"],
8353 }
8354
8355 cc_library {
8356 name: "myprivlib",
8357 srcs: ["mylib.cpp"],
8358 system_shared_libs: [],
8359 stl: "none",
8360 shared_libs: ["mylib"],
8361 apex_available: ["myapex"],
8362 }
8363
8364 cc_library {
8365 name: "mytestlib",
8366 srcs: ["mylib.cpp"],
8367 system_shared_libs: [],
8368 shared_libs: ["myprivlib"],
8369 stl: "none",
8370 test_for: ["myapex"],
8371 }
8372 `)
8373
8374 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008375 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008376 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8377 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8378 }
8379
8380 // The platform variant of mytestlib links to the platform variant of the
8381 // internal myprivlib.
8382 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8383
8384 // The platform variant of myprivlib links to the platform variant of mylib
8385 // and bypasses its stubs.
8386 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 +09008387}
8388
Martin Stjernholmec009002021-03-27 15:18:31 +00008389func TestTestForForLibInOtherApex(t *testing.T) {
8390 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8391 _ = testApex(t, `
8392 apex {
8393 name: "com.android.art",
8394 key: "myapex.key",
8395 native_shared_libs: ["mylib"],
8396 updatable: false,
8397 }
8398
8399 apex {
8400 name: "com.android.art.debug",
8401 key: "myapex.key",
8402 native_shared_libs: ["mylib", "mytestlib"],
8403 updatable: false,
8404 }
8405
8406 apex_key {
8407 name: "myapex.key",
8408 public_key: "testkey.avbpubkey",
8409 private_key: "testkey.pem",
8410 }
8411
8412 cc_library {
8413 name: "mylib",
8414 srcs: ["mylib.cpp"],
8415 system_shared_libs: [],
8416 stl: "none",
8417 stubs: {
8418 versions: ["1"],
8419 },
8420 apex_available: ["com.android.art", "com.android.art.debug"],
8421 }
8422
8423 cc_library {
8424 name: "mytestlib",
8425 srcs: ["mylib.cpp"],
8426 system_shared_libs: [],
8427 shared_libs: ["mylib"],
8428 stl: "none",
8429 apex_available: ["com.android.art.debug"],
8430 test_for: ["com.android.art"],
8431 }
8432 `,
8433 android.MockFS{
8434 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8435 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8436 }.AddToFixture())
8437}
8438
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008439// TODO(jungjw): Move this to proptools
8440func intPtr(i int) *int {
8441 return &i
8442}
8443
8444func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008445 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008446 apex_set {
8447 name: "myapex",
8448 set: "myapex.apks",
8449 filename: "foo_v2.apex",
8450 overrides: ["foo"],
8451 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008452 `,
8453 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8454 variables.Platform_sdk_version = intPtr(30)
8455 }),
8456 android.FixtureModifyConfig(func(config android.Config) {
8457 config.Targets[android.Android] = []android.Target{
8458 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8459 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8460 }
8461 }),
8462 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008463
Paul Duffin24704672021-04-06 16:09:30 +01008464 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008465
8466 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008467 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008468 actual := extractedApex.Args["abis"]
8469 expected := "ARMEABI_V7A,ARM64_V8A"
8470 if actual != expected {
8471 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8472 }
8473 actual = extractedApex.Args["sdk-version"]
8474 expected = "30"
8475 if actual != expected {
8476 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8477 }
8478
Paul Duffin6717d882021-06-15 19:09:41 +01008479 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008480 a := m.Module().(*ApexSet)
8481 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008482 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008483 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8484 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8485 }
8486}
8487
Anton Hansson805e0a52022-11-25 14:06:46 +00008488func TestApexSet_NativeBridge(t *testing.T) {
8489 ctx := testApex(t, `
8490 apex_set {
8491 name: "myapex",
8492 set: "myapex.apks",
8493 filename: "foo_v2.apex",
8494 overrides: ["foo"],
8495 }
8496 `,
8497 android.FixtureModifyConfig(func(config android.Config) {
8498 config.Targets[android.Android] = []android.Target{
8499 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8500 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8501 }
8502 }),
8503 )
8504
8505 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8506
8507 // Check extract_apks tool parameters. No native bridge arch expected
8508 extractedApex := m.Output("extracted/myapex.apks")
8509 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8510}
8511
Jiyong Park7d95a512020-05-10 15:16:24 +09008512func TestNoStaticLinkingToStubsLib(t *testing.T) {
8513 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8514 apex {
8515 name: "myapex",
8516 key: "myapex.key",
8517 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008518 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008519 }
8520
8521 apex_key {
8522 name: "myapex.key",
8523 public_key: "testkey.avbpubkey",
8524 private_key: "testkey.pem",
8525 }
8526
8527 cc_library {
8528 name: "mylib",
8529 srcs: ["mylib.cpp"],
8530 static_libs: ["otherlib"],
8531 system_shared_libs: [],
8532 stl: "none",
8533 apex_available: [ "myapex" ],
8534 }
8535
8536 cc_library {
8537 name: "otherlib",
8538 srcs: ["mylib.cpp"],
8539 system_shared_libs: [],
8540 stl: "none",
8541 stubs: {
8542 versions: ["1", "2", "3"],
8543 },
8544 apex_available: [ "myapex" ],
8545 }
8546 `)
8547}
8548
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008549func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008550 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008551 apex {
8552 name: "myapex",
8553 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008554 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008555 custom_sign_tool: "sign_myapex",
8556 }
8557
8558 apex_key {
8559 name: "myapex.key",
8560 public_key: "testkey.avbpubkey",
8561 private_key: "testkey.pem",
8562 }
8563 `)
8564
8565 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8566 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8567 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"`)
8568}
8569
8570func TestApexKeysTxtOverrides(t *testing.T) {
8571 ctx := testApex(t, `
8572 apex {
8573 name: "myapex",
8574 key: "myapex.key",
8575 updatable: false,
8576 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008577 }
8578
8579 apex_key {
8580 name: "myapex.key",
8581 public_key: "testkey.avbpubkey",
8582 private_key: "testkey.pem",
8583 }
8584
8585 prebuilt_apex {
8586 name: "myapex",
8587 prefer: true,
8588 arch: {
8589 arm64: {
8590 src: "myapex-arm64.apex",
8591 },
8592 arm: {
8593 src: "myapex-arm.apex",
8594 },
8595 },
8596 }
8597
8598 apex_set {
8599 name: "myapex_set",
8600 set: "myapex.apks",
8601 filename: "myapex_set.apex",
8602 overrides: ["myapex"],
8603 }
8604 `)
8605
8606 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8607 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8608 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 +09008609 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 +09008610}
8611
Jooyung Han938b5932020-06-20 12:47:47 +09008612func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008613 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008614 apex {
8615 name: "myapex",
8616 key: "myapex.key",
8617 apps: ["app"],
8618 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008619 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008620 }
8621
8622 apex_key {
8623 name: "myapex.key",
8624 public_key: "testkey.avbpubkey",
8625 private_key: "testkey.pem",
8626 }
8627
8628 android_app {
8629 name: "app",
8630 srcs: ["foo/bar/MyClass.java"],
8631 package_name: "foo",
8632 sdk_version: "none",
8633 system_modules: "none",
8634 apex_available: [ "myapex" ],
8635 }
8636 `, withFiles(map[string][]byte{
8637 "sub/Android.bp": []byte(`
8638 override_apex {
8639 name: "override_myapex",
8640 base: "myapex",
8641 apps: ["override_app"],
8642 allowed_files: ":allowed",
8643 }
8644 // Overridable "path" property should be referenced indirectly
8645 filegroup {
8646 name: "allowed",
8647 srcs: ["allowed.txt"],
8648 }
8649 override_android_app {
8650 name: "override_app",
8651 base: "app",
8652 package_name: "bar",
8653 }
8654 `),
8655 }))
8656
8657 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8658 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8659 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8660 }
8661
8662 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8663 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8664 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8665 }
8666}
8667
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008668func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008669 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008670 apex {
8671 name: "myapex",
8672 key: "myapex.key",
8673 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008674 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008675 }
8676
8677 apex_key {
8678 name: "myapex.key",
8679 public_key: "testkey.avbpubkey",
8680 private_key: "testkey.pem",
8681 }
8682
8683 cc_library {
8684 name: "mylib",
8685 srcs: ["mylib.cpp"],
8686 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008687 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008688 },
8689 apex_available: ["myapex"],
8690 }
8691
8692 cc_prebuilt_library_shared {
8693 name: "mylib",
8694 prefer: false,
8695 srcs: ["prebuilt.so"],
8696 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008697 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008698 },
8699 apex_available: ["myapex"],
8700 }
8701 `)
8702}
8703
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008704func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008705 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008706 apex {
8707 name: "myapex",
8708 key: "myapex.key",
8709 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008710 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008711 }
8712 apex_key {
8713 name: "myapex.key",
8714 public_key: "testkey.avbpubkey",
8715 private_key: "testkey.pem",
8716 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008717 `,
8718 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8719 variables.CompressedApex = proptools.BoolPtr(true)
8720 }),
8721 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008722
8723 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8724 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8725
8726 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8727 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8728
8729 // Make sure output of bundle is .capex
8730 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8731 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8732
8733 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008734 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008735 var builder strings.Builder
8736 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8737 androidMk := builder.String()
8738 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8739}
8740
Martin Stjernholm2856c662020-12-02 15:03:42 +00008741func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008742 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008743 apex {
8744 name: "myapex",
8745 key: "myapex.key",
8746 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008747 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008748 }
8749
8750 apex_key {
8751 name: "myapex.key",
8752 public_key: "testkey.avbpubkey",
8753 private_key: "testkey.pem",
8754 }
8755
8756 cc_library {
8757 name: "mylib",
8758 srcs: ["mylib.cpp"],
8759 apex_available: ["myapex"],
8760 shared_libs: ["otherlib"],
8761 system_shared_libs: [],
8762 }
8763
8764 cc_library {
8765 name: "otherlib",
8766 srcs: ["mylib.cpp"],
8767 stubs: {
8768 versions: ["current"],
8769 },
8770 }
8771
8772 cc_prebuilt_library_shared {
8773 name: "otherlib",
8774 prefer: true,
8775 srcs: ["prebuilt.so"],
8776 stubs: {
8777 versions: ["current"],
8778 },
8779 }
8780 `)
8781
8782 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008783 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008784 var builder strings.Builder
8785 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8786 androidMk := builder.String()
8787
8788 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8789 // a thing there.
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008790 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 +00008791}
8792
Jiyong Parke3867542020-12-03 17:28:25 +09008793func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008794 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008795 apex {
8796 name: "myapex",
8797 key: "myapex.key",
8798 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008799 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008800 }
8801
8802 apex_key {
8803 name: "myapex.key",
8804 public_key: "testkey.avbpubkey",
8805 private_key: "testkey.pem",
8806 }
8807
8808 cc_library {
8809 name: "mylib",
8810 srcs: ["mylib.cpp"],
8811 system_shared_libs: [],
8812 stl: "none",
8813 apex_available: ["myapex"],
8814 shared_libs: ["mylib2"],
8815 target: {
8816 apex: {
8817 exclude_shared_libs: ["mylib2"],
8818 },
8819 },
8820 }
8821
8822 cc_library {
8823 name: "mylib2",
8824 srcs: ["mylib.cpp"],
8825 system_shared_libs: [],
8826 stl: "none",
8827 }
8828 `)
8829
8830 // Check if mylib is linked to mylib2 for the non-apex target
8831 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8832 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8833
8834 // Make sure that the link doesn't occur for the apex target
8835 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8836 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8837
8838 // It shouldn't appear in the copy cmd as well.
8839 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8840 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8841}
8842
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008843func TestPrebuiltStubLibDep(t *testing.T) {
8844 bpBase := `
8845 apex {
8846 name: "myapex",
8847 key: "myapex.key",
8848 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008849 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008850 }
8851 apex_key {
8852 name: "myapex.key",
8853 public_key: "testkey.avbpubkey",
8854 private_key: "testkey.pem",
8855 }
8856 cc_library {
8857 name: "mylib",
8858 srcs: ["mylib.cpp"],
8859 apex_available: ["myapex"],
8860 shared_libs: ["stublib"],
8861 system_shared_libs: [],
8862 }
8863 apex {
8864 name: "otherapex",
8865 enabled: %s,
8866 key: "myapex.key",
8867 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008868 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008869 }
8870 `
8871
8872 stublibSourceBp := `
8873 cc_library {
8874 name: "stublib",
8875 srcs: ["mylib.cpp"],
8876 apex_available: ["otherapex"],
8877 system_shared_libs: [],
8878 stl: "none",
8879 stubs: {
8880 versions: ["1"],
8881 },
8882 }
8883 `
8884
8885 stublibPrebuiltBp := `
8886 cc_prebuilt_library_shared {
8887 name: "stublib",
8888 srcs: ["prebuilt.so"],
8889 apex_available: ["otherapex"],
8890 stubs: {
8891 versions: ["1"],
8892 },
8893 %s
8894 }
8895 `
8896
8897 tests := []struct {
8898 name string
8899 stublibBp string
8900 usePrebuilt bool
8901 modNames []string // Modules to collect AndroidMkEntries for
8902 otherApexEnabled []string
8903 }{
8904 {
8905 name: "only_source",
8906 stublibBp: stublibSourceBp,
8907 usePrebuilt: false,
8908 modNames: []string{"stublib"},
8909 otherApexEnabled: []string{"true", "false"},
8910 },
8911 {
8912 name: "source_preferred",
8913 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8914 usePrebuilt: false,
8915 modNames: []string{"stublib", "prebuilt_stublib"},
8916 otherApexEnabled: []string{"true", "false"},
8917 },
8918 {
8919 name: "prebuilt_preferred",
8920 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8921 usePrebuilt: true,
8922 modNames: []string{"stublib", "prebuilt_stublib"},
8923 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8924 },
8925 {
8926 name: "only_prebuilt",
8927 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8928 usePrebuilt: true,
8929 modNames: []string{"stublib"},
8930 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8931 },
8932 }
8933
8934 for _, test := range tests {
8935 t.Run(test.name, func(t *testing.T) {
8936 for _, otherApexEnabled := range test.otherApexEnabled {
8937 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008938 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008939
8940 type modAndMkEntries struct {
8941 mod *cc.Module
8942 mkEntries android.AndroidMkEntries
8943 }
8944 entries := []*modAndMkEntries{}
8945
8946 // Gather shared lib modules that are installable
8947 for _, modName := range test.modNames {
8948 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8949 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8950 continue
8951 }
8952 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008953 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008954 continue
8955 }
Colin Crossaa255532020-07-03 13:18:24 -07008956 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008957 if ent.Disabled {
8958 continue
8959 }
8960 entries = append(entries, &modAndMkEntries{
8961 mod: mod,
8962 mkEntries: ent,
8963 })
8964 }
8965 }
8966 }
8967
8968 var entry *modAndMkEntries = nil
8969 for _, ent := range entries {
8970 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8971 if entry != nil {
8972 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8973 } else {
8974 entry = ent
8975 }
8976 }
8977 }
8978
8979 if entry == nil {
8980 t.Errorf("AndroidMk entry for \"stublib\" missing")
8981 } else {
8982 isPrebuilt := entry.mod.Prebuilt() != nil
8983 if isPrebuilt != test.usePrebuilt {
8984 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8985 }
8986 if !entry.mod.IsStubs() {
8987 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8988 }
8989 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8990 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8991 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008992 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008993 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008994 if !android.InList(expected, cflags) {
8995 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8996 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008997 }
8998 })
8999 }
9000 })
9001 }
9002}
9003
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009004func TestHostApexInHostOnlyBuild(t *testing.T) {
9005 testApex(t, `
9006 apex {
9007 name: "myapex",
9008 host_supported: true,
9009 key: "myapex.key",
9010 updatable: false,
9011 payload_type: "zip",
9012 }
9013 apex_key {
9014 name: "myapex.key",
9015 public_key: "testkey.avbpubkey",
9016 private_key: "testkey.pem",
9017 }
9018 `,
9019 android.FixtureModifyConfig(func(config android.Config) {
9020 // We may not have device targets in all builds, e.g. in
9021 // prebuilts/build-tools/build-prebuilts.sh
9022 config.Targets[android.Android] = []android.Target{}
9023 }))
9024}
9025
Colin Crossc33e5212021-05-25 18:16:02 -07009026func TestApexJavaCoverage(t *testing.T) {
9027 bp := `
9028 apex {
9029 name: "myapex",
9030 key: "myapex.key",
9031 java_libs: ["mylib"],
9032 bootclasspath_fragments: ["mybootclasspathfragment"],
9033 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9034 updatable: false,
9035 }
9036
9037 apex_key {
9038 name: "myapex.key",
9039 public_key: "testkey.avbpubkey",
9040 private_key: "testkey.pem",
9041 }
9042
9043 java_library {
9044 name: "mylib",
9045 srcs: ["mylib.java"],
9046 apex_available: ["myapex"],
9047 compile_dex: true,
9048 }
9049
9050 bootclasspath_fragment {
9051 name: "mybootclasspathfragment",
9052 contents: ["mybootclasspathlib"],
9053 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009054 hidden_api: {
9055 split_packages: ["*"],
9056 },
Colin Crossc33e5212021-05-25 18:16:02 -07009057 }
9058
9059 java_library {
9060 name: "mybootclasspathlib",
9061 srcs: ["mybootclasspathlib.java"],
9062 apex_available: ["myapex"],
9063 compile_dex: true,
9064 }
9065
9066 systemserverclasspath_fragment {
9067 name: "mysystemserverclasspathfragment",
9068 contents: ["mysystemserverclasspathlib"],
9069 apex_available: ["myapex"],
9070 }
9071
9072 java_library {
9073 name: "mysystemserverclasspathlib",
9074 srcs: ["mysystemserverclasspathlib.java"],
9075 apex_available: ["myapex"],
9076 compile_dex: true,
9077 }
9078 `
9079
9080 result := android.GroupFixturePreparers(
9081 PrepareForTestWithApexBuildComponents,
9082 prepareForTestWithMyapex,
9083 java.PrepareForTestWithJavaDefaultModules,
9084 android.PrepareForTestWithAndroidBuildComponents,
9085 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009086 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9087 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009088 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009089 ).RunTest(t)
9090
9091 // Make sure jacoco ran on both mylib and mybootclasspathlib
9092 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9093 t.Errorf("Failed to find jacoco rule for mylib")
9094 }
9095 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9096 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9097 }
9098 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9099 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9100 }
9101}
9102
Jiyong Park192600a2021-08-03 07:52:17 +00009103func TestProhibitStaticExecutable(t *testing.T) {
9104 testApexError(t, `executable mybin is static`, `
9105 apex {
9106 name: "myapex",
9107 key: "myapex.key",
9108 binaries: ["mybin"],
9109 min_sdk_version: "29",
9110 }
9111
9112 apex_key {
9113 name: "myapex.key",
9114 public_key: "testkey.avbpubkey",
9115 private_key: "testkey.pem",
9116 }
9117
9118 cc_binary {
9119 name: "mybin",
9120 srcs: ["mylib.cpp"],
9121 relative_install_path: "foo/bar",
9122 static_executable: true,
9123 system_shared_libs: [],
9124 stl: "none",
9125 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009126 min_sdk_version: "29",
9127 }
9128 `)
9129
9130 testApexError(t, `executable mybin.rust is static`, `
9131 apex {
9132 name: "myapex",
9133 key: "myapex.key",
9134 binaries: ["mybin.rust"],
9135 min_sdk_version: "29",
9136 }
9137
9138 apex_key {
9139 name: "myapex.key",
9140 public_key: "testkey.avbpubkey",
9141 private_key: "testkey.pem",
9142 }
9143
9144 rust_binary {
9145 name: "mybin.rust",
9146 srcs: ["foo.rs"],
9147 static_executable: true,
9148 apex_available: ["myapex"],
9149 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009150 }
9151 `)
9152}
9153
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009154func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9155 ctx := testApex(t, `
9156 apex {
9157 name: "myapex",
9158 key: "myapex.key",
9159 updatable: false,
9160 java_libs: ["foo"],
9161 }
9162
9163 apex_key {
9164 name: "myapex.key",
9165 public_key: "testkey.avbpubkey",
9166 private_key: "testkey.pem",
9167 }
9168
9169 java_library {
9170 name: "foo",
9171 srcs: ["foo.java"],
9172 apex_available: ["myapex"],
9173 installable: true,
9174 }
9175 `,
9176 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9177 )
9178
9179 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9180 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9181 var builder strings.Builder
9182 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9183 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009184 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 +00009185}
9186
9187func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9188 ctx := testApex(t, `
9189 prebuilt_apex {
9190 name: "myapex",
9191 arch: {
9192 arm64: {
9193 src: "myapex-arm64.apex",
9194 },
9195 arm: {
9196 src: "myapex-arm.apex",
9197 },
9198 },
9199 exported_java_libs: ["foo"],
9200 }
9201
9202 java_import {
9203 name: "foo",
9204 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009205 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009206 }
9207 `,
9208 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9209 )
9210
9211 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9212 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9213 mainModuleEntries := entriesList[0]
9214 android.AssertArrayString(t,
9215 "LOCAL_REQUIRED_MODULES",
9216 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9217 []string{
9218 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9219 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9220 })
9221}
9222
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009223func TestAndroidMk_RequiredModules(t *testing.T) {
9224 ctx := testApex(t, `
9225 apex {
9226 name: "myapex",
9227 key: "myapex.key",
9228 updatable: false,
9229 java_libs: ["foo"],
9230 required: ["otherapex"],
9231 }
9232
9233 apex {
9234 name: "otherapex",
9235 key: "myapex.key",
9236 updatable: false,
9237 java_libs: ["foo"],
9238 required: ["otherapex"],
9239 }
9240
9241 apex_key {
9242 name: "myapex.key",
9243 public_key: "testkey.avbpubkey",
9244 private_key: "testkey.pem",
9245 }
9246
9247 java_library {
9248 name: "foo",
9249 srcs: ["foo.java"],
9250 apex_available: ["myapex", "otherapex"],
9251 installable: true,
9252 }
9253 `)
9254
9255 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9256 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9257 var builder strings.Builder
9258 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9259 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009260 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009261}
9262
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009263func TestAndroidMk_RequiredDeps(t *testing.T) {
9264 ctx := testApex(t, `
9265 apex {
9266 name: "myapex",
9267 key: "myapex.key",
9268 updatable: false,
9269 }
9270
9271 apex_key {
9272 name: "myapex.key",
9273 public_key: "testkey.avbpubkey",
9274 private_key: "testkey.pem",
9275 }
9276 `)
9277
9278 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009279 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009280 data := android.AndroidMkDataForTest(t, ctx, bundle)
9281 var builder strings.Builder
9282 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9283 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009284 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009285
9286 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009287 flattenedBundle.makeModulesToInstall = append(flattenedBundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009288 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9289 var flattenedBuilder strings.Builder
9290 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9291 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009292 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009293}
9294
Jooyung Hana6d36672022-02-24 13:58:07 +09009295func TestApexOutputFileProducer(t *testing.T) {
9296 for _, tc := range []struct {
9297 name string
9298 ref string
9299 expected_data []string
9300 }{
9301 {
9302 name: "test_using_output",
9303 ref: ":myapex",
9304 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9305 },
9306 {
9307 name: "test_using_apex",
9308 ref: ":myapex{.apex}",
9309 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9310 },
9311 } {
9312 t.Run(tc.name, func(t *testing.T) {
9313 ctx := testApex(t, `
9314 apex {
9315 name: "myapex",
9316 key: "myapex.key",
9317 compressible: true,
9318 updatable: false,
9319 }
9320
9321 apex_key {
9322 name: "myapex.key",
9323 public_key: "testkey.avbpubkey",
9324 private_key: "testkey.pem",
9325 }
9326
9327 java_test {
9328 name: "`+tc.name+`",
9329 srcs: ["a.java"],
9330 data: ["`+tc.ref+`"],
9331 }
9332 `,
9333 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9334 variables.CompressedApex = proptools.BoolPtr(true)
9335 }))
9336 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9337 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9338 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9339 })
9340 }
9341}
9342
satayev758968a2021-12-06 11:42:40 +00009343func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9344 preparer := android.GroupFixturePreparers(
9345 PrepareForTestWithApexBuildComponents,
9346 prepareForTestWithMyapex,
9347 java.PrepareForTestWithJavaSdkLibraryFiles,
9348 java.PrepareForTestWithJavaDefaultModules,
9349 android.PrepareForTestWithAndroidBuildComponents,
9350 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9351 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9352 )
9353
9354 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9355 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9356 preparer.RunTestWithBp(t, `
9357 apex {
9358 name: "myapex",
9359 key: "myapex.key",
9360 bootclasspath_fragments: ["mybootclasspathfragment"],
9361 min_sdk_version: "30",
9362 updatable: false,
9363 }
9364
9365 apex_key {
9366 name: "myapex.key",
9367 public_key: "testkey.avbpubkey",
9368 private_key: "testkey.pem",
9369 }
9370
9371 bootclasspath_fragment {
9372 name: "mybootclasspathfragment",
9373 contents: ["mybootclasspathlib"],
9374 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009375 hidden_api: {
9376 split_packages: ["*"],
9377 },
satayev758968a2021-12-06 11:42:40 +00009378 }
9379
9380 java_sdk_library {
9381 name: "mybootclasspathlib",
9382 srcs: ["mybootclasspathlib.java"],
9383 apex_available: ["myapex"],
9384 compile_dex: true,
9385 unsafe_ignore_missing_latest_api: true,
9386 min_sdk_version: "31",
9387 static_libs: ["util"],
9388 }
9389
9390 java_library {
9391 name: "util",
9392 srcs: ["a.java"],
9393 apex_available: ["myapex"],
9394 min_sdk_version: "31",
9395 static_libs: ["another_util"],
9396 }
9397
9398 java_library {
9399 name: "another_util",
9400 srcs: ["a.java"],
9401 min_sdk_version: "31",
9402 apex_available: ["myapex"],
9403 }
9404 `)
9405 })
9406
9407 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9408 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9409 preparer.RunTestWithBp(t, `
9410 apex {
9411 name: "myapex",
9412 key: "myapex.key",
9413 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9414 min_sdk_version: "30",
9415 updatable: false,
9416 }
9417
9418 apex_key {
9419 name: "myapex.key",
9420 public_key: "testkey.avbpubkey",
9421 private_key: "testkey.pem",
9422 }
9423
9424 systemserverclasspath_fragment {
9425 name: "mysystemserverclasspathfragment",
9426 contents: ["mysystemserverclasspathlib"],
9427 apex_available: ["myapex"],
9428 }
9429
9430 java_sdk_library {
9431 name: "mysystemserverclasspathlib",
9432 srcs: ["mysystemserverclasspathlib.java"],
9433 apex_available: ["myapex"],
9434 compile_dex: true,
9435 min_sdk_version: "32",
9436 unsafe_ignore_missing_latest_api: true,
9437 static_libs: ["util"],
9438 }
9439
9440 java_library {
9441 name: "util",
9442 srcs: ["a.java"],
9443 apex_available: ["myapex"],
9444 min_sdk_version: "31",
9445 static_libs: ["another_util"],
9446 }
9447
9448 java_library {
9449 name: "another_util",
9450 srcs: ["a.java"],
9451 min_sdk_version: "31",
9452 apex_available: ["myapex"],
9453 }
9454 `)
9455 })
9456
9457 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9458 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9459 RunTestWithBp(t, `
9460 apex {
9461 name: "myapex",
9462 key: "myapex.key",
9463 bootclasspath_fragments: ["mybootclasspathfragment"],
9464 min_sdk_version: "30",
9465 updatable: false,
9466 }
9467
9468 apex_key {
9469 name: "myapex.key",
9470 public_key: "testkey.avbpubkey",
9471 private_key: "testkey.pem",
9472 }
9473
9474 bootclasspath_fragment {
9475 name: "mybootclasspathfragment",
9476 contents: ["mybootclasspathlib"],
9477 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009478 hidden_api: {
9479 split_packages: ["*"],
9480 },
satayev758968a2021-12-06 11:42:40 +00009481 }
9482
9483 java_sdk_library {
9484 name: "mybootclasspathlib",
9485 srcs: ["mybootclasspathlib.java"],
9486 apex_available: ["myapex"],
9487 compile_dex: true,
9488 unsafe_ignore_missing_latest_api: true,
9489 }
9490 `)
9491 })
9492
9493 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9494 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9495 RunTestWithBp(t, `
9496 apex {
9497 name: "myapex",
9498 key: "myapex.key",
9499 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9500 min_sdk_version: "30",
9501 updatable: false,
9502 }
9503
9504 apex_key {
9505 name: "myapex.key",
9506 public_key: "testkey.avbpubkey",
9507 private_key: "testkey.pem",
9508 }
9509
9510 systemserverclasspath_fragment {
9511 name: "mysystemserverclasspathfragment",
9512 contents: ["mysystemserverclasspathlib"],
9513 apex_available: ["myapex"],
9514 }
9515
9516 java_sdk_library {
9517 name: "mysystemserverclasspathlib",
9518 srcs: ["mysystemserverclasspathlib.java"],
9519 apex_available: ["myapex"],
9520 compile_dex: true,
9521 unsafe_ignore_missing_latest_api: true,
9522 }
9523 `)
9524 })
9525}
9526
Jiakai Zhang6decef92022-01-12 17:56:19 +00009527// Verifies that the APEX depends on all the Make modules in the list.
9528func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9529 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9530 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009531 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009532 }
9533}
9534
9535// Verifies that the APEX does not depend on any of the Make modules in the list.
9536func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9537 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9538 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009539 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009540 }
9541}
9542
Cole Faust1021ccd2023-02-26 21:15:25 -08009543// TODO(b/193460475): Re-enable this test
9544//func TestApexStrictUpdtabilityLint(t *testing.T) {
9545// bpTemplate := `
9546// apex {
9547// name: "myapex",
9548// key: "myapex.key",
9549// java_libs: ["myjavalib"],
9550// updatable: %v,
9551// min_sdk_version: "29",
9552// }
9553// apex_key {
9554// name: "myapex.key",
9555// }
9556// java_library {
9557// name: "myjavalib",
9558// srcs: ["MyClass.java"],
9559// apex_available: [ "myapex" ],
9560// lint: {
9561// strict_updatability_linting: %v,
9562// },
9563// sdk_version: "current",
9564// min_sdk_version: "29",
9565// }
9566// `
9567// fs := android.MockFS{
9568// "lint-baseline.xml": nil,
9569// }
9570//
9571// testCases := []struct {
9572// testCaseName string
9573// apexUpdatable bool
9574// javaStrictUpdtabilityLint bool
9575// lintFileExists bool
9576// disallowedFlagExpected bool
9577// }{
9578// {
9579// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9580// apexUpdatable: true,
9581// javaStrictUpdtabilityLint: true,
9582// lintFileExists: false,
9583// disallowedFlagExpected: false,
9584// },
9585// {
9586// testCaseName: "non-updatable apex respects strict_updatability of javalib",
9587// apexUpdatable: false,
9588// javaStrictUpdtabilityLint: false,
9589// lintFileExists: true,
9590// disallowedFlagExpected: false,
9591// },
9592// {
9593// testCaseName: "non-updatable apex respects strict updatability of javalib",
9594// apexUpdatable: false,
9595// javaStrictUpdtabilityLint: true,
9596// lintFileExists: true,
9597// disallowedFlagExpected: true,
9598// },
9599// {
9600// testCaseName: "updatable apex sets strict updatability of javalib to true",
9601// apexUpdatable: true,
9602// javaStrictUpdtabilityLint: false, // will be set to true by mutator
9603// lintFileExists: true,
9604// disallowedFlagExpected: true,
9605// },
9606// }
9607//
9608// for _, testCase := range testCases {
9609// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9610// fixtures := []android.FixturePreparer{}
9611// if testCase.lintFileExists {
9612// fixtures = append(fixtures, fs.AddToFixture())
9613// }
9614//
9615// result := testApex(t, bp, fixtures...)
9616// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9617// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9618// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9619//
9620// if disallowedFlagActual != testCase.disallowedFlagExpected {
9621// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9622// }
9623// }
9624//}
9625//
9626//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9627// bp := `
9628// apex {
9629// name: "myapex",
9630// key: "myapex.key",
9631// java_libs: ["myjavalib"],
9632// updatable: true,
9633// min_sdk_version: "29",
9634// }
9635// apex_key {
9636// name: "myapex.key",
9637// }
9638// java_library {
9639// name: "myjavalib",
9640// srcs: ["MyClass.java"],
9641// apex_available: [ "myapex" ],
9642// sdk_version: "current",
9643// min_sdk_version: "29",
9644// }
9645// `
9646//
9647// testCases := []struct {
9648// testCaseName string
9649// moduleDirectory string
9650// disallowedFlagExpected bool
9651// }{
9652// {
9653// testCaseName: "lintable module defined outside libcore",
9654// moduleDirectory: "",
9655// disallowedFlagExpected: true,
9656// },
9657// {
9658// testCaseName: "lintable module defined in libcore root directory",
9659// moduleDirectory: "libcore/",
9660// disallowedFlagExpected: false,
9661// },
9662// {
9663// testCaseName: "lintable module defined in libcore child directory",
9664// moduleDirectory: "libcore/childdir/",
9665// disallowedFlagExpected: true,
9666// },
9667// }
9668//
9669// for _, testCase := range testCases {
9670// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9671// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9672// result := testApex(t, "", lintFileCreator, bpFileCreator)
9673// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9674// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9675// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9676// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9677//
9678// if disallowedFlagActual != testCase.disallowedFlagExpected {
9679// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9680// }
9681// }
9682//}
9683//
9684//// checks transtive deps of an apex coming from bootclasspath_fragment
9685//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9686// bp := `
9687// apex {
9688// name: "myapex",
9689// key: "myapex.key",
9690// bootclasspath_fragments: ["mybootclasspathfragment"],
9691// updatable: true,
9692// min_sdk_version: "29",
9693// }
9694// apex_key {
9695// name: "myapex.key",
9696// }
9697// bootclasspath_fragment {
9698// name: "mybootclasspathfragment",
9699// contents: ["myjavalib"],
9700// apex_available: ["myapex"],
9701// hidden_api: {
9702// split_packages: ["*"],
9703// },
9704// }
9705// java_library {
9706// name: "myjavalib",
9707// srcs: ["MyClass.java"],
9708// apex_available: [ "myapex" ],
9709// sdk_version: "current",
9710// min_sdk_version: "29",
9711// compile_dex: true,
9712// }
9713// `
9714// fs := android.MockFS{
9715// "lint-baseline.xml": nil,
9716// }
9717//
9718// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9719// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9720// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9721// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9722// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9723// }
9724//}
Spandan Das66773252022-01-15 00:23:18 +00009725
Spandan Das42e89502022-05-06 22:12:55 +00009726// updatable apexes should propagate updatable=true to its apps
9727func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9728 bp := `
9729 apex {
9730 name: "myapex",
9731 key: "myapex.key",
9732 updatable: %v,
9733 apps: [
9734 "myapp",
9735 ],
9736 min_sdk_version: "30",
9737 }
9738 apex_key {
9739 name: "myapex.key",
9740 }
9741 android_app {
9742 name: "myapp",
9743 updatable: %v,
9744 apex_available: [
9745 "myapex",
9746 ],
9747 sdk_version: "current",
9748 min_sdk_version: "30",
9749 }
9750 `
9751 testCases := []struct {
9752 name string
9753 apex_is_updatable_bp bool
9754 app_is_updatable_bp bool
9755 app_is_updatable_expected bool
9756 }{
9757 {
9758 name: "Non-updatable apex respects updatable property of non-updatable app",
9759 apex_is_updatable_bp: false,
9760 app_is_updatable_bp: false,
9761 app_is_updatable_expected: false,
9762 },
9763 {
9764 name: "Non-updatable apex respects updatable property of updatable app",
9765 apex_is_updatable_bp: false,
9766 app_is_updatable_bp: true,
9767 app_is_updatable_expected: true,
9768 },
9769 {
9770 name: "Updatable apex respects updatable property of updatable app",
9771 apex_is_updatable_bp: true,
9772 app_is_updatable_bp: true,
9773 app_is_updatable_expected: true,
9774 },
9775 {
9776 name: "Updatable apex sets updatable=true on non-updatable app",
9777 apex_is_updatable_bp: true,
9778 app_is_updatable_bp: false,
9779 app_is_updatable_expected: true,
9780 },
9781 }
9782 for _, testCase := range testCases {
9783 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9784 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9785 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9786 }
9787}
9788
Kiyoung Kim487689e2022-07-26 09:48:22 +09009789func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9790 bp := `
9791 apex {
9792 name: "myapex",
9793 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009794 native_shared_libs: ["libbaz"],
9795 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +09009796 min_sdk_version: "29",
9797 }
9798 apex_key {
9799 name: "myapex.key",
9800 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009801 cc_binary {
9802 name: "binfoo",
9803 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +09009804 apex_available: ["myapex"],
9805 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009806 recovery_available: false,
9807 }
9808 cc_library {
9809 name: "libbar",
9810 srcs: ["libbar.cc"],
9811 stubs: {
9812 symbol_file: "libbar.map.txt",
9813 versions: [
9814 "29",
9815 ],
9816 },
9817 }
9818 cc_library {
9819 name: "libbaz",
9820 srcs: ["libbaz.cc"],
9821 apex_available: ["myapex"],
9822 min_sdk_version: "29",
9823 stubs: {
9824 symbol_file: "libbaz.map.txt",
9825 versions: [
9826 "29",
9827 ],
9828 },
Kiyoung Kim487689e2022-07-26 09:48:22 +09009829 }
9830 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009831 name: "libbar",
9832 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +09009833 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009834 variants: ["apex.29"],
9835 }
9836 cc_api_variant {
9837 name: "libbar",
9838 variant: "apex",
9839 version: "29",
9840 src: "libbar_apex_29.so",
9841 }
9842 cc_api_library {
9843 name: "libbaz",
9844 src: "libbaz_stub.so",
9845 min_sdk_version: "29",
9846 variants: ["apex.29"],
9847 }
9848 cc_api_variant {
9849 name: "libbaz",
9850 variant: "apex",
9851 version: "29",
9852 src: "libbaz_apex_29.so",
9853 }
9854 cc_api_library {
9855 name: "libqux",
9856 src: "libqux_stub.so",
9857 min_sdk_version: "29",
9858 variants: ["apex.29"],
9859 }
9860 cc_api_variant {
9861 name: "libqux",
9862 variant: "apex",
9863 version: "29",
9864 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +09009865 }
9866 api_imports {
9867 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009868 apex_shared_libs: [
9869 "libbar",
9870 "libbaz",
9871 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +09009872 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +09009873 }
9874 `
9875 result := testApex(t, bp)
9876
9877 hasDep := func(m android.Module, wantDep android.Module) bool {
9878 t.Helper()
9879 var found bool
9880 result.VisitDirectDeps(m, func(dep blueprint.Module) {
9881 if dep == wantDep {
9882 found = true
9883 }
9884 })
9885 return found
9886 }
9887
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009888 // Library defines stubs and cc_api_library should be used with cc_api_library
9889 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
9890 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
9891 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +09009892
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009893 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
9894 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +09009895
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009896 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
9897 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
9898 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
9899 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
9900
9901 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
9902 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
9903 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
9904 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
9905 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
9906
9907 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
9908 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
9909 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
9910
9911 // cc_api_library defined without original library should be linked with cc_api_library
9912 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
9913 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
9914 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
9915}
9916
9917func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9918 bp := `
9919 apex {
9920 name: "myapex",
9921 key: "myapex.key",
9922 native_shared_libs: ["libbar"],
9923 min_sdk_version: "29",
9924 }
9925 apex_key {
9926 name: "myapex.key",
9927 }
9928 cc_binary {
9929 name: "binfoo",
9930 shared_libs: ["libbar"],
9931 recovery_available: false,
9932 }
9933 cc_library {
9934 name: "libbar",
9935 srcs: ["libbar.cc"],
9936 apex_available: ["myapex"],
9937 min_sdk_version: "29",
9938 stubs: {
9939 symbol_file: "libbar.map.txt",
9940 versions: [
9941 "29",
9942 ],
9943 },
9944 }
9945 cc_api_library {
9946 name: "libbar",
9947 src: "libbar_stub.so",
9948 variants: ["apex.29"],
9949 }
9950 cc_api_variant {
9951 name: "libbar",
9952 variant: "apex",
9953 version: "29",
9954 src: "libbar_apex_29.so",
9955 }
9956 api_imports {
9957 name: "api_imports",
9958 apex_shared_libs: [
9959 "libbar",
9960 ],
9961 }
9962 `
9963
9964 result := testApex(t, bp)
9965
9966 hasDep := func(m android.Module, wantDep android.Module) bool {
9967 t.Helper()
9968 var found bool
9969 result.VisitDirectDeps(m, func(dep blueprint.Module) {
9970 if dep == wantDep {
9971 found = true
9972 }
9973 })
9974 return found
9975 }
9976
9977 // Library defines stubs and cc_api_library should be used with cc_api_library
9978 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
9979 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
9980 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
9981
9982 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
9983 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
9984
9985 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
9986 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
9987 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
9988 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +09009989}
Dennis Shend4f5d932023-01-31 20:27:21 +00009990
9991func TestTrimmedApex(t *testing.T) {
9992 bp := `
9993 apex {
9994 name: "myapex",
9995 key: "myapex.key",
9996 native_shared_libs: ["libfoo","libbaz"],
9997 min_sdk_version: "29",
9998 trim_against: "mydcla",
9999 }
10000 apex {
10001 name: "mydcla",
10002 key: "myapex.key",
10003 native_shared_libs: ["libfoo","libbar"],
10004 min_sdk_version: "29",
10005 file_contexts: ":myapex-file_contexts",
10006 dynamic_common_lib_apex: true,
10007 }
10008 apex_key {
10009 name: "myapex.key",
10010 }
10011 cc_library {
10012 name: "libfoo",
10013 shared_libs: ["libc"],
10014 apex_available: ["myapex","mydcla"],
10015 min_sdk_version: "29",
10016 }
10017 cc_library {
10018 name: "libbar",
10019 shared_libs: ["libc"],
10020 apex_available: ["myapex","mydcla"],
10021 min_sdk_version: "29",
10022 }
10023 cc_library {
10024 name: "libbaz",
10025 shared_libs: ["libc"],
10026 apex_available: ["myapex","mydcla"],
10027 min_sdk_version: "29",
10028 }
10029 cc_api_library {
10030 name: "libc",
10031 src: "libc.so",
10032 min_sdk_version: "29",
10033 recovery_available: true,
10034 }
10035 api_imports {
10036 name: "api_imports",
10037 shared_libs: [
10038 "libc",
10039 ],
10040 header_libs: [],
10041 }
10042 `
10043 ctx := testApex(t, bp)
10044 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10045 apexRule := module.MaybeRule("apexRule")
10046 if apexRule.Rule == nil {
10047 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10048 }
10049
10050 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
10051 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
10052 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10053 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10054 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10055 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10056}