blob: b818f70362512a04c3242696a2a70d590808265e [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()
Prerana Patilb1896c82022-11-09 18:14:34 +0000529 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900530 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
531
Jiyong Park42cca6c2019-04-01 11:15:50 +0900532 optFlags := apexRule.Args["opt_flags"]
533 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700534 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100535 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900536
Jiyong Park25fc6a92018-11-18 18:02:45 +0900537 copyCmds := apexRule.Args["copy_commands"]
538
539 // Ensure that main rule creates an output
540 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
541
542 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700543 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
544 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900546 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900547 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900548
549 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700550 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
551 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900552 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
553 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900554 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900556
557 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800558 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
559 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900560 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900561 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900562 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900563 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
564 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900565 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900566 // .. but not for java libs
567 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900568 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800569
Colin Cross7113d202019-11-20 16:39:12 -0800570 // Ensure that the platform variant ends with _shared or _common
571 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
572 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900573 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
574 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900575 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
576
577 // Ensure that dynamic dependency to java libs are not included
578 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800579
580 // Ensure that all symlinks are present.
581 found_foo_link_64 := false
582 found_foo := false
583 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900584 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800585 if strings.HasSuffix(cmd, "bin/foo") {
586 found_foo = true
587 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
588 found_foo_link_64 = true
589 }
590 }
591 }
592 good := found_foo && found_foo_link_64
593 if !good {
594 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
595 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900596
Artur Satayeva8bd1132020-04-27 18:07:06 +0100597 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100598 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
600 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
601 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100602
603 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100604 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
606 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
607 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800608}
609
Jooyung Hanf21c7972019-12-16 22:32:06 +0900610func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800611 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900612 apex_defaults {
613 name: "myapex-defaults",
614 key: "myapex.key",
615 prebuilts: ["myetc"],
616 native_shared_libs: ["mylib"],
617 java_libs: ["myjar"],
618 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900619 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800620 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000621 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900622 }
623
624 prebuilt_etc {
625 name: "myetc",
626 src: "myprebuilt",
627 }
628
629 apex {
630 name: "myapex",
631 defaults: ["myapex-defaults"],
632 }
633
634 apex_key {
635 name: "myapex.key",
636 public_key: "testkey.avbpubkey",
637 private_key: "testkey.pem",
638 }
639
640 cc_library {
641 name: "mylib",
642 system_shared_libs: [],
643 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000644 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900645 }
646
647 java_library {
648 name: "myjar",
649 srcs: ["foo/bar/MyClass.java"],
650 sdk_version: "none",
651 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000652 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900653 }
654
655 android_app {
656 name: "AppFoo",
657 srcs: ["foo/bar/MyClass.java"],
658 sdk_version: "none",
659 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000660 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900661 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900662
663 runtime_resource_overlay {
664 name: "rro",
665 theme: "blue",
666 }
667
markchien2f59ec92020-09-02 16:23:38 +0800668 bpf {
669 name: "bpf",
670 srcs: ["bpf.c", "bpf2.c"],
671 }
672
Ken Chenfad7f9d2021-11-10 22:02:57 +0800673 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800674 name: "netdTest",
675 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800676 sub_dir: "netd",
677 }
678
Jooyung Hanf21c7972019-12-16 22:32:06 +0900679 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000680 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900681 "etc/myetc",
682 "javalib/myjar.jar",
683 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000684 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900685 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800686 "etc/bpf/bpf.o",
687 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800688 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900689 })
690}
691
Jooyung Han01a3ee22019-11-02 02:52:25 +0900692func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800693 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900694 apex {
695 name: "myapex",
696 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000697 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900698 }
699
700 apex_key {
701 name: "myapex.key",
702 public_key: "testkey.avbpubkey",
703 private_key: "testkey.pem",
704 }
705 `)
706
707 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900708 args := module.Rule("apexRule").Args
709 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
710 t.Error("manifest should be apex_manifest.pb, but " + manifest)
711 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900712}
713
Liz Kammer4854a7d2021-05-27 14:28:27 -0400714func TestApexManifestMinSdkVersion(t *testing.T) {
715 ctx := testApex(t, `
716 apex_defaults {
717 name: "my_defaults",
718 key: "myapex.key",
719 product_specific: true,
720 file_contexts: ":my-file-contexts",
721 updatable: false,
722 }
723 apex {
724 name: "myapex_30",
725 min_sdk_version: "30",
726 defaults: ["my_defaults"],
727 }
728
729 apex {
730 name: "myapex_current",
731 min_sdk_version: "current",
732 defaults: ["my_defaults"],
733 }
734
735 apex {
736 name: "myapex_none",
737 defaults: ["my_defaults"],
738 }
739
740 apex_key {
741 name: "myapex.key",
742 public_key: "testkey.avbpubkey",
743 private_key: "testkey.pem",
744 }
745
746 filegroup {
747 name: "my-file-contexts",
748 srcs: ["product_specific_file_contexts"],
749 }
750 `, withFiles(map[string][]byte{
751 "product_specific_file_contexts": nil,
752 }), android.FixtureModifyProductVariables(
753 func(variables android.FixtureProductVariables) {
754 variables.Unbundled_build = proptools.BoolPtr(true)
755 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
756 }), android.FixtureMergeEnv(map[string]string{
757 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
758 }))
759
760 testCases := []struct {
761 module string
762 minSdkVersion string
763 }{
764 {
765 module: "myapex_30",
766 minSdkVersion: "30",
767 },
768 {
769 module: "myapex_current",
770 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
771 },
772 {
773 module: "myapex_none",
774 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
775 },
776 }
777 for _, tc := range testCases {
778 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
779 args := module.Rule("apexRule").Args
780 optFlags := args["opt_flags"]
781 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
782 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
783 }
784 }
785}
786
Alex Light5098a612018-11-29 17:12:15 -0800787func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800788 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800789 apex {
790 name: "myapex",
791 key: "myapex.key",
792 payload_type: "zip",
793 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000794 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800795 }
796
797 apex_key {
798 name: "myapex.key",
799 public_key: "testkey.avbpubkey",
800 private_key: "testkey.pem",
801 }
802
803 cc_library {
804 name: "mylib",
805 srcs: ["mylib.cpp"],
806 shared_libs: ["mylib2"],
807 system_shared_libs: [],
808 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000809 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800810 }
811
812 cc_library {
813 name: "mylib2",
814 srcs: ["mylib.cpp"],
815 system_shared_libs: [],
816 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000817 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800818 }
819 `)
820
Sundong Ahnabb64432019-10-22 13:58:29 +0900821 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800822 copyCmds := zipApexRule.Args["copy_commands"]
823
824 // Ensure that main rule creates an output
825 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
826
827 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700828 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800829
830 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700831 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800832
833 // Ensure that both direct and indirect deps are copied into apex
834 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
835 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900836}
837
838func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800839 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900840 apex {
841 name: "myapex",
842 key: "myapex.key",
843 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900844 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000845 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900846 }
847
848 apex_key {
849 name: "myapex.key",
850 public_key: "testkey.avbpubkey",
851 private_key: "testkey.pem",
852 }
853
854 cc_library {
855 name: "mylib",
856 srcs: ["mylib.cpp"],
857 shared_libs: ["mylib2", "mylib3"],
858 system_shared_libs: [],
859 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000860 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900861 }
862
863 cc_library {
864 name: "mylib2",
865 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900866 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900867 system_shared_libs: [],
868 stl: "none",
869 stubs: {
870 versions: ["1", "2", "3"],
871 },
872 }
873
874 cc_library {
875 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900876 srcs: ["mylib.cpp"],
877 shared_libs: ["mylib4"],
878 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900879 stl: "none",
880 stubs: {
881 versions: ["10", "11", "12"],
882 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000883 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900884 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900885
886 cc_library {
887 name: "mylib4",
888 srcs: ["mylib.cpp"],
889 system_shared_libs: [],
890 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000891 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900892 }
Jiyong Park105dc322021-06-11 17:22:09 +0900893
894 rust_binary {
895 name: "foo.rust",
896 srcs: ["foo.rs"],
897 shared_libs: ["libfoo.shared_from_rust"],
898 prefer_rlib: true,
899 apex_available: ["myapex"],
900 }
901
902 cc_library_shared {
903 name: "libfoo.shared_from_rust",
904 srcs: ["mylib.cpp"],
905 system_shared_libs: [],
906 stl: "none",
907 stubs: {
908 versions: ["10", "11", "12"],
909 },
910 }
911
Jiyong Park25fc6a92018-11-18 18:02:45 +0900912 `)
913
Sundong Ahnabb64432019-10-22 13:58:29 +0900914 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900915 copyCmds := apexRule.Args["copy_commands"]
916
917 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800918 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919
920 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800921 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900922
923 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800924 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900925
Colin Crossaede88c2020-08-11 12:17:01 -0700926 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900927
928 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900929 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900930 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900931 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900932
933 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700934 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900935 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700936 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900937
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700938 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
939 // is replaced by sharing of "cFlags" in cc/builder.go.
940 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
941 // module variable representing "cflags". So it was not detected by ensureNotContains.
942 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
943 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
944 // including the original cflags's "-include mylib.h".
945 //
Jiyong Park64379952018-12-13 18:37:29 +0900946 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700947 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
948 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900949
Jiyong Park85cc35a2022-07-17 11:30:47 +0900950 // Ensure that genstub for platform-provided lib is invoked with --systemapi
951 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
952 // Ensure that genstub for apex-provided lib is invoked with --apex
953 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900954
Jooyung Hana57af4a2020-01-23 05:36:59 +0000955 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900956 "lib64/mylib.so",
957 "lib64/mylib3.so",
958 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900959 "bin/foo.rust",
960 "lib64/libc++.so", // by the implicit dependency from foo.rust
961 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900962 })
Jiyong Park105dc322021-06-11 17:22:09 +0900963
964 // Ensure that stub dependency from a rust module is not included
965 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
966 // The rust module is linked to the stub cc library
967 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
968 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
969 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900970
971 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
972 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900973}
974
Jiyong Park1bc84122021-06-22 20:23:05 +0900975func TestApexCanUsePrivateApis(t *testing.T) {
976 ctx := testApex(t, `
977 apex {
978 name: "myapex",
979 key: "myapex.key",
980 native_shared_libs: ["mylib"],
981 binaries: ["foo.rust"],
982 updatable: false,
983 platform_apis: true,
984 }
985
986 apex_key {
987 name: "myapex.key",
988 public_key: "testkey.avbpubkey",
989 private_key: "testkey.pem",
990 }
991
992 cc_library {
993 name: "mylib",
994 srcs: ["mylib.cpp"],
995 shared_libs: ["mylib2"],
996 system_shared_libs: [],
997 stl: "none",
998 apex_available: [ "myapex" ],
999 }
1000
1001 cc_library {
1002 name: "mylib2",
1003 srcs: ["mylib.cpp"],
1004 cflags: ["-include mylib.h"],
1005 system_shared_libs: [],
1006 stl: "none",
1007 stubs: {
1008 versions: ["1", "2", "3"],
1009 },
1010 }
1011
1012 rust_binary {
1013 name: "foo.rust",
1014 srcs: ["foo.rs"],
1015 shared_libs: ["libfoo.shared_from_rust"],
1016 prefer_rlib: true,
1017 apex_available: ["myapex"],
1018 }
1019
1020 cc_library_shared {
1021 name: "libfoo.shared_from_rust",
1022 srcs: ["mylib.cpp"],
1023 system_shared_libs: [],
1024 stl: "none",
1025 stubs: {
1026 versions: ["10", "11", "12"],
1027 },
1028 }
1029 `)
1030
1031 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1032 copyCmds := apexRule.Args["copy_commands"]
1033
1034 // Ensure that indirect stubs dep is not included
1035 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1036 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1037
1038 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1039 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001040 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001041 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1042 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Parkd4a00632022-04-12 12:23:20 +09001043 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001044 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1045 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1046}
1047
Colin Cross7812fd32020-09-25 12:35:10 -07001048func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1049 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001050 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001051 apex {
1052 name: "myapex",
1053 key: "myapex.key",
1054 native_shared_libs: ["mylib", "mylib3"],
1055 min_sdk_version: "29",
1056 }
1057
1058 apex_key {
1059 name: "myapex.key",
1060 public_key: "testkey.avbpubkey",
1061 private_key: "testkey.pem",
1062 }
1063
1064 cc_library {
1065 name: "mylib",
1066 srcs: ["mylib.cpp"],
1067 shared_libs: ["mylib2", "mylib3"],
1068 system_shared_libs: [],
1069 stl: "none",
1070 apex_available: [ "myapex" ],
1071 min_sdk_version: "28",
1072 }
1073
1074 cc_library {
1075 name: "mylib2",
1076 srcs: ["mylib.cpp"],
1077 cflags: ["-include mylib.h"],
1078 system_shared_libs: [],
1079 stl: "none",
1080 stubs: {
1081 versions: ["28", "29", "30", "current"],
1082 },
1083 min_sdk_version: "28",
1084 }
1085
1086 cc_library {
1087 name: "mylib3",
1088 srcs: ["mylib.cpp"],
1089 shared_libs: ["mylib4"],
1090 system_shared_libs: [],
1091 stl: "none",
1092 stubs: {
1093 versions: ["28", "29", "30", "current"],
1094 },
1095 apex_available: [ "myapex" ],
1096 min_sdk_version: "28",
1097 }
1098
1099 cc_library {
1100 name: "mylib4",
1101 srcs: ["mylib.cpp"],
1102 system_shared_libs: [],
1103 stl: "none",
1104 apex_available: [ "myapex" ],
1105 min_sdk_version: "28",
1106 }
1107 `)
1108
1109 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1110 copyCmds := apexRule.Args["copy_commands"]
1111
1112 // Ensure that direct non-stubs dep is always included
1113 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1114
1115 // Ensure that indirect stubs dep is not included
1116 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1117
1118 // Ensure that direct stubs dep is included
1119 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1120
1121 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1122
Jiyong Park55549df2021-02-26 23:57:23 +09001123 // Ensure that mylib is linking with the latest version of stub for mylib2
1124 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001125 // ... and not linking to the non-stub (impl) variant of mylib2
1126 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1127
1128 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1129 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1130 // .. and not linking to the stubs variant of mylib3
1131 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1132
1133 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001134 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001135 ensureNotContains(t, mylib2Cflags, "-include ")
1136
Jiyong Park85cc35a2022-07-17 11:30:47 +09001137 // Ensure that genstub is invoked with --systemapi
1138 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001139
1140 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1141 "lib64/mylib.so",
1142 "lib64/mylib3.so",
1143 "lib64/mylib4.so",
1144 })
1145}
1146
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001147func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1148 t.Parallel()
1149 // myapex (Z)
1150 // mylib -----------------.
1151 // |
1152 // otherapex (29) |
1153 // libstub's versions: 29 Z current
1154 // |
1155 // <platform> |
1156 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001157 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001158 apex {
1159 name: "myapex",
1160 key: "myapex.key",
1161 native_shared_libs: ["mylib"],
1162 min_sdk_version: "Z", // non-final
1163 }
1164
1165 cc_library {
1166 name: "mylib",
1167 srcs: ["mylib.cpp"],
1168 shared_libs: ["libstub"],
1169 apex_available: ["myapex"],
1170 min_sdk_version: "Z",
1171 }
1172
1173 apex_key {
1174 name: "myapex.key",
1175 public_key: "testkey.avbpubkey",
1176 private_key: "testkey.pem",
1177 }
1178
1179 apex {
1180 name: "otherapex",
1181 key: "myapex.key",
1182 native_shared_libs: ["libstub"],
1183 min_sdk_version: "29",
1184 }
1185
1186 cc_library {
1187 name: "libstub",
1188 srcs: ["mylib.cpp"],
1189 stubs: {
1190 versions: ["29", "Z", "current"],
1191 },
1192 apex_available: ["otherapex"],
1193 min_sdk_version: "29",
1194 }
1195
1196 // platform module depending on libstub from otherapex should use the latest stub("current")
1197 cc_library {
1198 name: "libplatform",
1199 srcs: ["mylib.cpp"],
1200 shared_libs: ["libstub"],
1201 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001202 `,
1203 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1204 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1205 variables.Platform_sdk_final = proptools.BoolPtr(false)
1206 variables.Platform_version_active_codenames = []string{"Z"}
1207 }),
1208 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001209
Jiyong Park55549df2021-02-26 23:57:23 +09001210 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001211 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001212 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001213 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001214 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001215
1216 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1217 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1218 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1219 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1220 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1221}
1222
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001223func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001224 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001225 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001226 name: "myapex2",
1227 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001228 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001229 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001230 }
1231
1232 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001233 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001234 public_key: "testkey.avbpubkey",
1235 private_key: "testkey.pem",
1236 }
1237
1238 cc_library {
1239 name: "mylib",
1240 srcs: ["mylib.cpp"],
1241 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001242 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001243 system_shared_libs: [],
1244 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001245 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001246 }
1247
1248 cc_library {
1249 name: "libfoo",
1250 srcs: ["mylib.cpp"],
1251 shared_libs: ["libbar"],
1252 system_shared_libs: [],
1253 stl: "none",
1254 stubs: {
1255 versions: ["10", "20", "30"],
1256 },
1257 }
1258
1259 cc_library {
1260 name: "libbar",
1261 srcs: ["mylib.cpp"],
1262 system_shared_libs: [],
1263 stl: "none",
1264 }
1265
Jiyong Park678c8812020-02-07 17:25:49 +09001266 cc_library_static {
1267 name: "libbaz",
1268 srcs: ["mylib.cpp"],
1269 system_shared_libs: [],
1270 stl: "none",
1271 apex_available: [ "myapex2" ],
1272 }
1273
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001274 `)
1275
Jiyong Park83dc74b2020-01-14 18:38:44 +09001276 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001277 copyCmds := apexRule.Args["copy_commands"]
1278
1279 // Ensure that direct non-stubs dep is always included
1280 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1281
1282 // Ensure that indirect stubs dep is not included
1283 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1284
1285 // Ensure that dependency of stubs is not included
1286 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1287
Colin Crossaede88c2020-08-11 12:17:01 -07001288 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001289
1290 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001291 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001292 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001293 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001294
Jiyong Park3ff16992019-12-27 14:11:47 +09001295 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001296
1297 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1298 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001299
Artur Satayeva8bd1132020-04-27 18:07:06 +01001300 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001301 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001302
Artur Satayeva8bd1132020-04-27 18:07:06 +01001303 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001304 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001305}
1306
Jooyung Hand3639552019-08-09 12:57:43 +09001307func TestApexWithRuntimeLibsDependency(t *testing.T) {
1308 /*
1309 myapex
1310 |
1311 v (runtime_libs)
1312 mylib ------+------> libfoo [provides stub]
1313 |
1314 `------> libbar
1315 */
Colin Cross1c460562021-02-16 17:55:47 -08001316 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001317 apex {
1318 name: "myapex",
1319 key: "myapex.key",
1320 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001321 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001322 }
1323
1324 apex_key {
1325 name: "myapex.key",
1326 public_key: "testkey.avbpubkey",
1327 private_key: "testkey.pem",
1328 }
1329
1330 cc_library {
1331 name: "mylib",
1332 srcs: ["mylib.cpp"],
1333 runtime_libs: ["libfoo", "libbar"],
1334 system_shared_libs: [],
1335 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001336 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001337 }
1338
1339 cc_library {
1340 name: "libfoo",
1341 srcs: ["mylib.cpp"],
1342 system_shared_libs: [],
1343 stl: "none",
1344 stubs: {
1345 versions: ["10", "20", "30"],
1346 },
1347 }
1348
1349 cc_library {
1350 name: "libbar",
1351 srcs: ["mylib.cpp"],
1352 system_shared_libs: [],
1353 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001354 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001355 }
1356
1357 `)
1358
Sundong Ahnabb64432019-10-22 13:58:29 +09001359 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001360 copyCmds := apexRule.Args["copy_commands"]
1361
1362 // Ensure that direct non-stubs dep is always included
1363 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1364
1365 // Ensure that indirect stubs dep is not included
1366 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1367
1368 // Ensure that runtime_libs dep in included
1369 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1370
Sundong Ahnabb64432019-10-22 13:58:29 +09001371 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001372 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1373 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001374
1375}
1376
Paul Duffina02cae32021-03-09 01:44:06 +00001377var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1378 cc.PrepareForTestWithCcBuildComponents,
1379 PrepareForTestWithApexBuildComponents,
1380 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001381 apex {
1382 name: "com.android.runtime",
1383 key: "com.android.runtime.key",
1384 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001385 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001386 }
1387
1388 apex_key {
1389 name: "com.android.runtime.key",
1390 public_key: "testkey.avbpubkey",
1391 private_key: "testkey.pem",
1392 }
Paul Duffina02cae32021-03-09 01:44:06 +00001393 `),
1394 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1395)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001396
Paul Duffina02cae32021-03-09 01:44:06 +00001397func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001398 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001399 cc_library {
1400 name: "libc",
1401 no_libcrt: true,
1402 nocrt: true,
1403 stl: "none",
1404 system_shared_libs: [],
1405 stubs: { versions: ["1"] },
1406 apex_available: ["com.android.runtime"],
1407
1408 sanitize: {
1409 hwaddress: true,
1410 }
1411 }
1412
1413 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001414 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001415 no_libcrt: true,
1416 nocrt: true,
1417 stl: "none",
1418 system_shared_libs: [],
1419 srcs: [""],
1420 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001421 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001422
1423 sanitize: {
1424 never: true,
1425 },
Paul Duffina02cae32021-03-09 01:44:06 +00001426 } `)
1427 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001428
1429 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1430 "lib64/bionic/libc.so",
1431 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1432 })
1433
Colin Cross4c4c1be2022-02-10 11:41:18 -08001434 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001435
1436 installed := hwasan.Description("install libclang_rt.hwasan")
1437 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1438
1439 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1440 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1441 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1442}
1443
1444func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001445 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001446 prepareForTestOfRuntimeApexWithHwasan,
1447 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1448 variables.SanitizeDevice = []string{"hwaddress"}
1449 }),
1450 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001451 cc_library {
1452 name: "libc",
1453 no_libcrt: true,
1454 nocrt: true,
1455 stl: "none",
1456 system_shared_libs: [],
1457 stubs: { versions: ["1"] },
1458 apex_available: ["com.android.runtime"],
1459 }
1460
1461 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001462 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001463 no_libcrt: true,
1464 nocrt: true,
1465 stl: "none",
1466 system_shared_libs: [],
1467 srcs: [""],
1468 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001469 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001470
1471 sanitize: {
1472 never: true,
1473 },
1474 }
Paul Duffina02cae32021-03-09 01:44:06 +00001475 `)
1476 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001477
1478 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1479 "lib64/bionic/libc.so",
1480 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1481 })
1482
Colin Cross4c4c1be2022-02-10 11:41:18 -08001483 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001484
1485 installed := hwasan.Description("install libclang_rt.hwasan")
1486 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1487
1488 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1489 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1490 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1491}
1492
Jooyung Han61b66e92020-03-21 14:21:46 +00001493func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1494 testcases := []struct {
1495 name string
1496 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001497 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001498 shouldLink string
1499 shouldNotLink []string
1500 }{
1501 {
Jiyong Park55549df2021-02-26 23:57:23 +09001502 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001503 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001504 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001505 shouldLink: "current",
1506 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001507 },
1508 {
Jiyong Park55549df2021-02-26 23:57:23 +09001509 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001510 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001511 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001512 shouldLink: "current",
1513 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001514 },
1515 }
1516 for _, tc := range testcases {
1517 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001518 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001519 apex {
1520 name: "myapex",
1521 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001522 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001523 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001524 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001525 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001526
Jooyung Han61b66e92020-03-21 14:21:46 +00001527 apex_key {
1528 name: "myapex.key",
1529 public_key: "testkey.avbpubkey",
1530 private_key: "testkey.pem",
1531 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001532
Jooyung Han61b66e92020-03-21 14:21:46 +00001533 cc_library {
1534 name: "mylib",
1535 srcs: ["mylib.cpp"],
1536 vendor_available: true,
1537 shared_libs: ["libbar"],
1538 system_shared_libs: [],
1539 stl: "none",
1540 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001541 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001542 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001543
Jooyung Han61b66e92020-03-21 14:21:46 +00001544 cc_library {
1545 name: "libbar",
1546 srcs: ["mylib.cpp"],
1547 system_shared_libs: [],
1548 stl: "none",
1549 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001550 llndk: {
1551 symbol_file: "libbar.map.txt",
1552 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001553 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001554 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001555 withUnbundledBuild,
1556 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001557
Jooyung Han61b66e92020-03-21 14:21:46 +00001558 // Ensure that LLNDK dep is not included
1559 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1560 "lib64/mylib.so",
1561 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001562
Jooyung Han61b66e92020-03-21 14:21:46 +00001563 // Ensure that LLNDK dep is required
1564 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1565 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1566 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001567
Steven Moreland2c4000c2021-04-27 02:08:49 +00001568 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1569 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001570 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001571 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001572 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001573
Steven Moreland2c4000c2021-04-27 02:08:49 +00001574 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001575 ver := tc.shouldLink
1576 if tc.shouldLink == "current" {
1577 ver = strconv.Itoa(android.FutureApiLevelInt)
1578 }
1579 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001580 })
1581 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001582}
1583
Jiyong Park25fc6a92018-11-18 18:02:45 +09001584func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001585 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001586 apex {
1587 name: "myapex",
1588 key: "myapex.key",
1589 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001590 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001591 }
1592
1593 apex_key {
1594 name: "myapex.key",
1595 public_key: "testkey.avbpubkey",
1596 private_key: "testkey.pem",
1597 }
1598
1599 cc_library {
1600 name: "mylib",
1601 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001602 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001603 shared_libs: ["libdl#27"],
1604 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001605 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001606 }
1607
1608 cc_library_shared {
1609 name: "mylib_shared",
1610 srcs: ["mylib.cpp"],
1611 shared_libs: ["libdl#27"],
1612 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001613 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001614 }
1615
1616 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001617 name: "libBootstrap",
1618 srcs: ["mylib.cpp"],
1619 stl: "none",
1620 bootstrap: true,
1621 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001622 `)
1623
Sundong Ahnabb64432019-10-22 13:58:29 +09001624 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001625 copyCmds := apexRule.Args["copy_commands"]
1626
1627 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001628 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001629 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1630 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001631
1632 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001633 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001634
Colin Crossaede88c2020-08-11 12:17:01 -07001635 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1636 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1637 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001638
1639 // For dependency to libc
1640 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001641 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001642 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001643 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001644 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001645 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1646 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001647
1648 // For dependency to libm
1649 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001650 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001651 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001652 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001653 // ... and is not compiling with the stub
1654 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1655 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1656
1657 // For dependency to libdl
1658 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001659 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001660 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001661 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1662 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001663 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001664 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001665 // ... Cflags from stub is correctly exported to mylib
1666 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1667 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001668
1669 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001670 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1671 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1672 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1673 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001674}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001675
Jooyung Han749dc692020-04-15 11:03:39 +09001676func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001677 // there are three links between liba --> libz.
1678 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001679 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001680 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001681 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001682 apex {
1683 name: "myapex",
1684 key: "myapex.key",
1685 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001686 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001687 }
1688
1689 apex {
1690 name: "otherapex",
1691 key: "myapex.key",
1692 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001693 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001694 }
1695
1696 apex_key {
1697 name: "myapex.key",
1698 public_key: "testkey.avbpubkey",
1699 private_key: "testkey.pem",
1700 }
1701
1702 cc_library {
1703 name: "libx",
1704 shared_libs: ["liba"],
1705 system_shared_libs: [],
1706 stl: "none",
1707 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001708 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001709 }
1710
1711 cc_library {
1712 name: "liby",
1713 shared_libs: ["liba"],
1714 system_shared_libs: [],
1715 stl: "none",
1716 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001717 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001718 }
1719
1720 cc_library {
1721 name: "liba",
1722 shared_libs: ["libz"],
1723 system_shared_libs: [],
1724 stl: "none",
1725 apex_available: [
1726 "//apex_available:anyapex",
1727 "//apex_available:platform",
1728 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001729 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001730 }
1731
1732 cc_library {
1733 name: "libz",
1734 system_shared_libs: [],
1735 stl: "none",
1736 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001737 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001738 },
1739 }
Jooyung Han749dc692020-04-15 11:03:39 +09001740 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001741
1742 expectLink := func(from, from_variant, to, to_variant string) {
1743 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1744 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1745 }
1746 expectNoLink := func(from, from_variant, to, to_variant string) {
1747 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1748 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1749 }
1750 // platform liba is linked to non-stub version
1751 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001752 // liba in myapex is linked to current
1753 expectLink("liba", "shared_apex29", "libz", "shared_current")
1754 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001755 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001756 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001757 // liba in otherapex is linked to current
1758 expectLink("liba", "shared_apex30", "libz", "shared_current")
1759 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001760 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1761 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001762}
1763
Jooyung Hanaed150d2020-04-02 01:41:41 +09001764func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001765 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001766 apex {
1767 name: "myapex",
1768 key: "myapex.key",
1769 native_shared_libs: ["libx"],
1770 min_sdk_version: "R",
1771 }
1772
1773 apex_key {
1774 name: "myapex.key",
1775 public_key: "testkey.avbpubkey",
1776 private_key: "testkey.pem",
1777 }
1778
1779 cc_library {
1780 name: "libx",
1781 shared_libs: ["libz"],
1782 system_shared_libs: [],
1783 stl: "none",
1784 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001785 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001786 }
1787
1788 cc_library {
1789 name: "libz",
1790 system_shared_libs: [],
1791 stl: "none",
1792 stubs: {
1793 versions: ["29", "R"],
1794 },
1795 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001796 `,
1797 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1798 variables.Platform_version_active_codenames = []string{"R"}
1799 }),
1800 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001801
1802 expectLink := func(from, from_variant, to, to_variant string) {
1803 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1804 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1805 }
1806 expectNoLink := func(from, from_variant, to, to_variant string) {
1807 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1808 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1809 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001810 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1811 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001812 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1813 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001814}
1815
Jooyung Han4c4da062021-06-23 10:23:16 +09001816func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1817 testApex(t, `
1818 apex {
1819 name: "myapex",
1820 key: "myapex.key",
1821 java_libs: ["libx"],
1822 min_sdk_version: "S",
1823 }
1824
1825 apex_key {
1826 name: "myapex.key",
1827 public_key: "testkey.avbpubkey",
1828 private_key: "testkey.pem",
1829 }
1830
1831 java_library {
1832 name: "libx",
1833 srcs: ["a.java"],
1834 apex_available: [ "myapex" ],
1835 sdk_version: "current",
1836 min_sdk_version: "S", // should be okay
1837 }
1838 `,
1839 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1840 variables.Platform_version_active_codenames = []string{"S"}
1841 variables.Platform_sdk_codename = proptools.StringPtr("S")
1842 }),
1843 )
1844}
1845
Jooyung Han749dc692020-04-15 11:03:39 +09001846func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001847 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001848 apex {
1849 name: "myapex",
1850 key: "myapex.key",
1851 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001852 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001853 }
1854
1855 apex_key {
1856 name: "myapex.key",
1857 public_key: "testkey.avbpubkey",
1858 private_key: "testkey.pem",
1859 }
1860
1861 cc_library {
1862 name: "libx",
1863 shared_libs: ["libz"],
1864 system_shared_libs: [],
1865 stl: "none",
1866 apex_available: [ "myapex" ],
1867 }
1868
1869 cc_library {
1870 name: "libz",
1871 system_shared_libs: [],
1872 stl: "none",
1873 stubs: {
1874 versions: ["1", "2"],
1875 },
1876 }
1877 `)
1878
1879 expectLink := func(from, from_variant, to, to_variant string) {
1880 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1881 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1882 }
1883 expectNoLink := func(from, from_variant, to, to_variant string) {
1884 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1885 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1886 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001887 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001888 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001889 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001890 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001891}
1892
Jiyong Park5df7bd32021-08-25 16:18:46 +09001893func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1894 ctx := testApex(t, `
1895 apex {
1896 name: "myapex",
1897 key: "myapex.key",
1898 native_shared_libs: ["mylib"],
1899 updatable: false,
1900 vendor: true,
1901 min_sdk_version: "29",
1902 }
1903
1904 apex_key {
1905 name: "myapex.key",
1906 public_key: "testkey.avbpubkey",
1907 private_key: "testkey.pem",
1908 }
1909
1910 cc_library {
1911 name: "mylib",
1912 vendor_available: true,
1913 system_shared_libs: [],
1914 stl: "none",
1915 apex_available: [ "myapex" ],
1916 min_sdk_version: "29",
1917 }
1918 `)
1919
1920 vendorVariant := "android_vendor.29_arm64_armv8-a"
1921
1922 // First check that the correct variant of crtbegin_so is used.
1923 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1924 crtBegin := names(ldRule.Args["crtBegin"])
1925 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1926
1927 // Ensure that the crtbegin_so used by the APEX is targeting 29
1928 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1929 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1930}
1931
Jooyung Han03b51852020-02-26 22:45:42 +09001932func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001933 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001934 apex {
1935 name: "myapex",
1936 key: "myapex.key",
1937 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001938 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001939 }
1940
1941 apex_key {
1942 name: "myapex.key",
1943 public_key: "testkey.avbpubkey",
1944 private_key: "testkey.pem",
1945 }
1946
1947 cc_library {
1948 name: "libx",
1949 system_shared_libs: [],
1950 stl: "none",
1951 apex_available: [ "myapex" ],
1952 stubs: {
1953 versions: ["1", "2"],
1954 },
1955 }
1956
1957 cc_library {
1958 name: "libz",
1959 shared_libs: ["libx"],
1960 system_shared_libs: [],
1961 stl: "none",
1962 }
1963 `)
1964
1965 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001966 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001967 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1968 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1969 }
1970 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001971 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001972 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1973 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1974 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001975 expectLink("libz", "shared", "libx", "shared_current")
1976 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001977 expectNoLink("libz", "shared", "libz", "shared_1")
1978 expectNoLink("libz", "shared", "libz", "shared")
1979}
1980
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001981var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1982 func(variables android.FixtureProductVariables) {
1983 variables.SanitizeDevice = []string{"hwaddress"}
1984 },
1985)
1986
Jooyung Han75568392020-03-20 04:29:24 +09001987func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001988 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001989 apex {
1990 name: "myapex",
1991 key: "myapex.key",
1992 native_shared_libs: ["libx"],
1993 min_sdk_version: "29",
1994 }
1995
1996 apex_key {
1997 name: "myapex.key",
1998 public_key: "testkey.avbpubkey",
1999 private_key: "testkey.pem",
2000 }
2001
2002 cc_library {
2003 name: "libx",
2004 shared_libs: ["libbar"],
2005 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002006 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002007 }
2008
2009 cc_library {
2010 name: "libbar",
2011 stubs: {
2012 versions: ["29", "30"],
2013 },
2014 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002015 `,
2016 prepareForTestWithSantitizeHwaddress,
2017 )
Jooyung Han03b51852020-02-26 22:45:42 +09002018 expectLink := func(from, from_variant, to, to_variant string) {
2019 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2020 libFlags := ld.Args["libFlags"]
2021 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2022 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002023 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002024}
2025
Jooyung Han75568392020-03-20 04:29:24 +09002026func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002027 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002028 apex {
2029 name: "myapex",
2030 key: "myapex.key",
2031 native_shared_libs: ["libx"],
2032 min_sdk_version: "29",
2033 }
2034
2035 apex_key {
2036 name: "myapex.key",
2037 public_key: "testkey.avbpubkey",
2038 private_key: "testkey.pem",
2039 }
2040
2041 cc_library {
2042 name: "libx",
2043 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002044 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002045 }
Jooyung Han75568392020-03-20 04:29:24 +09002046 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002047
2048 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002049 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002050 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002051 // note that platform variant is not.
2052 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002053 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002054}
2055
Jooyung Han749dc692020-04-15 11:03:39 +09002056func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2057 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002058 apex {
2059 name: "myapex",
2060 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002061 native_shared_libs: ["mylib"],
2062 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002063 }
2064
2065 apex_key {
2066 name: "myapex.key",
2067 public_key: "testkey.avbpubkey",
2068 private_key: "testkey.pem",
2069 }
Jooyung Han749dc692020-04-15 11:03:39 +09002070
2071 cc_library {
2072 name: "mylib",
2073 srcs: ["mylib.cpp"],
2074 system_shared_libs: [],
2075 stl: "none",
2076 apex_available: [
2077 "myapex",
2078 ],
2079 min_sdk_version: "30",
2080 }
2081 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002082
2083 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2084 apex {
2085 name: "myapex",
2086 key: "myapex.key",
2087 native_shared_libs: ["libfoo.ffi"],
2088 min_sdk_version: "29",
2089 }
2090
2091 apex_key {
2092 name: "myapex.key",
2093 public_key: "testkey.avbpubkey",
2094 private_key: "testkey.pem",
2095 }
2096
2097 rust_ffi_shared {
2098 name: "libfoo.ffi",
2099 srcs: ["foo.rs"],
2100 crate_name: "foo",
2101 apex_available: [
2102 "myapex",
2103 ],
2104 min_sdk_version: "30",
2105 }
2106 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002107
2108 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2109 apex {
2110 name: "myapex",
2111 key: "myapex.key",
2112 java_libs: ["libfoo"],
2113 min_sdk_version: "29",
2114 }
2115
2116 apex_key {
2117 name: "myapex.key",
2118 public_key: "testkey.avbpubkey",
2119 private_key: "testkey.pem",
2120 }
2121
2122 java_import {
2123 name: "libfoo",
2124 jars: ["libfoo.jar"],
2125 apex_available: [
2126 "myapex",
2127 ],
2128 min_sdk_version: "30",
2129 }
2130 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002131}
2132
2133func TestApexMinSdkVersion_Okay(t *testing.T) {
2134 testApex(t, `
2135 apex {
2136 name: "myapex",
2137 key: "myapex.key",
2138 native_shared_libs: ["libfoo"],
2139 java_libs: ["libbar"],
2140 min_sdk_version: "29",
2141 }
2142
2143 apex_key {
2144 name: "myapex.key",
2145 public_key: "testkey.avbpubkey",
2146 private_key: "testkey.pem",
2147 }
2148
2149 cc_library {
2150 name: "libfoo",
2151 srcs: ["mylib.cpp"],
2152 shared_libs: ["libfoo_dep"],
2153 apex_available: ["myapex"],
2154 min_sdk_version: "29",
2155 }
2156
2157 cc_library {
2158 name: "libfoo_dep",
2159 srcs: ["mylib.cpp"],
2160 apex_available: ["myapex"],
2161 min_sdk_version: "29",
2162 }
2163
2164 java_library {
2165 name: "libbar",
2166 sdk_version: "current",
2167 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002168 static_libs: [
2169 "libbar_dep",
2170 "libbar_import_dep",
2171 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002172 apex_available: ["myapex"],
2173 min_sdk_version: "29",
2174 }
2175
2176 java_library {
2177 name: "libbar_dep",
2178 sdk_version: "current",
2179 srcs: ["a.java"],
2180 apex_available: ["myapex"],
2181 min_sdk_version: "29",
2182 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002183
2184 java_import {
2185 name: "libbar_import_dep",
2186 jars: ["libbar.jar"],
2187 apex_available: ["myapex"],
2188 min_sdk_version: "29",
2189 }
Jooyung Han03b51852020-02-26 22:45:42 +09002190 `)
2191}
2192
Colin Cross8ca61c12022-10-06 21:00:14 -07002193func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2194 // Tests that an apex dependency with min_sdk_version higher than the
2195 // min_sdk_version of the apex is allowed as long as the dependency's
2196 // min_sdk_version is less than or equal to the api level that the
2197 // architecture was introduced in. In this case, arm64 didn't exist
2198 // until api level 21, so the arm64 code will never need to run on
2199 // an api level 20 device, even if other architectures of the apex
2200 // will.
2201 testApex(t, `
2202 apex {
2203 name: "myapex",
2204 key: "myapex.key",
2205 native_shared_libs: ["libfoo"],
2206 min_sdk_version: "20",
2207 }
2208
2209 apex_key {
2210 name: "myapex.key",
2211 public_key: "testkey.avbpubkey",
2212 private_key: "testkey.pem",
2213 }
2214
2215 cc_library {
2216 name: "libfoo",
2217 srcs: ["mylib.cpp"],
2218 apex_available: ["myapex"],
2219 min_sdk_version: "21",
2220 stl: "none",
2221 }
2222 `)
2223}
2224
Artur Satayev8cf899a2020-04-15 17:29:42 +01002225func TestJavaStableSdkVersion(t *testing.T) {
2226 testCases := []struct {
2227 name string
2228 expectedError string
2229 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002230 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002231 }{
2232 {
2233 name: "Non-updatable apex with non-stable dep",
2234 bp: `
2235 apex {
2236 name: "myapex",
2237 java_libs: ["myjar"],
2238 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002239 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002240 }
2241 apex_key {
2242 name: "myapex.key",
2243 public_key: "testkey.avbpubkey",
2244 private_key: "testkey.pem",
2245 }
2246 java_library {
2247 name: "myjar",
2248 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002249 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002250 apex_available: ["myapex"],
2251 }
2252 `,
2253 },
2254 {
2255 name: "Updatable apex with stable dep",
2256 bp: `
2257 apex {
2258 name: "myapex",
2259 java_libs: ["myjar"],
2260 key: "myapex.key",
2261 updatable: true,
2262 min_sdk_version: "29",
2263 }
2264 apex_key {
2265 name: "myapex.key",
2266 public_key: "testkey.avbpubkey",
2267 private_key: "testkey.pem",
2268 }
2269 java_library {
2270 name: "myjar",
2271 srcs: ["foo/bar/MyClass.java"],
2272 sdk_version: "current",
2273 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002274 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002275 }
2276 `,
2277 },
2278 {
2279 name: "Updatable apex with non-stable dep",
2280 expectedError: "cannot depend on \"myjar\"",
2281 bp: `
2282 apex {
2283 name: "myapex",
2284 java_libs: ["myjar"],
2285 key: "myapex.key",
2286 updatable: true,
2287 }
2288 apex_key {
2289 name: "myapex.key",
2290 public_key: "testkey.avbpubkey",
2291 private_key: "testkey.pem",
2292 }
2293 java_library {
2294 name: "myjar",
2295 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002296 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002297 apex_available: ["myapex"],
2298 }
2299 `,
2300 },
2301 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002302 name: "Updatable apex with non-stable legacy core platform dep",
2303 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2304 bp: `
2305 apex {
2306 name: "myapex",
2307 java_libs: ["myjar-uses-legacy"],
2308 key: "myapex.key",
2309 updatable: true,
2310 }
2311 apex_key {
2312 name: "myapex.key",
2313 public_key: "testkey.avbpubkey",
2314 private_key: "testkey.pem",
2315 }
2316 java_library {
2317 name: "myjar-uses-legacy",
2318 srcs: ["foo/bar/MyClass.java"],
2319 sdk_version: "core_platform",
2320 apex_available: ["myapex"],
2321 }
2322 `,
2323 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2324 },
2325 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002326 name: "Updatable apex with non-stable transitive dep",
2327 // This is not actually detecting that the transitive dependency is unstable, rather it is
2328 // detecting that the transitive dependency is building against a wider API surface than the
2329 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002330 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002331 bp: `
2332 apex {
2333 name: "myapex",
2334 java_libs: ["myjar"],
2335 key: "myapex.key",
2336 updatable: true,
2337 }
2338 apex_key {
2339 name: "myapex.key",
2340 public_key: "testkey.avbpubkey",
2341 private_key: "testkey.pem",
2342 }
2343 java_library {
2344 name: "myjar",
2345 srcs: ["foo/bar/MyClass.java"],
2346 sdk_version: "current",
2347 apex_available: ["myapex"],
2348 static_libs: ["transitive-jar"],
2349 }
2350 java_library {
2351 name: "transitive-jar",
2352 srcs: ["foo/bar/MyClass.java"],
2353 sdk_version: "core_platform",
2354 apex_available: ["myapex"],
2355 }
2356 `,
2357 },
2358 }
2359
2360 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002361 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2362 continue
2363 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002364 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002365 errorHandler := android.FixtureExpectsNoErrors
2366 if test.expectedError != "" {
2367 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002368 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002369 android.GroupFixturePreparers(
2370 java.PrepareForTestWithJavaDefaultModules,
2371 PrepareForTestWithApexBuildComponents,
2372 prepareForTestWithMyapex,
2373 android.OptionalFixturePreparer(test.preparer),
2374 ).
2375 ExtendWithErrorHandler(errorHandler).
2376 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002377 })
2378 }
2379}
2380
Jooyung Han749dc692020-04-15 11:03:39 +09002381func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2382 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2383 apex {
2384 name: "myapex",
2385 key: "myapex.key",
2386 native_shared_libs: ["mylib"],
2387 min_sdk_version: "29",
2388 }
2389
2390 apex_key {
2391 name: "myapex.key",
2392 public_key: "testkey.avbpubkey",
2393 private_key: "testkey.pem",
2394 }
2395
2396 cc_library {
2397 name: "mylib",
2398 srcs: ["mylib.cpp"],
2399 shared_libs: ["mylib2"],
2400 system_shared_libs: [],
2401 stl: "none",
2402 apex_available: [
2403 "myapex",
2404 ],
2405 min_sdk_version: "29",
2406 }
2407
2408 // indirect part of the apex
2409 cc_library {
2410 name: "mylib2",
2411 srcs: ["mylib.cpp"],
2412 system_shared_libs: [],
2413 stl: "none",
2414 apex_available: [
2415 "myapex",
2416 ],
2417 min_sdk_version: "30",
2418 }
2419 `)
2420}
2421
2422func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2423 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2424 apex {
2425 name: "myapex",
2426 key: "myapex.key",
2427 apps: ["AppFoo"],
2428 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002429 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002430 }
2431
2432 apex_key {
2433 name: "myapex.key",
2434 public_key: "testkey.avbpubkey",
2435 private_key: "testkey.pem",
2436 }
2437
2438 android_app {
2439 name: "AppFoo",
2440 srcs: ["foo/bar/MyClass.java"],
2441 sdk_version: "current",
2442 min_sdk_version: "29",
2443 system_modules: "none",
2444 stl: "none",
2445 static_libs: ["bar"],
2446 apex_available: [ "myapex" ],
2447 }
2448
2449 java_library {
2450 name: "bar",
2451 sdk_version: "current",
2452 srcs: ["a.java"],
2453 apex_available: [ "myapex" ],
2454 }
2455 `)
2456}
2457
2458func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002459 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002460 apex {
2461 name: "myapex",
2462 key: "myapex.key",
2463 native_shared_libs: ["mylib"],
2464 min_sdk_version: "29",
2465 }
2466
2467 apex_key {
2468 name: "myapex.key",
2469 public_key: "testkey.avbpubkey",
2470 private_key: "testkey.pem",
2471 }
2472
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002473 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002474 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2475 cc_library {
2476 name: "mylib",
2477 srcs: ["mylib.cpp"],
2478 shared_libs: ["mylib2"],
2479 system_shared_libs: [],
2480 stl: "none",
2481 apex_available: ["myapex", "otherapex"],
2482 min_sdk_version: "29",
2483 }
2484
2485 cc_library {
2486 name: "mylib2",
2487 srcs: ["mylib.cpp"],
2488 system_shared_libs: [],
2489 stl: "none",
2490 apex_available: ["otherapex"],
2491 stubs: { versions: ["29", "30"] },
2492 min_sdk_version: "30",
2493 }
2494
2495 apex {
2496 name: "otherapex",
2497 key: "myapex.key",
2498 native_shared_libs: ["mylib", "mylib2"],
2499 min_sdk_version: "30",
2500 }
2501 `)
2502 expectLink := func(from, from_variant, to, to_variant string) {
2503 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2504 libFlags := ld.Args["libFlags"]
2505 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2506 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002507 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002508 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002509}
2510
Jooyung Haned124c32021-01-26 11:43:46 +09002511func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002512 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2513 func(variables android.FixtureProductVariables) {
2514 variables.Platform_sdk_codename = proptools.StringPtr("S")
2515 variables.Platform_version_active_codenames = []string{"S"}
2516 },
2517 )
Jooyung Haned124c32021-01-26 11:43:46 +09002518 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2519 apex {
2520 name: "myapex",
2521 key: "myapex.key",
2522 native_shared_libs: ["libfoo"],
2523 min_sdk_version: "S",
2524 }
2525 apex_key {
2526 name: "myapex.key",
2527 public_key: "testkey.avbpubkey",
2528 private_key: "testkey.pem",
2529 }
2530 cc_library {
2531 name: "libfoo",
2532 shared_libs: ["libbar"],
2533 apex_available: ["myapex"],
2534 min_sdk_version: "29",
2535 }
2536 cc_library {
2537 name: "libbar",
2538 apex_available: ["myapex"],
2539 }
2540 `, withSAsActiveCodeNames)
2541}
2542
2543func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002544 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2545 variables.Platform_sdk_codename = proptools.StringPtr("S")
2546 variables.Platform_version_active_codenames = []string{"S", "T"}
2547 })
Colin Cross1c460562021-02-16 17:55:47 -08002548 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002549 apex {
2550 name: "myapex",
2551 key: "myapex.key",
2552 native_shared_libs: ["libfoo"],
2553 min_sdk_version: "S",
2554 }
2555 apex_key {
2556 name: "myapex.key",
2557 public_key: "testkey.avbpubkey",
2558 private_key: "testkey.pem",
2559 }
2560 cc_library {
2561 name: "libfoo",
2562 shared_libs: ["libbar"],
2563 apex_available: ["myapex"],
2564 min_sdk_version: "S",
2565 }
2566 cc_library {
2567 name: "libbar",
2568 stubs: {
2569 symbol_file: "libbar.map.txt",
2570 versions: ["30", "S", "T"],
2571 },
2572 }
2573 `, withSAsActiveCodeNames)
2574
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002575 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002576 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2577 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002578 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002579}
2580
Jiyong Park7c2ee712018-12-07 00:42:25 +09002581func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002582 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002583 apex {
2584 name: "myapex",
2585 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002586 native_shared_libs: ["mylib"],
2587 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002588 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002589 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002590 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002591 }
2592
2593 apex_key {
2594 name: "myapex.key",
2595 public_key: "testkey.avbpubkey",
2596 private_key: "testkey.pem",
2597 }
2598
2599 prebuilt_etc {
2600 name: "myetc",
2601 src: "myprebuilt",
2602 sub_dir: "foo/bar",
2603 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002604
2605 cc_library {
2606 name: "mylib",
2607 srcs: ["mylib.cpp"],
2608 relative_install_path: "foo/bar",
2609 system_shared_libs: [],
2610 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002611 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002612 }
2613
2614 cc_binary {
2615 name: "mybin",
2616 srcs: ["mylib.cpp"],
2617 relative_install_path: "foo/bar",
2618 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002619 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002620 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002621 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002622 `)
2623
Sundong Ahnabb64432019-10-22 13:58:29 +09002624 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002625 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002626
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002627 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002628 ensureContains(t, cmd, "/etc ")
2629 ensureContains(t, cmd, "/etc/foo ")
2630 ensureContains(t, cmd, "/etc/foo/bar ")
2631 ensureContains(t, cmd, "/lib64 ")
2632 ensureContains(t, cmd, "/lib64/foo ")
2633 ensureContains(t, cmd, "/lib64/foo/bar ")
2634 ensureContains(t, cmd, "/lib ")
2635 ensureContains(t, cmd, "/lib/foo ")
2636 ensureContains(t, cmd, "/lib/foo/bar ")
2637 ensureContains(t, cmd, "/bin ")
2638 ensureContains(t, cmd, "/bin/foo ")
2639 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002640}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002641
Jooyung Han35155c42020-02-06 17:33:20 +09002642func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002643 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002644 apex {
2645 name: "myapex",
2646 key: "myapex.key",
2647 multilib: {
2648 both: {
2649 native_shared_libs: ["mylib"],
2650 binaries: ["mybin"],
2651 },
2652 },
2653 compile_multilib: "both",
2654 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002655 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002656 }
2657
2658 apex_key {
2659 name: "myapex.key",
2660 public_key: "testkey.avbpubkey",
2661 private_key: "testkey.pem",
2662 }
2663
2664 cc_library {
2665 name: "mylib",
2666 relative_install_path: "foo/bar",
2667 system_shared_libs: [],
2668 stl: "none",
2669 apex_available: [ "myapex" ],
2670 native_bridge_supported: true,
2671 }
2672
2673 cc_binary {
2674 name: "mybin",
2675 relative_install_path: "foo/bar",
2676 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002677 stl: "none",
2678 apex_available: [ "myapex" ],
2679 native_bridge_supported: true,
2680 compile_multilib: "both", // default is "first" for binary
2681 multilib: {
2682 lib64: {
2683 suffix: "64",
2684 },
2685 },
2686 }
2687 `, withNativeBridgeEnabled)
2688 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2689 "bin/foo/bar/mybin",
2690 "bin/foo/bar/mybin64",
2691 "bin/arm/foo/bar/mybin",
2692 "bin/arm64/foo/bar/mybin64",
2693 "lib/foo/bar/mylib.so",
2694 "lib/arm/foo/bar/mylib.so",
2695 "lib64/foo/bar/mylib.so",
2696 "lib64/arm64/foo/bar/mylib.so",
2697 })
2698}
2699
Jooyung Han85d61762020-06-24 23:50:26 +09002700func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002701 result := android.GroupFixturePreparers(
2702 prepareForApexTest,
2703 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2704 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002705 apex {
2706 name: "myapex",
2707 key: "myapex.key",
2708 binaries: ["mybin"],
2709 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002710 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002711 }
2712 apex_key {
2713 name: "myapex.key",
2714 public_key: "testkey.avbpubkey",
2715 private_key: "testkey.pem",
2716 }
2717 cc_binary {
2718 name: "mybin",
2719 vendor: true,
2720 shared_libs: ["libfoo"],
2721 }
2722 cc_library {
2723 name: "libfoo",
2724 proprietary: true,
2725 }
2726 `)
2727
Colin Crossc68db4b2021-11-11 18:59:15 -08002728 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002729 "bin/mybin",
2730 "lib64/libfoo.so",
2731 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2732 "lib64/libc++.so",
2733 })
2734
Colin Crossc68db4b2021-11-11 18:59:15 -08002735 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2736 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002737 name := apexBundle.BaseModuleName()
2738 prefix := "TARGET_"
2739 var builder strings.Builder
2740 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002741 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002742 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002743 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002744
Colin Crossc68db4b2021-11-11 18:59:15 -08002745 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002746 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2747 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002748}
2749
Jooyung Hanc5a96762022-02-04 11:54:50 +09002750func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2751 testApexError(t, `Trying to include a VNDK library`, `
2752 apex {
2753 name: "myapex",
2754 key: "myapex.key",
2755 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2756 vendor: true,
2757 use_vndk_as_stable: true,
2758 updatable: false,
2759 }
2760 apex_key {
2761 name: "myapex.key",
2762 public_key: "testkey.avbpubkey",
2763 private_key: "testkey.pem",
2764 }`)
2765}
2766
Jooyung Handf78e212020-07-22 15:54:47 +09002767func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002768 // myapex myapex2
2769 // | |
2770 // mybin ------. mybin2
2771 // \ \ / |
2772 // (stable) .---\--------` |
2773 // \ / \ |
2774 // \ / \ /
2775 // libvndk libvendor
2776 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002777 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002778 apex {
2779 name: "myapex",
2780 key: "myapex.key",
2781 binaries: ["mybin"],
2782 vendor: true,
2783 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002784 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002785 }
2786 apex_key {
2787 name: "myapex.key",
2788 public_key: "testkey.avbpubkey",
2789 private_key: "testkey.pem",
2790 }
2791 cc_binary {
2792 name: "mybin",
2793 vendor: true,
2794 shared_libs: ["libvndk", "libvendor"],
2795 }
2796 cc_library {
2797 name: "libvndk",
2798 vndk: {
2799 enabled: true,
2800 },
2801 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002802 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002803 }
2804 cc_library {
2805 name: "libvendor",
2806 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002807 stl: "none",
2808 }
2809 apex {
2810 name: "myapex2",
2811 key: "myapex.key",
2812 binaries: ["mybin2"],
2813 vendor: true,
2814 use_vndk_as_stable: false,
2815 updatable: false,
2816 }
2817 cc_binary {
2818 name: "mybin2",
2819 vendor: true,
2820 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002821 }
2822 `)
2823
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002824 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002825
Jooyung Han91f92032022-02-04 12:36:33 +09002826 for _, tc := range []struct {
2827 name string
2828 apexName string
2829 moduleName string
2830 moduleVariant string
2831 libs []string
2832 contents []string
2833 requireVndkNamespace bool
2834 }{
2835 {
2836 name: "use_vndk_as_stable",
2837 apexName: "myapex",
2838 moduleName: "mybin",
2839 moduleVariant: vendorVariant + "_apex10000",
2840 libs: []string{
2841 // should link with vendor variants of VNDK libs(libvndk/libc++)
2842 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2843 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2844 // unstable Vendor libs as APEX variant
2845 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2846 },
2847 contents: []string{
2848 "bin/mybin",
2849 "lib64/libvendor.so",
2850 // VNDK libs (libvndk/libc++) are not included
2851 },
2852 requireVndkNamespace: true,
2853 },
2854 {
2855 name: "!use_vndk_as_stable",
2856 apexName: "myapex2",
2857 moduleName: "mybin2",
2858 moduleVariant: vendorVariant + "_myapex2",
2859 libs: []string{
2860 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2861 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2862 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2863 // unstable vendor libs have "merged" APEX variants
2864 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2865 },
2866 contents: []string{
2867 "bin/mybin2",
2868 "lib64/libvendor.so",
2869 // VNDK libs are included as well
2870 "lib64/libvndk.so",
2871 "lib64/libc++.so",
2872 },
2873 requireVndkNamespace: false,
2874 },
2875 } {
2876 t.Run(tc.name, func(t *testing.T) {
2877 // Check linked libs
2878 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2879 libs := names(ldRule.Args["libFlags"])
2880 for _, lib := range tc.libs {
2881 ensureListContains(t, libs, lib)
2882 }
2883 // Check apex contents
2884 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002885
Jooyung Han91f92032022-02-04 12:36:33 +09002886 // Check "requireNativeLibs"
2887 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2888 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2889 if tc.requireVndkNamespace {
2890 ensureListContains(t, requireNativeLibs, ":vndk")
2891 } else {
2892 ensureListNotContains(t, requireNativeLibs, ":vndk")
2893 }
2894 })
2895 }
Jooyung Handf78e212020-07-22 15:54:47 +09002896}
2897
Justin Yun13decfb2021-03-08 19:25:55 +09002898func TestProductVariant(t *testing.T) {
2899 ctx := testApex(t, `
2900 apex {
2901 name: "myapex",
2902 key: "myapex.key",
2903 updatable: false,
2904 product_specific: true,
2905 binaries: ["foo"],
2906 }
2907
2908 apex_key {
2909 name: "myapex.key",
2910 public_key: "testkey.avbpubkey",
2911 private_key: "testkey.pem",
2912 }
2913
2914 cc_binary {
2915 name: "foo",
2916 product_available: true,
2917 apex_available: ["myapex"],
2918 srcs: ["foo.cpp"],
2919 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002920 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2921 variables.ProductVndkVersion = proptools.StringPtr("current")
2922 }),
2923 )
Justin Yun13decfb2021-03-08 19:25:55 +09002924
2925 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002926 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002927 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2928 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2929 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2930 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2931}
2932
Jooyung Han8e5685d2020-09-21 11:02:57 +09002933func TestApex_withPrebuiltFirmware(t *testing.T) {
2934 testCases := []struct {
2935 name string
2936 additionalProp string
2937 }{
2938 {"system apex with prebuilt_firmware", ""},
2939 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2940 }
2941 for _, tc := range testCases {
2942 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002943 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002944 apex {
2945 name: "myapex",
2946 key: "myapex.key",
2947 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002948 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002949 `+tc.additionalProp+`
2950 }
2951 apex_key {
2952 name: "myapex.key",
2953 public_key: "testkey.avbpubkey",
2954 private_key: "testkey.pem",
2955 }
2956 prebuilt_firmware {
2957 name: "myfirmware",
2958 src: "myfirmware.bin",
2959 filename_from_src: true,
2960 `+tc.additionalProp+`
2961 }
2962 `)
2963 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2964 "etc/firmware/myfirmware.bin",
2965 })
2966 })
2967 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002968}
2969
Jooyung Hanefb184e2020-06-25 17:14:25 +09002970func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002971 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002972 apex {
2973 name: "myapex",
2974 key: "myapex.key",
2975 vendor: true,
2976 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002977 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002978 }
2979
2980 apex_key {
2981 name: "myapex.key",
2982 public_key: "testkey.avbpubkey",
2983 private_key: "testkey.pem",
2984 }
2985
2986 cc_library {
2987 name: "mylib",
2988 vendor_available: true,
2989 }
2990 `)
2991
2992 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002993 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002994 name := apexBundle.BaseModuleName()
2995 prefix := "TARGET_"
2996 var builder strings.Builder
2997 data.Custom(&builder, name, prefix, "", data)
2998 androidMk := builder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08002999 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003000}
3001
Jooyung Han2ed99d02020-06-24 23:26:26 +09003002func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003003 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003004 apex {
3005 name: "myapex",
3006 key: "myapex.key",
3007 vintf_fragments: ["fragment.xml"],
3008 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003009 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003010 }
3011 apex_key {
3012 name: "myapex.key",
3013 public_key: "testkey.avbpubkey",
3014 private_key: "testkey.pem",
3015 }
3016 cc_binary {
3017 name: "mybin",
3018 }
3019 `)
3020
3021 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003022 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003023 name := apexBundle.BaseModuleName()
3024 prefix := "TARGET_"
3025 var builder strings.Builder
3026 data.Custom(&builder, name, prefix, "", data)
3027 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003028 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003029 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003030}
3031
Jiyong Park16e91a02018-12-20 18:18:08 +09003032func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003033 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003034 apex {
3035 name: "myapex",
3036 key: "myapex.key",
3037 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003038 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003039 }
3040
3041 apex_key {
3042 name: "myapex.key",
3043 public_key: "testkey.avbpubkey",
3044 private_key: "testkey.pem",
3045 }
3046
3047 cc_library {
3048 name: "mylib",
3049 srcs: ["mylib.cpp"],
3050 system_shared_libs: [],
3051 stl: "none",
3052 stubs: {
3053 versions: ["1", "2", "3"],
3054 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003055 apex_available: [
3056 "//apex_available:platform",
3057 "myapex",
3058 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003059 }
3060
3061 cc_binary {
3062 name: "not_in_apex",
3063 srcs: ["mylib.cpp"],
3064 static_libs: ["mylib"],
3065 static_executable: true,
3066 system_shared_libs: [],
3067 stl: "none",
3068 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003069 `)
3070
Colin Cross7113d202019-11-20 16:39:12 -08003071 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003072
3073 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003074 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003075}
Jiyong Park9335a262018-12-24 11:31:58 +09003076
3077func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003078 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003079 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003080 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003081 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003082 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003083 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003084 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003085 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003086 }
3087
3088 cc_library {
3089 name: "mylib",
3090 srcs: ["mylib.cpp"],
3091 system_shared_libs: [],
3092 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003093 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003094 }
3095
3096 apex_key {
3097 name: "myapex.key",
3098 public_key: "testkey.avbpubkey",
3099 private_key: "testkey.pem",
3100 }
3101
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003102 android_app_certificate {
3103 name: "myapex.certificate",
3104 certificate: "testkey",
3105 }
3106
3107 android_app_certificate {
3108 name: "myapex.certificate.override",
3109 certificate: "testkey.override",
3110 }
3111
Jiyong Park9335a262018-12-24 11:31:58 +09003112 `)
3113
3114 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003115 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003116
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003117 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3118 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003119 "vendor/foo/devkeys/testkey.avbpubkey")
3120 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003121 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3122 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003123 "vendor/foo/devkeys/testkey.pem")
3124 }
3125
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003126 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003127 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003128 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003129 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003130 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003131 }
3132}
Jiyong Park58e364a2019-01-19 19:24:06 +09003133
Jooyung Hanf121a652019-12-17 14:30:11 +09003134func TestCertificate(t *testing.T) {
3135 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003136 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003137 apex {
3138 name: "myapex",
3139 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003140 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003141 }
3142 apex_key {
3143 name: "myapex.key",
3144 public_key: "testkey.avbpubkey",
3145 private_key: "testkey.pem",
3146 }`)
3147 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3148 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3149 if actual := rule.Args["certificates"]; actual != expected {
3150 t.Errorf("certificates should be %q, not %q", expected, actual)
3151 }
3152 })
3153 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003154 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003155 apex {
3156 name: "myapex_keytest",
3157 key: "myapex.key",
3158 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003159 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003160 }
3161 apex_key {
3162 name: "myapex.key",
3163 public_key: "testkey.avbpubkey",
3164 private_key: "testkey.pem",
3165 }
3166 android_app_certificate {
3167 name: "myapex.certificate.override",
3168 certificate: "testkey.override",
3169 }`)
3170 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3171 expected := "testkey.override.x509.pem testkey.override.pk8"
3172 if actual := rule.Args["certificates"]; actual != expected {
3173 t.Errorf("certificates should be %q, not %q", expected, actual)
3174 }
3175 })
3176 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003177 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003178 apex {
3179 name: "myapex",
3180 key: "myapex.key",
3181 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003182 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003183 }
3184 apex_key {
3185 name: "myapex.key",
3186 public_key: "testkey.avbpubkey",
3187 private_key: "testkey.pem",
3188 }
3189 android_app_certificate {
3190 name: "myapex.certificate",
3191 certificate: "testkey",
3192 }`)
3193 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3194 expected := "testkey.x509.pem testkey.pk8"
3195 if actual := rule.Args["certificates"]; actual != expected {
3196 t.Errorf("certificates should be %q, not %q", expected, actual)
3197 }
3198 })
3199 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003200 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003201 apex {
3202 name: "myapex_keytest",
3203 key: "myapex.key",
3204 file_contexts: ":myapex-file_contexts",
3205 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003206 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003207 }
3208 apex_key {
3209 name: "myapex.key",
3210 public_key: "testkey.avbpubkey",
3211 private_key: "testkey.pem",
3212 }
3213 android_app_certificate {
3214 name: "myapex.certificate.override",
3215 certificate: "testkey.override",
3216 }`)
3217 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3218 expected := "testkey.override.x509.pem testkey.override.pk8"
3219 if actual := rule.Args["certificates"]; actual != expected {
3220 t.Errorf("certificates should be %q, not %q", expected, actual)
3221 }
3222 })
3223 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003224 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003225 apex {
3226 name: "myapex",
3227 key: "myapex.key",
3228 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003229 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003230 }
3231 apex_key {
3232 name: "myapex.key",
3233 public_key: "testkey.avbpubkey",
3234 private_key: "testkey.pem",
3235 }`)
3236 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3237 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3238 if actual := rule.Args["certificates"]; actual != expected {
3239 t.Errorf("certificates should be %q, not %q", expected, actual)
3240 }
3241 })
3242 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003243 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003244 apex {
3245 name: "myapex_keytest",
3246 key: "myapex.key",
3247 file_contexts: ":myapex-file_contexts",
3248 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003249 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003250 }
3251 apex_key {
3252 name: "myapex.key",
3253 public_key: "testkey.avbpubkey",
3254 private_key: "testkey.pem",
3255 }
3256 android_app_certificate {
3257 name: "myapex.certificate.override",
3258 certificate: "testkey.override",
3259 }`)
3260 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3261 expected := "testkey.override.x509.pem testkey.override.pk8"
3262 if actual := rule.Args["certificates"]; actual != expected {
3263 t.Errorf("certificates should be %q, not %q", expected, actual)
3264 }
3265 })
3266}
3267
Jiyong Park58e364a2019-01-19 19:24:06 +09003268func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003269 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003270 apex {
3271 name: "myapex",
3272 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003273 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003274 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003275 }
3276
3277 apex {
3278 name: "otherapex",
3279 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003280 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003281 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003282 }
3283
3284 apex_key {
3285 name: "myapex.key",
3286 public_key: "testkey.avbpubkey",
3287 private_key: "testkey.pem",
3288 }
3289
3290 cc_library {
3291 name: "mylib",
3292 srcs: ["mylib.cpp"],
3293 system_shared_libs: [],
3294 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003295 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003296 "myapex",
3297 "otherapex",
3298 ],
Jooyung Han24282772020-03-21 23:20:55 +09003299 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003300 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003301 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003302 cc_library {
3303 name: "mylib2",
3304 srcs: ["mylib.cpp"],
3305 system_shared_libs: [],
3306 stl: "none",
3307 apex_available: [
3308 "myapex",
3309 "otherapex",
3310 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003311 static_libs: ["mylib3"],
3312 recovery_available: true,
3313 min_sdk_version: "29",
3314 }
3315 cc_library {
3316 name: "mylib3",
3317 srcs: ["mylib.cpp"],
3318 system_shared_libs: [],
3319 stl: "none",
3320 apex_available: [
3321 "myapex",
3322 "otherapex",
3323 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003324 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003325 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003326 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003327 `)
3328
Jooyung Hanc87a0592020-03-02 17:44:33 +09003329 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003330 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003331 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003332 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003333
Jooyung Hanccce2f22020-03-07 03:45:53 +09003334 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003335 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003336 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003337 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003338
Jooyung Hanccce2f22020-03-07 03:45:53 +09003339 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003340 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003341 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003342 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003343
Colin Crossaede88c2020-08-11 12:17:01 -07003344 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3345 // each variant defines additional macros to distinguish which apex variant it is built for
3346
3347 // non-APEX variant does not have __ANDROID_APEX__ defined
3348 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3349 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3350
Dan Albertb19953d2020-11-17 15:29:36 -08003351 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003352 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3353 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003354 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003355
Jooyung Hanc87a0592020-03-02 17:44:33 +09003356 // non-APEX variant does not have __ANDROID_APEX__ defined
3357 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3358 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3359
Dan Albertb19953d2020-11-17 15:29:36 -08003360 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003361 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003362 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003363 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003364}
Jiyong Park7e636d02019-01-28 16:16:54 +09003365
3366func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003367 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003368 apex {
3369 name: "myapex",
3370 key: "myapex.key",
3371 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003372 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003373 }
3374
3375 apex_key {
3376 name: "myapex.key",
3377 public_key: "testkey.avbpubkey",
3378 private_key: "testkey.pem",
3379 }
3380
3381 cc_library_headers {
3382 name: "mylib_headers",
3383 export_include_dirs: ["my_include"],
3384 system_shared_libs: [],
3385 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003386 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003387 }
3388
3389 cc_library {
3390 name: "mylib",
3391 srcs: ["mylib.cpp"],
3392 system_shared_libs: [],
3393 stl: "none",
3394 header_libs: ["mylib_headers"],
3395 export_header_lib_headers: ["mylib_headers"],
3396 stubs: {
3397 versions: ["1", "2", "3"],
3398 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003399 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003400 }
3401
3402 cc_library {
3403 name: "otherlib",
3404 srcs: ["mylib.cpp"],
3405 system_shared_libs: [],
3406 stl: "none",
3407 shared_libs: ["mylib"],
3408 }
3409 `)
3410
Colin Cross7113d202019-11-20 16:39:12 -08003411 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003412
3413 // Ensure that the include path of the header lib is exported to 'otherlib'
3414 ensureContains(t, cFlags, "-Imy_include")
3415}
Alex Light9670d332019-01-29 18:07:33 -08003416
Jiyong Park7cd10e32020-01-14 09:22:18 +09003417type fileInApex struct {
3418 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003419 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003420 isLink bool
3421}
3422
Jooyung Hana57af4a2020-01-23 05:36:59 +00003423func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003424 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003425 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003426 copyCmds := apexRule.Args["copy_commands"]
3427 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003428 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003429 for _, cmd := range strings.Split(copyCmds, "&&") {
3430 cmd = strings.TrimSpace(cmd)
3431 if cmd == "" {
3432 continue
3433 }
3434 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003435 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003436 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003437 switch terms[0] {
3438 case "mkdir":
3439 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003440 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003441 t.Fatal("copyCmds contains invalid cp command", cmd)
3442 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003443 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003444 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003445 isLink = false
3446 case "ln":
3447 if len(terms) != 3 && len(terms) != 4 {
3448 // ln LINK TARGET or ln -s LINK TARGET
3449 t.Fatal("copyCmds contains invalid ln command", cmd)
3450 }
3451 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003452 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003453 isLink = true
3454 default:
3455 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3456 }
3457 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003458 index := strings.Index(dst, imageApexDir)
3459 if index == -1 {
3460 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3461 }
3462 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003463 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003464 }
3465 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003466 return ret
3467}
3468
Jooyung Hana57af4a2020-01-23 05:36:59 +00003469func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3470 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003471 var failed bool
3472 var surplus []string
3473 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003474 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003475 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003476 for _, expected := range files {
3477 if matched, _ := path.Match(expected, file.path); matched {
3478 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003479 mactchFound = true
3480 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003481 }
3482 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003483 if !mactchFound {
3484 surplus = append(surplus, file.path)
3485 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003486 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003487
Jooyung Han31c470b2019-10-18 16:26:59 +09003488 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003489 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003490 t.Log("surplus files", surplus)
3491 failed = true
3492 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003493
3494 if len(files) > len(filesMatched) {
3495 var missing []string
3496 for _, expected := range files {
3497 if !filesMatched[expected] {
3498 missing = append(missing, expected)
3499 }
3500 }
3501 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003502 t.Log("missing files", missing)
3503 failed = true
3504 }
3505 if failed {
3506 t.Fail()
3507 }
3508}
3509
Jooyung Han344d5432019-08-23 11:17:39 +09003510func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003511 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003512 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003513 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003514 "etc/llndk.libraries.29.txt",
3515 "etc/vndkcore.libraries.29.txt",
3516 "etc/vndksp.libraries.29.txt",
3517 "etc/vndkprivate.libraries.29.txt",
3518 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003519 }
3520 testCases := []struct {
3521 vndkVersion string
3522 expectedFiles []string
3523 }{
3524 {
3525 vndkVersion: "current",
3526 expectedFiles: append(commonFiles,
3527 "lib/libvndk.so",
3528 "lib/libvndksp.so",
3529 "lib64/libvndk.so",
3530 "lib64/libvndksp.so"),
3531 },
3532 {
3533 vndkVersion: "",
3534 expectedFiles: append(commonFiles,
3535 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3536 "lib/libvndksp.so",
3537 "lib64/libvndksp.so"),
3538 },
3539 }
3540 for _, tc := range testCases {
3541 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3542 ctx := testApex(t, `
3543 apex_vndk {
3544 name: "com.android.vndk.current",
3545 key: "com.android.vndk.current.key",
3546 updatable: false,
3547 }
3548
3549 apex_key {
3550 name: "com.android.vndk.current.key",
3551 public_key: "testkey.avbpubkey",
3552 private_key: "testkey.pem",
3553 }
3554
3555 cc_library {
3556 name: "libvndk",
3557 srcs: ["mylib.cpp"],
3558 vendor_available: true,
3559 product_available: true,
3560 vndk: {
3561 enabled: true,
3562 },
3563 system_shared_libs: [],
3564 stl: "none",
3565 apex_available: [ "com.android.vndk.current" ],
3566 }
3567
3568 cc_library {
3569 name: "libvndksp",
3570 srcs: ["mylib.cpp"],
3571 vendor_available: true,
3572 product_available: true,
3573 vndk: {
3574 enabled: true,
3575 support_system_process: true,
3576 },
3577 system_shared_libs: [],
3578 stl: "none",
3579 apex_available: [ "com.android.vndk.current" ],
3580 }
3581
3582 // VNDK-Ext should not cause any problems
3583
3584 cc_library {
3585 name: "libvndk.ext",
3586 srcs: ["mylib2.cpp"],
3587 vendor: true,
3588 vndk: {
3589 enabled: true,
3590 extends: "libvndk",
3591 },
3592 system_shared_libs: [],
3593 stl: "none",
3594 }
3595
3596 cc_library {
3597 name: "libvndksp.ext",
3598 srcs: ["mylib2.cpp"],
3599 vendor: true,
3600 vndk: {
3601 enabled: true,
3602 support_system_process: true,
3603 extends: "libvndksp",
3604 },
3605 system_shared_libs: [],
3606 stl: "none",
3607 }
3608 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3609 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3610 }))
3611 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3612 })
3613 }
Jooyung Han344d5432019-08-23 11:17:39 +09003614}
3615
3616func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003617 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003618 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003619 name: "com.android.vndk.current",
3620 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003621 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003622 }
3623
3624 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003625 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003626 public_key: "testkey.avbpubkey",
3627 private_key: "testkey.pem",
3628 }
3629
3630 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003631 name: "libvndk",
3632 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003633 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003634 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003635 vndk: {
3636 enabled: true,
3637 },
3638 system_shared_libs: [],
3639 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003640 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003641 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003642
3643 cc_prebuilt_library_shared {
3644 name: "libvndk.arm",
3645 srcs: ["libvndk.arm.so"],
3646 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003647 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003648 vndk: {
3649 enabled: true,
3650 },
3651 enabled: false,
3652 arch: {
3653 arm: {
3654 enabled: true,
3655 },
3656 },
3657 system_shared_libs: [],
3658 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003659 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003660 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003661 `+vndkLibrariesTxtFiles("current"),
3662 withFiles(map[string][]byte{
3663 "libvndk.so": nil,
3664 "libvndk.arm.so": nil,
3665 }))
Colin Cross2807f002021-03-02 10:15:29 -08003666 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003667 "lib/libvndk.so",
3668 "lib/libvndk.arm.so",
3669 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003670 "lib/libc++.so",
3671 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003672 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003673 })
Jooyung Han344d5432019-08-23 11:17:39 +09003674}
3675
Jooyung Han39edb6c2019-11-06 16:53:07 +09003676func vndkLibrariesTxtFiles(vers ...string) (result string) {
3677 for _, v := range vers {
3678 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003679 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003680 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003681 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003682 name: "` + txt + `.libraries.txt",
3683 }
3684 `
3685 }
3686 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003687 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003688 result += `
3689 prebuilt_etc {
3690 name: "` + txt + `.libraries.` + v + `.txt",
3691 src: "dummy.txt",
3692 }
3693 `
3694 }
3695 }
3696 }
3697 return
3698}
3699
Jooyung Han344d5432019-08-23 11:17:39 +09003700func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003701 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003702 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003703 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003704 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003705 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003706 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003707 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003708 }
3709
3710 apex_key {
3711 name: "myapex.key",
3712 public_key: "testkey.avbpubkey",
3713 private_key: "testkey.pem",
3714 }
3715
Jooyung Han31c470b2019-10-18 16:26:59 +09003716 vndk_prebuilt_shared {
3717 name: "libvndk27",
3718 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003719 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003720 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003721 vndk: {
3722 enabled: true,
3723 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003724 target_arch: "arm64",
3725 arch: {
3726 arm: {
3727 srcs: ["libvndk27_arm.so"],
3728 },
3729 arm64: {
3730 srcs: ["libvndk27_arm64.so"],
3731 },
3732 },
Colin Cross2807f002021-03-02 10:15:29 -08003733 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003734 }
3735
3736 vndk_prebuilt_shared {
3737 name: "libvndk27",
3738 version: "27",
3739 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003740 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003741 vndk: {
3742 enabled: true,
3743 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003744 target_arch: "x86_64",
3745 arch: {
3746 x86: {
3747 srcs: ["libvndk27_x86.so"],
3748 },
3749 x86_64: {
3750 srcs: ["libvndk27_x86_64.so"],
3751 },
3752 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003753 }
3754 `+vndkLibrariesTxtFiles("27"),
3755 withFiles(map[string][]byte{
3756 "libvndk27_arm.so": nil,
3757 "libvndk27_arm64.so": nil,
3758 "libvndk27_x86.so": nil,
3759 "libvndk27_x86_64.so": nil,
3760 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003761
Colin Cross2807f002021-03-02 10:15:29 -08003762 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003763 "lib/libvndk27_arm.so",
3764 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003765 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003766 })
Jooyung Han344d5432019-08-23 11:17:39 +09003767}
3768
Jooyung Han90eee022019-10-01 20:02:42 +09003769func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003770 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003771 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003772 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003773 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003774 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003775 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003776 }
3777 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003778 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003779 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003780 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003781 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003782 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003783 }
3784 apex_key {
3785 name: "myapex.key",
3786 public_key: "testkey.avbpubkey",
3787 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003788 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003789
3790 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003791 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003792 actual := proptools.String(bundle.properties.Apex_name)
3793 if !reflect.DeepEqual(actual, expected) {
3794 t.Errorf("Got '%v', expected '%v'", actual, expected)
3795 }
3796 }
3797
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003798 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003799 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003800}
3801
Jooyung Han344d5432019-08-23 11:17:39 +09003802func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003803 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003804 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003805 name: "com.android.vndk.current",
3806 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003807 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003808 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003809 }
3810
3811 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003812 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003813 public_key: "testkey.avbpubkey",
3814 private_key: "testkey.pem",
3815 }
3816
3817 cc_library {
3818 name: "libvndk",
3819 srcs: ["mylib.cpp"],
3820 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003821 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003822 native_bridge_supported: true,
3823 host_supported: true,
3824 vndk: {
3825 enabled: true,
3826 },
3827 system_shared_libs: [],
3828 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003829 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003830 }
Colin Cross2807f002021-03-02 10:15:29 -08003831 `+vndkLibrariesTxtFiles("current"),
3832 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003833
Colin Cross2807f002021-03-02 10:15:29 -08003834 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003835 "lib/libvndk.so",
3836 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003837 "lib/libc++.so",
3838 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003839 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003840 })
Jooyung Han344d5432019-08-23 11:17:39 +09003841}
3842
3843func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003844 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003845 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003846 name: "com.android.vndk.current",
3847 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003848 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003849 native_bridge_supported: true,
3850 }
3851
3852 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003853 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003854 public_key: "testkey.avbpubkey",
3855 private_key: "testkey.pem",
3856 }
3857
3858 cc_library {
3859 name: "libvndk",
3860 srcs: ["mylib.cpp"],
3861 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003862 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003863 native_bridge_supported: true,
3864 host_supported: true,
3865 vndk: {
3866 enabled: true,
3867 },
3868 system_shared_libs: [],
3869 stl: "none",
3870 }
3871 `)
3872}
3873
Jooyung Han31c470b2019-10-18 16:26:59 +09003874func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003875 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003876 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003877 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003878 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003879 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003880 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003881 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003882 }
3883
3884 apex_key {
3885 name: "myapex.key",
3886 public_key: "testkey.avbpubkey",
3887 private_key: "testkey.pem",
3888 }
3889
3890 vndk_prebuilt_shared {
3891 name: "libvndk27",
3892 version: "27",
3893 target_arch: "arm",
3894 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003895 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003896 vndk: {
3897 enabled: true,
3898 },
3899 arch: {
3900 arm: {
3901 srcs: ["libvndk27.so"],
3902 }
3903 },
3904 }
3905
3906 vndk_prebuilt_shared {
3907 name: "libvndk27",
3908 version: "27",
3909 target_arch: "arm",
3910 binder32bit: true,
3911 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003912 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003913 vndk: {
3914 enabled: true,
3915 },
3916 arch: {
3917 arm: {
3918 srcs: ["libvndk27binder32.so"],
3919 }
3920 },
Colin Cross2807f002021-03-02 10:15:29 -08003921 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003922 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003923 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003924 withFiles(map[string][]byte{
3925 "libvndk27.so": nil,
3926 "libvndk27binder32.so": nil,
3927 }),
3928 withBinder32bit,
3929 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003930 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003931 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3932 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003933 },
3934 }),
3935 )
3936
Colin Cross2807f002021-03-02 10:15:29 -08003937 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003938 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003939 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003940 })
3941}
3942
Jooyung Han45a96772020-06-15 14:59:42 +09003943func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003944 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003945 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003946 name: "com.android.vndk.current",
3947 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003948 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003949 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003950 }
3951
3952 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003953 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003954 public_key: "testkey.avbpubkey",
3955 private_key: "testkey.pem",
3956 }
3957
3958 cc_library {
3959 name: "libz",
3960 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003961 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003962 vndk: {
3963 enabled: true,
3964 },
3965 stubs: {
3966 symbol_file: "libz.map.txt",
3967 versions: ["30"],
3968 }
3969 }
3970 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3971 "libz.map.txt": nil,
3972 }))
3973
Colin Cross2807f002021-03-02 10:15:29 -08003974 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003975 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3976 ensureListEmpty(t, provideNativeLibs)
3977}
3978
Jooyung Hane1633032019-08-01 17:41:43 +09003979func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003980 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003981 apex {
3982 name: "myapex_nodep",
3983 key: "myapex.key",
3984 native_shared_libs: ["lib_nodep"],
3985 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003986 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003987 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003988 }
3989
3990 apex {
3991 name: "myapex_dep",
3992 key: "myapex.key",
3993 native_shared_libs: ["lib_dep"],
3994 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003995 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003996 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003997 }
3998
3999 apex {
4000 name: "myapex_provider",
4001 key: "myapex.key",
4002 native_shared_libs: ["libfoo"],
4003 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004004 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004005 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004006 }
4007
4008 apex {
4009 name: "myapex_selfcontained",
4010 key: "myapex.key",
4011 native_shared_libs: ["lib_dep", "libfoo"],
4012 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004013 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004014 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004015 }
4016
4017 apex_key {
4018 name: "myapex.key",
4019 public_key: "testkey.avbpubkey",
4020 private_key: "testkey.pem",
4021 }
4022
4023 cc_library {
4024 name: "lib_nodep",
4025 srcs: ["mylib.cpp"],
4026 system_shared_libs: [],
4027 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004028 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004029 }
4030
4031 cc_library {
4032 name: "lib_dep",
4033 srcs: ["mylib.cpp"],
4034 shared_libs: ["libfoo"],
4035 system_shared_libs: [],
4036 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004037 apex_available: [
4038 "myapex_dep",
4039 "myapex_provider",
4040 "myapex_selfcontained",
4041 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004042 }
4043
4044 cc_library {
4045 name: "libfoo",
4046 srcs: ["mytest.cpp"],
4047 stubs: {
4048 versions: ["1"],
4049 },
4050 system_shared_libs: [],
4051 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004052 apex_available: [
4053 "myapex_provider",
4054 "myapex_selfcontained",
4055 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004056 }
4057 `)
4058
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004059 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004060 var provideNativeLibs, requireNativeLibs []string
4061
Sundong Ahnabb64432019-10-22 13:58:29 +09004062 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004063 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4064 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004065 ensureListEmpty(t, provideNativeLibs)
4066 ensureListEmpty(t, requireNativeLibs)
4067
Sundong Ahnabb64432019-10-22 13:58:29 +09004068 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004069 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4070 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004071 ensureListEmpty(t, provideNativeLibs)
4072 ensureListContains(t, requireNativeLibs, "libfoo.so")
4073
Sundong Ahnabb64432019-10-22 13:58:29 +09004074 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004075 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4076 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004077 ensureListContains(t, provideNativeLibs, "libfoo.so")
4078 ensureListEmpty(t, requireNativeLibs)
4079
Sundong Ahnabb64432019-10-22 13:58:29 +09004080 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004081 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4082 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004083 ensureListContains(t, provideNativeLibs, "libfoo.so")
4084 ensureListEmpty(t, requireNativeLibs)
4085}
4086
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004087func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004088 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004089 apex {
4090 name: "myapex",
4091 key: "myapex.key",
4092 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09004093 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004094 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004095 }
4096
4097 apex_key {
4098 name: "myapex.key",
4099 public_key: "testkey.avbpubkey",
4100 private_key: "testkey.pem",
4101 }
Jiyong Parkdb334862020-02-05 17:19:28 +09004102
4103 cc_library {
4104 name: "mylib",
4105 srcs: ["mylib.cpp"],
4106 system_shared_libs: [],
4107 stl: "none",
4108 apex_available: [
4109 "//apex_available:platform",
4110 "myapex",
4111 ],
4112 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004113 `)
4114
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004115 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004116 apexManifestRule := module.Rule("apexManifestRule")
4117 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4118 apexRule := module.Rule("apexRule")
4119 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004120
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004121 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004122 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004123 name := apexBundle.BaseModuleName()
4124 prefix := "TARGET_"
4125 var builder strings.Builder
4126 data.Custom(&builder, name, prefix, "", data)
4127 androidMk := builder.String()
Prerana Patilb1896c82022-11-09 18:14:34 +00004128 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Parkdb334862020-02-05 17:19:28 +09004129 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004130}
4131
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004132func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4133 ctx := testApex(t, `
4134 apex {
4135 name: "myapex",
4136 key: "myapex.key",
4137 apex_name: "com.android.myapex",
4138 native_shared_libs: ["mylib"],
4139 updatable: false,
4140 }
4141
4142 apex_key {
4143 name: "myapex.key",
4144 public_key: "testkey.avbpubkey",
4145 private_key: "testkey.pem",
4146 }
4147
4148 cc_library {
4149 name: "mylib",
4150 srcs: ["mylib.cpp"],
4151 system_shared_libs: [],
4152 stl: "none",
4153 apex_available: [
4154 "//apex_available:platform",
4155 "myapex",
4156 ],
4157 }
4158 `, android.FixtureMergeEnv(map[string]string{
4159 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4160 }))
4161
4162 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
4163 apexManifestRule := module.Rule("apexManifestRule")
4164 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4165}
4166
Vinh Tran8f5310f2022-10-07 18:16:47 -04004167func TestCompileMultilibProp(t *testing.T) {
4168 testCases := []struct {
4169 compileMultiLibProp string
4170 containedLibs []string
4171 notContainedLibs []string
4172 }{
4173 {
4174 containedLibs: []string{
4175 "image.apex/lib64/mylib.so",
4176 "image.apex/lib/mylib.so",
4177 },
4178 compileMultiLibProp: `compile_multilib: "both",`,
4179 },
4180 {
4181 containedLibs: []string{"image.apex/lib64/mylib.so"},
4182 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4183 compileMultiLibProp: `compile_multilib: "first",`,
4184 },
4185 {
4186 containedLibs: []string{"image.apex/lib64/mylib.so"},
4187 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4188 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4189 },
4190 {
4191 containedLibs: []string{"image.apex/lib64/mylib.so"},
4192 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4193 compileMultiLibProp: `compile_multilib: "64",`,
4194 },
4195 {
4196 containedLibs: []string{"image.apex/lib/mylib.so"},
4197 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4198 compileMultiLibProp: `compile_multilib: "32",`,
4199 },
4200 }
4201 for _, testCase := range testCases {
4202 ctx := testApex(t, fmt.Sprintf(`
4203 apex {
4204 name: "myapex",
4205 key: "myapex.key",
4206 %s
4207 native_shared_libs: ["mylib"],
4208 updatable: false,
4209 }
4210 apex_key {
4211 name: "myapex.key",
4212 public_key: "testkey.avbpubkey",
4213 private_key: "testkey.pem",
4214 }
4215 cc_library {
4216 name: "mylib",
4217 srcs: ["mylib.cpp"],
4218 apex_available: [
4219 "//apex_available:platform",
4220 "myapex",
4221 ],
4222 }
4223 `, testCase.compileMultiLibProp),
4224 )
4225 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4226 apexRule := module.Rule("apexRule")
4227 copyCmds := apexRule.Args["copy_commands"]
4228 for _, containedLib := range testCase.containedLibs {
4229 ensureContains(t, copyCmds, containedLib)
4230 }
4231 for _, notContainedLib := range testCase.notContainedLibs {
4232 ensureNotContains(t, copyCmds, notContainedLib)
4233 }
4234 }
4235}
4236
Alex Light0851b882019-02-07 13:20:53 -08004237func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004238 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004239 apex {
4240 name: "myapex",
4241 key: "myapex.key",
4242 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004243 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004244 }
4245
4246 apex_key {
4247 name: "myapex.key",
4248 public_key: "testkey.avbpubkey",
4249 private_key: "testkey.pem",
4250 }
4251
4252 cc_library {
4253 name: "mylib_common",
4254 srcs: ["mylib.cpp"],
4255 system_shared_libs: [],
4256 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004257 apex_available: [
4258 "//apex_available:platform",
4259 "myapex",
4260 ],
Alex Light0851b882019-02-07 13:20:53 -08004261 }
4262 `)
4263
Sundong Ahnabb64432019-10-22 13:58:29 +09004264 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004265 apexRule := module.Rule("apexRule")
4266 copyCmds := apexRule.Args["copy_commands"]
4267
4268 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4269 t.Log("Apex was a test apex!")
4270 t.Fail()
4271 }
4272 // Ensure that main rule creates an output
4273 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4274
4275 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004276 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004277
4278 // Ensure that both direct and indirect deps are copied into apex
4279 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4280
Colin Cross7113d202019-11-20 16:39:12 -08004281 // Ensure that the platform variant ends with _shared
4282 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004283
Colin Cross56a83212020-09-15 18:30:11 -07004284 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004285 t.Log("Found mylib_common not in any apex!")
4286 t.Fail()
4287 }
4288}
4289
4290func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004291 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004292 apex_test {
4293 name: "myapex",
4294 key: "myapex.key",
4295 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004296 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004297 }
4298
4299 apex_key {
4300 name: "myapex.key",
4301 public_key: "testkey.avbpubkey",
4302 private_key: "testkey.pem",
4303 }
4304
4305 cc_library {
4306 name: "mylib_common_test",
4307 srcs: ["mylib.cpp"],
4308 system_shared_libs: [],
4309 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004310 // TODO: remove //apex_available:platform
4311 apex_available: [
4312 "//apex_available:platform",
4313 "myapex",
4314 ],
Alex Light0851b882019-02-07 13:20:53 -08004315 }
4316 `)
4317
Sundong Ahnabb64432019-10-22 13:58:29 +09004318 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004319 apexRule := module.Rule("apexRule")
4320 copyCmds := apexRule.Args["copy_commands"]
4321
4322 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4323 t.Log("Apex was not a test apex!")
4324 t.Fail()
4325 }
4326 // Ensure that main rule creates an output
4327 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4328
4329 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004330 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004331
4332 // Ensure that both direct and indirect deps are copied into apex
4333 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4334
Colin Cross7113d202019-11-20 16:39:12 -08004335 // Ensure that the platform variant ends with _shared
4336 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004337}
4338
Alex Light9670d332019-01-29 18:07:33 -08004339func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004340 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004341 apex {
4342 name: "myapex",
4343 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004344 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004345 multilib: {
4346 first: {
4347 native_shared_libs: ["mylib_common"],
4348 }
4349 },
4350 target: {
4351 android: {
4352 multilib: {
4353 first: {
4354 native_shared_libs: ["mylib"],
4355 }
4356 }
4357 },
4358 host: {
4359 multilib: {
4360 first: {
4361 native_shared_libs: ["mylib2"],
4362 }
4363 }
4364 }
4365 }
4366 }
4367
4368 apex_key {
4369 name: "myapex.key",
4370 public_key: "testkey.avbpubkey",
4371 private_key: "testkey.pem",
4372 }
4373
4374 cc_library {
4375 name: "mylib",
4376 srcs: ["mylib.cpp"],
4377 system_shared_libs: [],
4378 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004379 // TODO: remove //apex_available:platform
4380 apex_available: [
4381 "//apex_available:platform",
4382 "myapex",
4383 ],
Alex Light9670d332019-01-29 18:07:33 -08004384 }
4385
4386 cc_library {
4387 name: "mylib_common",
4388 srcs: ["mylib.cpp"],
4389 system_shared_libs: [],
4390 stl: "none",
4391 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004392 // TODO: remove //apex_available:platform
4393 apex_available: [
4394 "//apex_available:platform",
4395 "myapex",
4396 ],
Alex Light9670d332019-01-29 18:07:33 -08004397 }
4398
4399 cc_library {
4400 name: "mylib2",
4401 srcs: ["mylib.cpp"],
4402 system_shared_libs: [],
4403 stl: "none",
4404 compile_multilib: "first",
4405 }
4406 `)
4407
Sundong Ahnabb64432019-10-22 13:58:29 +09004408 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004409 copyCmds := apexRule.Args["copy_commands"]
4410
4411 // Ensure that main rule creates an output
4412 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4413
4414 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004415 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4416 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4417 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004418
4419 // Ensure that both direct and indirect deps are copied into apex
4420 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4421 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4422 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4423
Colin Cross7113d202019-11-20 16:39:12 -08004424 // Ensure that the platform variant ends with _shared
4425 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4426 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4427 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004428}
Jiyong Park04480cf2019-02-06 00:16:29 +09004429
Jiyong Park59140302020-12-14 18:44:04 +09004430func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004431 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004432 apex {
4433 name: "myapex",
4434 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004435 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004436 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004437 arch: {
4438 arm64: {
4439 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004440 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004441 },
4442 x86_64: {
4443 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004444 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004445 },
4446 }
4447 }
4448
4449 apex_key {
4450 name: "myapex.key",
4451 public_key: "testkey.avbpubkey",
4452 private_key: "testkey.pem",
4453 }
4454
4455 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004456 name: "mylib.generic",
4457 srcs: ["mylib.cpp"],
4458 system_shared_libs: [],
4459 stl: "none",
4460 // TODO: remove //apex_available:platform
4461 apex_available: [
4462 "//apex_available:platform",
4463 "myapex",
4464 ],
4465 }
4466
4467 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004468 name: "mylib.arm64",
4469 srcs: ["mylib.cpp"],
4470 system_shared_libs: [],
4471 stl: "none",
4472 // TODO: remove //apex_available:platform
4473 apex_available: [
4474 "//apex_available:platform",
4475 "myapex",
4476 ],
4477 }
4478
4479 cc_library {
4480 name: "mylib.x64",
4481 srcs: ["mylib.cpp"],
4482 system_shared_libs: [],
4483 stl: "none",
4484 // TODO: remove //apex_available:platform
4485 apex_available: [
4486 "//apex_available:platform",
4487 "myapex",
4488 ],
4489 }
4490 `)
4491
4492 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4493 copyCmds := apexRule.Args["copy_commands"]
4494
4495 // Ensure that apex variant is created for the direct dep
4496 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004497 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004498 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4499
4500 // Ensure that both direct and indirect deps are copied into apex
4501 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4502 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4503}
4504
Jiyong Park04480cf2019-02-06 00:16:29 +09004505func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004506 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004507 apex {
4508 name: "myapex",
4509 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004510 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004511 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004512 }
4513
4514 apex_key {
4515 name: "myapex.key",
4516 public_key: "testkey.avbpubkey",
4517 private_key: "testkey.pem",
4518 }
4519
4520 sh_binary {
4521 name: "myscript",
4522 src: "mylib.cpp",
4523 filename: "myscript.sh",
4524 sub_dir: "script",
4525 }
4526 `)
4527
Sundong Ahnabb64432019-10-22 13:58:29 +09004528 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004529 copyCmds := apexRule.Args["copy_commands"]
4530
4531 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4532}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004533
Jooyung Han91df2082019-11-20 01:49:42 +09004534func TestApexInVariousPartition(t *testing.T) {
4535 testcases := []struct {
4536 propName, parition, flattenedPartition string
4537 }{
4538 {"", "system", "system_ext"},
4539 {"product_specific: true", "product", "product"},
4540 {"soc_specific: true", "vendor", "vendor"},
4541 {"proprietary: true", "vendor", "vendor"},
4542 {"vendor: true", "vendor", "vendor"},
4543 {"system_ext_specific: true", "system_ext", "system_ext"},
4544 }
4545 for _, tc := range testcases {
4546 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004547 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004548 apex {
4549 name: "myapex",
4550 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004551 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004552 `+tc.propName+`
4553 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004554
Jooyung Han91df2082019-11-20 01:49:42 +09004555 apex_key {
4556 name: "myapex.key",
4557 public_key: "testkey.avbpubkey",
4558 private_key: "testkey.pem",
4559 }
4560 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004561
Jooyung Han91df2082019-11-20 01:49:42 +09004562 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004563 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4564 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004565 if actual != expected {
4566 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4567 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004568
Jooyung Han91df2082019-11-20 01:49:42 +09004569 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004570 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4571 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004572 if actual != expected {
4573 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4574 }
4575 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004576 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004577}
Jiyong Park67882562019-03-21 01:11:21 +09004578
Jooyung Han580eb4f2020-06-24 19:33:06 +09004579func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004580 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004581 apex {
4582 name: "myapex",
4583 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004584 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004585 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004586
Jooyung Han580eb4f2020-06-24 19:33:06 +09004587 apex_key {
4588 name: "myapex.key",
4589 public_key: "testkey.avbpubkey",
4590 private_key: "testkey.pem",
4591 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004592 `)
4593 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004594 rule := module.Output("file_contexts")
4595 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4596}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004597
Jooyung Han580eb4f2020-06-24 19:33:06 +09004598func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004599 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004600 apex {
4601 name: "myapex",
4602 key: "myapex.key",
4603 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004604 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004605 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004606
Jooyung Han580eb4f2020-06-24 19:33:06 +09004607 apex_key {
4608 name: "myapex.key",
4609 public_key: "testkey.avbpubkey",
4610 private_key: "testkey.pem",
4611 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004612 `, withFiles(map[string][]byte{
4613 "my_own_file_contexts": nil,
4614 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004615}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004616
Jooyung Han580eb4f2020-06-24 19:33:06 +09004617func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004618 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004619 apex {
4620 name: "myapex",
4621 key: "myapex.key",
4622 product_specific: true,
4623 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004624 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004625 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004626
Jooyung Han580eb4f2020-06-24 19:33:06 +09004627 apex_key {
4628 name: "myapex.key",
4629 public_key: "testkey.avbpubkey",
4630 private_key: "testkey.pem",
4631 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004632 `)
4633
Colin Cross1c460562021-02-16 17:55:47 -08004634 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004635 apex {
4636 name: "myapex",
4637 key: "myapex.key",
4638 product_specific: true,
4639 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004640 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004641 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004642
Jooyung Han580eb4f2020-06-24 19:33:06 +09004643 apex_key {
4644 name: "myapex.key",
4645 public_key: "testkey.avbpubkey",
4646 private_key: "testkey.pem",
4647 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004648 `, withFiles(map[string][]byte{
4649 "product_specific_file_contexts": nil,
4650 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004651 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4652 rule := module.Output("file_contexts")
4653 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4654}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004655
Jooyung Han580eb4f2020-06-24 19:33:06 +09004656func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004657 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004658 apex {
4659 name: "myapex",
4660 key: "myapex.key",
4661 product_specific: true,
4662 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004663 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004664 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004665
Jooyung Han580eb4f2020-06-24 19:33:06 +09004666 apex_key {
4667 name: "myapex.key",
4668 public_key: "testkey.avbpubkey",
4669 private_key: "testkey.pem",
4670 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004671
Jooyung Han580eb4f2020-06-24 19:33:06 +09004672 filegroup {
4673 name: "my-file-contexts",
4674 srcs: ["product_specific_file_contexts"],
4675 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004676 `, withFiles(map[string][]byte{
4677 "product_specific_file_contexts": nil,
4678 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004679 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4680 rule := module.Output("file_contexts")
4681 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004682}
4683
Jiyong Park67882562019-03-21 01:11:21 +09004684func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004685 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004686 apex_key {
4687 name: "myapex.key",
4688 public_key: ":my.avbpubkey",
4689 private_key: ":my.pem",
4690 product_specific: true,
4691 }
4692
4693 filegroup {
4694 name: "my.avbpubkey",
4695 srcs: ["testkey2.avbpubkey"],
4696 }
4697
4698 filegroup {
4699 name: "my.pem",
4700 srcs: ["testkey2.pem"],
4701 }
4702 `)
4703
4704 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4705 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004706 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004707 if actual_pubkey != expected_pubkey {
4708 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4709 }
4710 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004711 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004712 if actual_privkey != expected_privkey {
4713 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4714 }
4715}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004716
4717func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004718 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004719 prebuilt_apex {
4720 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004721 arch: {
4722 arm64: {
4723 src: "myapex-arm64.apex",
4724 },
4725 arm: {
4726 src: "myapex-arm.apex",
4727 },
4728 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004729 }
4730 `)
4731
Wei Li340ee8e2022-03-18 17:33:24 -07004732 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4733 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004734
Jiyong Parkc95714e2019-03-29 14:23:10 +09004735 expectedInput := "myapex-arm64.apex"
4736 if prebuilt.inputApex.String() != expectedInput {
4737 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4738 }
Wei Li340ee8e2022-03-18 17:33:24 -07004739 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4740 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4741 rule := testingModule.Rule("genProvenanceMetaData")
4742 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4743 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4744 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4745 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004746}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004747
Paul Duffinc0609c62021-03-01 17:27:16 +00004748func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004749 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004750 prebuilt_apex {
4751 name: "myapex",
4752 }
4753 `)
4754}
4755
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004756func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004757 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004758 prebuilt_apex {
4759 name: "myapex",
4760 src: "myapex-arm.apex",
4761 filename: "notmyapex.apex",
4762 }
4763 `)
4764
Wei Li340ee8e2022-03-18 17:33:24 -07004765 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4766 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004767
4768 expected := "notmyapex.apex"
4769 if p.installFilename != expected {
4770 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4771 }
Wei Li340ee8e2022-03-18 17:33:24 -07004772 rule := testingModule.Rule("genProvenanceMetaData")
4773 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4774 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4775 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4776 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004777}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004778
Samiul Islam7c02e262021-09-08 17:48:28 +01004779func TestApexSetFilenameOverride(t *testing.T) {
4780 testApex(t, `
4781 apex_set {
4782 name: "com.company.android.myapex",
4783 apex_name: "com.android.myapex",
4784 set: "company-myapex.apks",
4785 filename: "com.company.android.myapex.apex"
4786 }
4787 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4788
4789 testApex(t, `
4790 apex_set {
4791 name: "com.company.android.myapex",
4792 apex_name: "com.android.myapex",
4793 set: "company-myapex.apks",
4794 filename: "com.company.android.myapex.capex"
4795 }
4796 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4797
4798 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4799 apex_set {
4800 name: "com.company.android.myapex",
4801 apex_name: "com.android.myapex",
4802 set: "company-myapex.apks",
4803 filename: "some-random-suffix"
4804 }
4805 `)
4806}
4807
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004808func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004809 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004810 prebuilt_apex {
4811 name: "myapex.prebuilt",
4812 src: "myapex-arm.apex",
4813 overrides: [
4814 "myapex",
4815 ],
4816 }
4817 `)
4818
Wei Li340ee8e2022-03-18 17:33:24 -07004819 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4820 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004821
4822 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004823 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004824 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004825 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004826 }
Wei Li340ee8e2022-03-18 17:33:24 -07004827 rule := testingModule.Rule("genProvenanceMetaData")
4828 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4829 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4830 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4831 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004832}
4833
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004834func TestPrebuiltApexName(t *testing.T) {
4835 testApex(t, `
4836 prebuilt_apex {
4837 name: "com.company.android.myapex",
4838 apex_name: "com.android.myapex",
4839 src: "company-myapex-arm.apex",
4840 }
4841 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4842
4843 testApex(t, `
4844 apex_set {
4845 name: "com.company.android.myapex",
4846 apex_name: "com.android.myapex",
4847 set: "company-myapex.apks",
4848 }
4849 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4850}
4851
4852func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4853 _ = android.GroupFixturePreparers(
4854 java.PrepareForTestWithJavaDefaultModules,
4855 PrepareForTestWithApexBuildComponents,
4856 android.FixtureWithRootAndroidBp(`
4857 platform_bootclasspath {
4858 name: "platform-bootclasspath",
4859 fragments: [
4860 {
4861 apex: "com.android.art",
4862 module: "art-bootclasspath-fragment",
4863 },
4864 ],
4865 }
4866
4867 prebuilt_apex {
4868 name: "com.company.android.art",
4869 apex_name: "com.android.art",
4870 src: "com.company.android.art-arm.apex",
4871 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4872 }
4873
4874 prebuilt_bootclasspath_fragment {
4875 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004876 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004877 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004878 hidden_api: {
4879 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4880 metadata: "my-bootclasspath-fragment/metadata.csv",
4881 index: "my-bootclasspath-fragment/index.csv",
4882 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4883 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4884 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004885 }
4886
4887 java_import {
4888 name: "core-oj",
4889 jars: ["prebuilt.jar"],
4890 }
4891 `),
4892 ).RunTest(t)
4893}
4894
Paul Duffin092153d2021-01-26 11:42:39 +00004895// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4896// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004897func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004898 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004899
Paul Duffin89886cb2021-02-05 16:44:03 +00004900 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004901 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004902 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004903 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004904 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004905 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004906 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4907 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4908 android.NormalizePathForTesting(dexJarBuildPath))
4909 }
4910
4911 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004912 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004913 // Make sure the import has been given the correct path to the dex jar.
4914 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4915 dexJarBuildPath := p.DexJarInstallPath()
4916 stem := android.RemoveOptionalPrebuiltPrefix(name)
4917 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4918 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4919 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004920 }
4921
Paul Duffin39853512021-02-26 11:09:39 +00004922 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004923 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004924 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004925 android.AssertArrayString(t, "Check if there is no source variant",
4926 []string{"android_common"},
4927 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004928 }
4929
4930 t.Run("prebuilt only", func(t *testing.T) {
4931 bp := `
4932 prebuilt_apex {
4933 name: "myapex",
4934 arch: {
4935 arm64: {
4936 src: "myapex-arm64.apex",
4937 },
4938 arm: {
4939 src: "myapex-arm.apex",
4940 },
4941 },
Paul Duffin39853512021-02-26 11:09:39 +00004942 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004943 }
4944
4945 java_import {
4946 name: "libfoo",
4947 jars: ["libfoo.jar"],
4948 }
Paul Duffin39853512021-02-26 11:09:39 +00004949
4950 java_sdk_library_import {
4951 name: "libbar",
4952 public: {
4953 jars: ["libbar.jar"],
4954 },
4955 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004956 `
4957
4958 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4959 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4960
Martin Stjernholm44825602021-09-17 01:44:12 +01004961 deapexerName := deapexerModuleName("myapex")
4962 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4963
Paul Duffinf6932af2021-02-26 18:21:56 +00004964 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004965 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004966 rule := deapexer.Rule("deapexer")
4967 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4968 t.Errorf("expected: %q, found: %q", expected, actual)
4969 }
4970
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004971 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004972 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004973 rule = prebuiltApex.Rule("android/soong/android.Cp")
4974 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4975 t.Errorf("expected: %q, found: %q", expected, actual)
4976 }
4977
Paul Duffin89886cb2021-02-05 16:44:03 +00004978 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004979 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004980
4981 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004982 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004983 })
4984
4985 t.Run("prebuilt with source preferred", func(t *testing.T) {
4986
4987 bp := `
4988 prebuilt_apex {
4989 name: "myapex",
4990 arch: {
4991 arm64: {
4992 src: "myapex-arm64.apex",
4993 },
4994 arm: {
4995 src: "myapex-arm.apex",
4996 },
4997 },
Paul Duffin39853512021-02-26 11:09:39 +00004998 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004999 }
5000
5001 java_import {
5002 name: "libfoo",
5003 jars: ["libfoo.jar"],
5004 }
5005
5006 java_library {
5007 name: "libfoo",
5008 }
Paul Duffin39853512021-02-26 11:09:39 +00005009
5010 java_sdk_library_import {
5011 name: "libbar",
5012 public: {
5013 jars: ["libbar.jar"],
5014 },
5015 }
5016
5017 java_sdk_library {
5018 name: "libbar",
5019 srcs: ["foo/bar/MyClass.java"],
5020 unsafe_ignore_missing_latest_api: true,
5021 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005022 `
5023
5024 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5025 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5026
Paul Duffin89886cb2021-02-05 16:44:03 +00005027 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005028 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005029 ensureNoSourceVariant(t, ctx, "libfoo")
5030
5031 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005032 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005033 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005034 })
5035
5036 t.Run("prebuilt preferred with source", func(t *testing.T) {
5037 bp := `
5038 prebuilt_apex {
5039 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005040 arch: {
5041 arm64: {
5042 src: "myapex-arm64.apex",
5043 },
5044 arm: {
5045 src: "myapex-arm.apex",
5046 },
5047 },
Paul Duffin39853512021-02-26 11:09:39 +00005048 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005049 }
5050
5051 java_import {
5052 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005053 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005054 jars: ["libfoo.jar"],
5055 }
5056
5057 java_library {
5058 name: "libfoo",
5059 }
Paul Duffin39853512021-02-26 11:09:39 +00005060
5061 java_sdk_library_import {
5062 name: "libbar",
5063 prefer: true,
5064 public: {
5065 jars: ["libbar.jar"],
5066 },
5067 }
5068
5069 java_sdk_library {
5070 name: "libbar",
5071 srcs: ["foo/bar/MyClass.java"],
5072 unsafe_ignore_missing_latest_api: true,
5073 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005074 `
5075
5076 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5077 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5078
Paul Duffin89886cb2021-02-05 16:44:03 +00005079 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005080 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005081 ensureNoSourceVariant(t, ctx, "libfoo")
5082
5083 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005084 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005085 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005086 })
5087}
5088
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005089func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005090 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005091 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005092 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5093 // is disabled.
5094 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5095 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005096
Paul Duffin37856732021-02-26 14:24:15 +00005097 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5098 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005099 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005100 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005101 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005102 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005103 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005104 foundLibfooJar = true
5105 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005106 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005107 }
5108 }
5109 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005110 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 +00005111 }
5112 }
5113
Paul Duffin40a3f652021-07-19 13:11:24 +01005114 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005115 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005116 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005117 var rule android.TestingBuildParams
5118
5119 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5120 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005121 }
5122
Paul Duffin40a3f652021-07-19 13:11:24 +01005123 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5124 t.Helper()
5125 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5126 var rule android.TestingBuildParams
5127
5128 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5129 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5130 }
5131
Paul Duffin89f570a2021-06-16 01:42:33 +01005132 fragment := java.ApexVariantReference{
5133 Apex: proptools.StringPtr("myapex"),
5134 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5135 }
5136
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005137 t.Run("prebuilt only", func(t *testing.T) {
5138 bp := `
5139 prebuilt_apex {
5140 name: "myapex",
5141 arch: {
5142 arm64: {
5143 src: "myapex-arm64.apex",
5144 },
5145 arm: {
5146 src: "myapex-arm.apex",
5147 },
5148 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005149 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5150 }
5151
5152 prebuilt_bootclasspath_fragment {
5153 name: "my-bootclasspath-fragment",
5154 contents: ["libfoo", "libbar"],
5155 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005156 hidden_api: {
5157 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5158 metadata: "my-bootclasspath-fragment/metadata.csv",
5159 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005160 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5161 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5162 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005163 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005164 }
5165
5166 java_import {
5167 name: "libfoo",
5168 jars: ["libfoo.jar"],
5169 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005170 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005171 }
Paul Duffin37856732021-02-26 14:24:15 +00005172
5173 java_sdk_library_import {
5174 name: "libbar",
5175 public: {
5176 jars: ["libbar.jar"],
5177 },
5178 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005179 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005180 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005181 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005182 `
5183
Paul Duffin89f570a2021-06-16 01:42:33 +01005184 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005185 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5186 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005187
Paul Duffin537ea3d2021-05-14 10:38:00 +01005188 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005189 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005190 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005191 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005192 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5193 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005194 })
5195
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005196 t.Run("apex_set only", func(t *testing.T) {
5197 bp := `
5198 apex_set {
5199 name: "myapex",
5200 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005201 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5202 }
5203
5204 prebuilt_bootclasspath_fragment {
5205 name: "my-bootclasspath-fragment",
5206 contents: ["libfoo", "libbar"],
5207 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005208 hidden_api: {
5209 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5210 metadata: "my-bootclasspath-fragment/metadata.csv",
5211 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005212 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5213 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5214 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005215 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005216 }
5217
5218 java_import {
5219 name: "libfoo",
5220 jars: ["libfoo.jar"],
5221 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005222 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005223 }
5224
5225 java_sdk_library_import {
5226 name: "libbar",
5227 public: {
5228 jars: ["libbar.jar"],
5229 },
5230 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005231 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005232 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005233 }
5234 `
5235
Paul Duffin89f570a2021-06-16 01:42:33 +01005236 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005237 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5238 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5239
Paul Duffin537ea3d2021-05-14 10:38:00 +01005240 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005241 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005242 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005243 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005244 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5245 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005246 })
5247
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005248 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5249 bp := `
5250 prebuilt_apex {
5251 name: "myapex",
5252 arch: {
5253 arm64: {
5254 src: "myapex-arm64.apex",
5255 },
5256 arm: {
5257 src: "myapex-arm.apex",
5258 },
5259 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005260 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5261 }
5262
5263 prebuilt_bootclasspath_fragment {
5264 name: "my-bootclasspath-fragment",
5265 contents: ["libfoo", "libbar"],
5266 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005267 hidden_api: {
5268 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5269 metadata: "my-bootclasspath-fragment/metadata.csv",
5270 index: "my-bootclasspath-fragment/index.csv",
5271 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5272 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5273 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005274 }
5275
5276 java_import {
5277 name: "libfoo",
5278 jars: ["libfoo.jar"],
5279 apex_available: ["myapex"],
5280 }
5281
5282 java_library {
5283 name: "libfoo",
5284 srcs: ["foo/bar/MyClass.java"],
5285 apex_available: ["myapex"],
5286 }
Paul Duffin37856732021-02-26 14:24:15 +00005287
5288 java_sdk_library_import {
5289 name: "libbar",
5290 public: {
5291 jars: ["libbar.jar"],
5292 },
5293 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005294 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005295 }
5296
5297 java_sdk_library {
5298 name: "libbar",
5299 srcs: ["foo/bar/MyClass.java"],
5300 unsafe_ignore_missing_latest_api: true,
5301 apex_available: ["myapex"],
5302 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005303 `
5304
5305 // In this test the source (java_library) libfoo is active since the
5306 // prebuilt (java_import) defaults to prefer:false. However the
5307 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5308 // find the dex boot jar in it. We either need to disable the source libfoo
5309 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005310 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005311 // dexbootjar check is skipped if AllowMissingDependencies is true
5312 preparerAllowMissingDeps := android.GroupFixturePreparers(
5313 preparer,
5314 android.PrepareForTestWithAllowMissingDependencies,
5315 )
5316 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005317 })
5318
5319 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5320 bp := `
5321 prebuilt_apex {
5322 name: "myapex",
5323 arch: {
5324 arm64: {
5325 src: "myapex-arm64.apex",
5326 },
5327 arm: {
5328 src: "myapex-arm.apex",
5329 },
5330 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005331 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5332 }
5333
5334 prebuilt_bootclasspath_fragment {
5335 name: "my-bootclasspath-fragment",
5336 contents: ["libfoo", "libbar"],
5337 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005338 hidden_api: {
5339 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5340 metadata: "my-bootclasspath-fragment/metadata.csv",
5341 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005342 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5343 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5344 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005345 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005346 }
5347
5348 java_import {
5349 name: "libfoo",
5350 prefer: true,
5351 jars: ["libfoo.jar"],
5352 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005353 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005354 }
5355
5356 java_library {
5357 name: "libfoo",
5358 srcs: ["foo/bar/MyClass.java"],
5359 apex_available: ["myapex"],
5360 }
Paul Duffin37856732021-02-26 14:24:15 +00005361
5362 java_sdk_library_import {
5363 name: "libbar",
5364 prefer: true,
5365 public: {
5366 jars: ["libbar.jar"],
5367 },
5368 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005369 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005370 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005371 }
5372
5373 java_sdk_library {
5374 name: "libbar",
5375 srcs: ["foo/bar/MyClass.java"],
5376 unsafe_ignore_missing_latest_api: true,
5377 apex_available: ["myapex"],
5378 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005379 `
5380
Paul Duffin89f570a2021-06-16 01:42:33 +01005381 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005382 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5383 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005384
Paul Duffin537ea3d2021-05-14 10:38:00 +01005385 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005386 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005387 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005388 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005389 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5390 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005391 })
5392
5393 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5394 bp := `
5395 apex {
5396 name: "myapex",
5397 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005398 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005399 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005400 }
5401
5402 apex_key {
5403 name: "myapex.key",
5404 public_key: "testkey.avbpubkey",
5405 private_key: "testkey.pem",
5406 }
5407
5408 prebuilt_apex {
5409 name: "myapex",
5410 arch: {
5411 arm64: {
5412 src: "myapex-arm64.apex",
5413 },
5414 arm: {
5415 src: "myapex-arm.apex",
5416 },
5417 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005418 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5419 }
5420
5421 prebuilt_bootclasspath_fragment {
5422 name: "my-bootclasspath-fragment",
5423 contents: ["libfoo", "libbar"],
5424 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005425 hidden_api: {
5426 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5427 metadata: "my-bootclasspath-fragment/metadata.csv",
5428 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005429 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5430 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5431 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005432 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005433 }
5434
5435 java_import {
5436 name: "libfoo",
5437 jars: ["libfoo.jar"],
5438 apex_available: ["myapex"],
5439 }
5440
5441 java_library {
5442 name: "libfoo",
5443 srcs: ["foo/bar/MyClass.java"],
5444 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005445 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005446 }
Paul Duffin37856732021-02-26 14:24:15 +00005447
5448 java_sdk_library_import {
5449 name: "libbar",
5450 public: {
5451 jars: ["libbar.jar"],
5452 },
5453 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005454 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005455 }
5456
5457 java_sdk_library {
5458 name: "libbar",
5459 srcs: ["foo/bar/MyClass.java"],
5460 unsafe_ignore_missing_latest_api: true,
5461 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005462 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005463 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005464 `
5465
Paul Duffin89f570a2021-06-16 01:42:33 +01005466 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005467 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5468 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005469
Paul Duffin537ea3d2021-05-14 10:38:00 +01005470 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005471 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005472 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005473 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005474 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5475 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005476 })
5477
5478 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5479 bp := `
5480 apex {
5481 name: "myapex",
5482 enabled: false,
5483 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005484 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005485 }
5486
5487 apex_key {
5488 name: "myapex.key",
5489 public_key: "testkey.avbpubkey",
5490 private_key: "testkey.pem",
5491 }
5492
5493 prebuilt_apex {
5494 name: "myapex",
5495 arch: {
5496 arm64: {
5497 src: "myapex-arm64.apex",
5498 },
5499 arm: {
5500 src: "myapex-arm.apex",
5501 },
5502 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005503 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5504 }
5505
5506 prebuilt_bootclasspath_fragment {
5507 name: "my-bootclasspath-fragment",
5508 contents: ["libfoo", "libbar"],
5509 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005510 hidden_api: {
5511 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5512 metadata: "my-bootclasspath-fragment/metadata.csv",
5513 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005514 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5515 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5516 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005517 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005518 }
5519
5520 java_import {
5521 name: "libfoo",
5522 prefer: true,
5523 jars: ["libfoo.jar"],
5524 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005525 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005526 }
5527
5528 java_library {
5529 name: "libfoo",
5530 srcs: ["foo/bar/MyClass.java"],
5531 apex_available: ["myapex"],
5532 }
Paul Duffin37856732021-02-26 14:24:15 +00005533
5534 java_sdk_library_import {
5535 name: "libbar",
5536 prefer: true,
5537 public: {
5538 jars: ["libbar.jar"],
5539 },
5540 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005541 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005542 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005543 }
5544
5545 java_sdk_library {
5546 name: "libbar",
5547 srcs: ["foo/bar/MyClass.java"],
5548 unsafe_ignore_missing_latest_api: true,
5549 apex_available: ["myapex"],
5550 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005551 `
5552
Paul Duffin89f570a2021-06-16 01:42:33 +01005553 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005554 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5555 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005556
Paul Duffin537ea3d2021-05-14 10:38:00 +01005557 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005558 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005559 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005560 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005561 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5562 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005563 })
5564}
5565
Roland Levillain630846d2019-06-26 12:48:34 +01005566func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005567 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005568 apex_test {
5569 name: "myapex",
5570 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005571 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005572 tests: [
5573 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005574 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005575 ],
5576 }
5577
5578 apex_key {
5579 name: "myapex.key",
5580 public_key: "testkey.avbpubkey",
5581 private_key: "testkey.pem",
5582 }
5583
Liz Kammer1c14a212020-05-12 15:26:55 -07005584 filegroup {
5585 name: "fg",
5586 srcs: [
5587 "baz",
5588 "bar/baz"
5589 ],
5590 }
5591
Roland Levillain630846d2019-06-26 12:48:34 +01005592 cc_test {
5593 name: "mytest",
5594 gtest: false,
5595 srcs: ["mytest.cpp"],
5596 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005597 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005598 system_shared_libs: [],
5599 static_executable: true,
5600 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005601 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005602 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005603
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005604 cc_library {
5605 name: "mylib",
5606 srcs: ["mylib.cpp"],
5607 system_shared_libs: [],
5608 stl: "none",
5609 }
5610
Liz Kammer5bd365f2020-05-27 15:15:11 -07005611 filegroup {
5612 name: "fg2",
5613 srcs: [
5614 "testdata/baz"
5615 ],
5616 }
5617
Roland Levillain9b5fde92019-06-28 15:41:19 +01005618 cc_test {
5619 name: "mytests",
5620 gtest: false,
5621 srcs: [
5622 "mytest1.cpp",
5623 "mytest2.cpp",
5624 "mytest3.cpp",
5625 ],
5626 test_per_src: true,
5627 relative_install_path: "test",
5628 system_shared_libs: [],
5629 static_executable: true,
5630 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005631 data: [
5632 ":fg",
5633 ":fg2",
5634 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005635 }
Roland Levillain630846d2019-06-26 12:48:34 +01005636 `)
5637
Sundong Ahnabb64432019-10-22 13:58:29 +09005638 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005639 copyCmds := apexRule.Args["copy_commands"]
5640
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005641 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005642 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005643 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005644
Liz Kammer1c14a212020-05-12 15:26:55 -07005645 //Ensure that test data are copied into apex.
5646 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5647 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5648
Roland Levillain9b5fde92019-06-28 15:41:19 +01005649 // Ensure that test deps built with `test_per_src` are copied into apex.
5650 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5651 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5652 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005653
5654 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005655 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005656 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005657 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005658 prefix := "TARGET_"
5659 var builder strings.Builder
5660 data.Custom(&builder, name, prefix, "", data)
5661 androidMk := builder.String()
Prerana Patilb1896c82022-11-09 18:14:34 +00005662 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5663 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5664 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5665 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
5666 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
5667 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005668 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005669
5670 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005671 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005672 data.Custom(&builder, name, prefix, "", data)
5673 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005674 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5675 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005676}
5677
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005678func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005679 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005680 apex {
5681 name: "myapex",
5682 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005683 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005684 }
5685 apex_key {
5686 name: "myapex.key",
5687 public_key: "testkey.avbpubkey",
5688 private_key: "testkey.pem",
5689 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005690 `,
5691 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5692 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5693 }),
5694 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005695 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005696 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005697 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005698 var builder strings.Builder
5699 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5700 androidMk := builder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08005701 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex myapex.flattened\n")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005702}
5703
Jooyung Hand48f3c32019-08-23 11:18:57 +09005704func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5705 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5706 apex {
5707 name: "myapex",
5708 key: "myapex.key",
5709 native_shared_libs: ["libfoo"],
5710 }
5711
5712 apex_key {
5713 name: "myapex.key",
5714 public_key: "testkey.avbpubkey",
5715 private_key: "testkey.pem",
5716 }
5717
5718 cc_library {
5719 name: "libfoo",
5720 stl: "none",
5721 system_shared_libs: [],
5722 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005723 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005724 }
5725 `)
5726 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5727 apex {
5728 name: "myapex",
5729 key: "myapex.key",
5730 java_libs: ["myjar"],
5731 }
5732
5733 apex_key {
5734 name: "myapex.key",
5735 public_key: "testkey.avbpubkey",
5736 private_key: "testkey.pem",
5737 }
5738
5739 java_library {
5740 name: "myjar",
5741 srcs: ["foo/bar/MyClass.java"],
5742 sdk_version: "none",
5743 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005744 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005745 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005746 }
5747 `)
5748}
5749
Bill Peckhama41a6962021-01-11 10:58:54 -08005750func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005751 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005752 apex {
5753 name: "myapex",
5754 key: "myapex.key",
5755 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005756 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005757 }
5758
5759 apex_key {
5760 name: "myapex.key",
5761 public_key: "testkey.avbpubkey",
5762 private_key: "testkey.pem",
5763 }
5764
5765 java_import {
5766 name: "myjavaimport",
5767 apex_available: ["myapex"],
5768 jars: ["my.jar"],
5769 compile_dex: true,
5770 }
5771 `)
5772
5773 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5774 apexRule := module.Rule("apexRule")
5775 copyCmds := apexRule.Args["copy_commands"]
5776 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5777}
5778
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005779func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005780 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005781 apex {
5782 name: "myapex",
5783 key: "myapex.key",
5784 apps: [
5785 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005786 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005787 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005788 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005789 }
5790
5791 apex_key {
5792 name: "myapex.key",
5793 public_key: "testkey.avbpubkey",
5794 private_key: "testkey.pem",
5795 }
5796
5797 android_app {
5798 name: "AppFoo",
5799 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005800 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005801 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005802 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005803 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005804 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005805 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005806
5807 android_app {
5808 name: "AppFooPriv",
5809 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005810 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005811 system_modules: "none",
5812 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005813 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005814 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005815 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005816
5817 cc_library_shared {
5818 name: "libjni",
5819 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005820 shared_libs: ["libfoo"],
5821 stl: "none",
5822 system_shared_libs: [],
5823 apex_available: [ "myapex" ],
5824 sdk_version: "current",
5825 }
5826
5827 cc_library_shared {
5828 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005829 stl: "none",
5830 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005831 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005832 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005833 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005834 `)
5835
Sundong Ahnabb64432019-10-22 13:58:29 +09005836 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005837 apexRule := module.Rule("apexRule")
5838 copyCmds := apexRule.Args["copy_commands"]
5839
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005840 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5841 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005842
Colin Crossaede88c2020-08-11 12:17:01 -07005843 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005844 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005845 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005846 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005847 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005848 // JNI libraries including transitive deps are
5849 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005850 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005851 // ... embedded inside APK (jnilibs.zip)
5852 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5853 // ... and not directly inside the APEX
5854 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5855 }
Dario Frenicde2a032019-10-27 00:29:22 +01005856}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005857
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005858func TestApexWithAppImportBuildId(t *testing.T) {
5859 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5860 for _, id := range invalidBuildIds {
5861 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5862 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5863 variables.BuildId = proptools.StringPtr(id)
5864 })
5865 testApexError(t, message, `apex {
5866 name: "myapex",
5867 key: "myapex.key",
5868 apps: ["AppFooPrebuilt"],
5869 updatable: false,
5870 }
5871
5872 apex_key {
5873 name: "myapex.key",
5874 public_key: "testkey.avbpubkey",
5875 private_key: "testkey.pem",
5876 }
5877
5878 android_app_import {
5879 name: "AppFooPrebuilt",
5880 apk: "PrebuiltAppFoo.apk",
5881 presigned: true,
5882 apex_available: ["myapex"],
5883 }
5884 `, fixture)
5885 }
5886}
5887
Dario Frenicde2a032019-10-27 00:29:22 +01005888func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005889 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005890 apex {
5891 name: "myapex",
5892 key: "myapex.key",
5893 apps: [
5894 "AppFooPrebuilt",
5895 "AppFooPrivPrebuilt",
5896 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005897 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005898 }
5899
5900 apex_key {
5901 name: "myapex.key",
5902 public_key: "testkey.avbpubkey",
5903 private_key: "testkey.pem",
5904 }
5905
5906 android_app_import {
5907 name: "AppFooPrebuilt",
5908 apk: "PrebuiltAppFoo.apk",
5909 presigned: true,
5910 dex_preopt: {
5911 enabled: false,
5912 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005913 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005914 }
5915
5916 android_app_import {
5917 name: "AppFooPrivPrebuilt",
5918 apk: "PrebuiltAppFooPriv.apk",
5919 privileged: true,
5920 presigned: true,
5921 dex_preopt: {
5922 enabled: false,
5923 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005924 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005925 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005926 }
5927 `)
5928
Sundong Ahnabb64432019-10-22 13:58:29 +09005929 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005930 apexRule := module.Rule("apexRule")
5931 copyCmds := apexRule.Args["copy_commands"]
5932
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005933 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5934 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005935}
5936
5937func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005938 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005939 apex {
5940 name: "myapex",
5941 key: "myapex.key",
5942 apps: [
5943 "AppFoo",
5944 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005945 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005946 }
5947
5948 apex_key {
5949 name: "myapex.key",
5950 public_key: "testkey.avbpubkey",
5951 private_key: "testkey.pem",
5952 }
5953
5954 android_app {
5955 name: "AppFoo",
5956 srcs: ["foo/bar/MyClass.java"],
5957 sdk_version: "none",
5958 system_modules: "none",
5959 apex_available: [ "myapex" ],
5960 }
5961
5962 android_app_import {
5963 name: "AppFoo",
5964 apk: "AppFooPrebuilt.apk",
5965 filename: "AppFooPrebuilt.apk",
5966 presigned: true,
5967 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005968 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005969 }
5970 `, withFiles(map[string][]byte{
5971 "AppFooPrebuilt.apk": nil,
5972 }))
5973
5974 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005975 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005976 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005977}
5978
Dario Freni6f3937c2019-12-20 22:58:03 +00005979func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005980 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005981 apex {
5982 name: "myapex",
5983 key: "myapex.key",
5984 apps: [
5985 "TesterHelpAppFoo",
5986 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005987 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005988 }
5989
5990 apex_key {
5991 name: "myapex.key",
5992 public_key: "testkey.avbpubkey",
5993 private_key: "testkey.pem",
5994 }
5995
5996 android_test_helper_app {
5997 name: "TesterHelpAppFoo",
5998 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005999 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006000 }
6001
6002 `)
6003
6004 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6005 apexRule := module.Rule("apexRule")
6006 copyCmds := apexRule.Args["copy_commands"]
6007
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006008 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006009}
6010
Jooyung Han18020ea2019-11-13 10:50:48 +09006011func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6012 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006013 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006014 apex {
6015 name: "myapex",
6016 key: "myapex.key",
6017 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006018 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006019 }
6020
6021 apex_key {
6022 name: "myapex.key",
6023 public_key: "testkey.avbpubkey",
6024 private_key: "testkey.pem",
6025 }
6026
6027 apex {
6028 name: "otherapex",
6029 key: "myapex.key",
6030 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006031 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006032 }
6033
6034 cc_defaults {
6035 name: "libfoo-defaults",
6036 apex_available: ["otherapex"],
6037 }
6038
6039 cc_library {
6040 name: "libfoo",
6041 defaults: ["libfoo-defaults"],
6042 stl: "none",
6043 system_shared_libs: [],
6044 }`)
6045}
6046
Paul Duffine52e66f2020-03-30 17:54:29 +01006047func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006048 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006049 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006050 apex {
6051 name: "myapex",
6052 key: "myapex.key",
6053 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006054 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006055 }
6056
6057 apex_key {
6058 name: "myapex.key",
6059 public_key: "testkey.avbpubkey",
6060 private_key: "testkey.pem",
6061 }
6062
6063 apex {
6064 name: "otherapex",
6065 key: "otherapex.key",
6066 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006067 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006068 }
6069
6070 apex_key {
6071 name: "otherapex.key",
6072 public_key: "testkey.avbpubkey",
6073 private_key: "testkey.pem",
6074 }
6075
6076 cc_library {
6077 name: "libfoo",
6078 stl: "none",
6079 system_shared_libs: [],
6080 apex_available: ["otherapex"],
6081 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006082}
Jiyong Park127b40b2019-09-30 16:04:35 +09006083
Paul Duffine52e66f2020-03-30 17:54:29 +01006084func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006085 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006086 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006087.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006088.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006089.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006090.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006091.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006092.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006093 apex {
6094 name: "myapex",
6095 key: "myapex.key",
6096 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006097 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006098 }
6099
6100 apex_key {
6101 name: "myapex.key",
6102 public_key: "testkey.avbpubkey",
6103 private_key: "testkey.pem",
6104 }
6105
Jiyong Park127b40b2019-09-30 16:04:35 +09006106 cc_library {
6107 name: "libfoo",
6108 stl: "none",
6109 shared_libs: ["libbar"],
6110 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006111 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006112 }
6113
6114 cc_library {
6115 name: "libbar",
6116 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006117 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006118 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006119 apex_available: ["myapex"],
6120 }
6121
6122 cc_library {
6123 name: "libbaz",
6124 stl: "none",
6125 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006126 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006127}
Jiyong Park127b40b2019-09-30 16:04:35 +09006128
Paul Duffine52e66f2020-03-30 17:54:29 +01006129func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006130 testApexError(t, "\"otherapex\" is not a valid module name", `
6131 apex {
6132 name: "myapex",
6133 key: "myapex.key",
6134 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006135 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006136 }
6137
6138 apex_key {
6139 name: "myapex.key",
6140 public_key: "testkey.avbpubkey",
6141 private_key: "testkey.pem",
6142 }
6143
6144 cc_library {
6145 name: "libfoo",
6146 stl: "none",
6147 system_shared_libs: [],
6148 apex_available: ["otherapex"],
6149 }`)
6150
Paul Duffine52e66f2020-03-30 17:54:29 +01006151 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006152 apex {
6153 name: "myapex",
6154 key: "myapex.key",
6155 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006156 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006157 }
6158
6159 apex_key {
6160 name: "myapex.key",
6161 public_key: "testkey.avbpubkey",
6162 private_key: "testkey.pem",
6163 }
6164
6165 cc_library {
6166 name: "libfoo",
6167 stl: "none",
6168 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006169 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006170 apex_available: ["myapex"],
6171 }
6172
6173 cc_library {
6174 name: "libbar",
6175 stl: "none",
6176 system_shared_libs: [],
6177 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006178 }
6179
6180 cc_library {
6181 name: "libbaz",
6182 stl: "none",
6183 system_shared_libs: [],
6184 stubs: {
6185 versions: ["10", "20", "30"],
6186 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006187 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006188}
Jiyong Park127b40b2019-09-30 16:04:35 +09006189
Jiyong Park89e850a2020-04-07 16:37:39 +09006190func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006191 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006192 apex {
6193 name: "myapex",
6194 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006195 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006196 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006197 }
6198
6199 apex_key {
6200 name: "myapex.key",
6201 public_key: "testkey.avbpubkey",
6202 private_key: "testkey.pem",
6203 }
6204
6205 cc_library {
6206 name: "libfoo",
6207 stl: "none",
6208 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006209 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006210 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006211 }
6212
6213 cc_library {
6214 name: "libfoo2",
6215 stl: "none",
6216 system_shared_libs: [],
6217 shared_libs: ["libbaz"],
6218 apex_available: ["//apex_available:platform"],
6219 }
6220
6221 cc_library {
6222 name: "libbar",
6223 stl: "none",
6224 system_shared_libs: [],
6225 apex_available: ["myapex"],
6226 }
6227
6228 cc_library {
6229 name: "libbaz",
6230 stl: "none",
6231 system_shared_libs: [],
6232 apex_available: ["myapex"],
6233 stubs: {
6234 versions: ["1"],
6235 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006236 }`)
6237
Jiyong Park89e850a2020-04-07 16:37:39 +09006238 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6239 // because it depends on libbar which isn't available to platform
6240 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6241 if libfoo.NotAvailableForPlatform() != true {
6242 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6243 }
6244
6245 // libfoo2 however can be available to platform because it depends on libbaz which provides
6246 // stubs
6247 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6248 if libfoo2.NotAvailableForPlatform() == true {
6249 t.Errorf("%q should be available to platform", libfoo2.String())
6250 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006251}
Jiyong Parka90ca002019-10-07 15:47:24 +09006252
Paul Duffine52e66f2020-03-30 17:54:29 +01006253func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006254 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006255 apex {
6256 name: "myapex",
6257 key: "myapex.key",
6258 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006259 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006260 }
6261
6262 apex_key {
6263 name: "myapex.key",
6264 public_key: "testkey.avbpubkey",
6265 private_key: "testkey.pem",
6266 }
6267
6268 cc_library {
6269 name: "libfoo",
6270 stl: "none",
6271 system_shared_libs: [],
6272 apex_available: ["myapex"],
6273 static: {
6274 apex_available: ["//apex_available:platform"],
6275 },
6276 }`)
6277
Jiyong Park89e850a2020-04-07 16:37:39 +09006278 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6279 if libfooShared.NotAvailableForPlatform() != true {
6280 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6281 }
6282 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6283 if libfooStatic.NotAvailableForPlatform() != false {
6284 t.Errorf("%q should be available to platform", libfooStatic.String())
6285 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006286}
6287
Jiyong Park5d790c32019-11-15 18:40:32 +09006288func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006289 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006290 apex {
6291 name: "myapex",
6292 key: "myapex.key",
6293 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006294 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006295 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006296 bootclasspath_fragments: ["mybootclasspath_fragment"],
6297 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6298 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006299 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006300 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006301 }
6302
6303 override_apex {
6304 name: "override_myapex",
6305 base: "myapex",
6306 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006307 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006308 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006309 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6310 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6311 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006312 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006313 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006314 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006315 key: "mynewapex.key",
6316 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006317 }
6318
6319 apex_key {
6320 name: "myapex.key",
6321 public_key: "testkey.avbpubkey",
6322 private_key: "testkey.pem",
6323 }
6324
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006325 apex_key {
6326 name: "mynewapex.key",
6327 public_key: "testkey2.avbpubkey",
6328 private_key: "testkey2.pem",
6329 }
6330
6331 android_app_certificate {
6332 name: "myapex.certificate",
6333 certificate: "testkey",
6334 }
6335
Jiyong Park5d790c32019-11-15 18:40:32 +09006336 android_app {
6337 name: "app",
6338 srcs: ["foo/bar/MyClass.java"],
6339 package_name: "foo",
6340 sdk_version: "none",
6341 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006342 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006343 }
6344
6345 override_android_app {
6346 name: "override_app",
6347 base: "app",
6348 package_name: "bar",
6349 }
markchien7c803b82021-08-26 22:10:06 +08006350
6351 bpf {
6352 name: "bpf",
6353 srcs: ["bpf.c"],
6354 }
6355
6356 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006357 name: "overrideBpf",
6358 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006359 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006360
6361 prebuilt_etc {
6362 name: "myetc",
6363 src: "myprebuilt",
6364 }
6365
6366 prebuilt_etc {
6367 name: "override_myetc",
6368 src: "override_myprebuilt",
6369 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006370
6371 java_library {
6372 name: "bcplib",
6373 srcs: ["a.java"],
6374 compile_dex: true,
6375 apex_available: ["myapex"],
6376 permitted_packages: ["bcp.lib"],
6377 }
6378
6379 bootclasspath_fragment {
6380 name: "mybootclasspath_fragment",
6381 contents: ["bcplib"],
6382 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006383 hidden_api: {
6384 split_packages: ["*"],
6385 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006386 }
6387
6388 java_library {
6389 name: "override_bcplib",
6390 srcs: ["a.java"],
6391 compile_dex: true,
6392 apex_available: ["myapex"],
6393 permitted_packages: ["override.bcp.lib"],
6394 }
6395
6396 bootclasspath_fragment {
6397 name: "override_bootclasspath_fragment",
6398 contents: ["override_bcplib"],
6399 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006400 hidden_api: {
6401 split_packages: ["*"],
6402 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006403 }
6404
6405 java_library {
6406 name: "systemserverlib",
6407 srcs: ["a.java"],
6408 apex_available: ["myapex"],
6409 }
6410
6411 systemserverclasspath_fragment {
6412 name: "mysystemserverclasspath_fragment",
6413 standalone_contents: ["systemserverlib"],
6414 apex_available: ["myapex"],
6415 }
6416
6417 java_library {
6418 name: "override_systemserverlib",
6419 srcs: ["a.java"],
6420 apex_available: ["myapex"],
6421 }
6422
6423 systemserverclasspath_fragment {
6424 name: "override_systemserverclasspath_fragment",
6425 standalone_contents: ["override_systemserverlib"],
6426 apex_available: ["myapex"],
6427 }
6428
6429 java_library {
6430 name: "myjava_library",
6431 srcs: ["a.java"],
6432 compile_dex: true,
6433 apex_available: ["myapex"],
6434 }
6435
6436 java_library {
6437 name: "override_java_library",
6438 srcs: ["a.java"],
6439 compile_dex: true,
6440 apex_available: ["myapex"],
6441 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006442 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006443
Jiyong Park317645e2019-12-05 13:20:58 +09006444 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6445 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6446 if originalVariant.GetOverriddenBy() != "" {
6447 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6448 }
6449 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6450 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6451 }
6452
Jiyong Park5d790c32019-11-15 18:40:32 +09006453 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6454 apexRule := module.Rule("apexRule")
6455 copyCmds := apexRule.Args["copy_commands"]
6456
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006457 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6458 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006459
markchien7c803b82021-08-26 22:10:06 +08006460 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006461 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006462
Daniel Norman5a3ce132021-08-26 15:44:43 -07006463 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6464 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6465
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006466 apexBundle := module.Module().(*apexBundle)
6467 name := apexBundle.Name()
6468 if name != "override_myapex" {
6469 t.Errorf("name should be \"override_myapex\", but was %q", name)
6470 }
6471
Baligh Uddin004d7172020-02-19 21:29:28 -08006472 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6473 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6474 }
6475
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006476 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6477 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6478 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6479 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6480 android.AssertArrayString(t, "Java_libs does not match",
6481 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6482
Jiyong Park20bacab2020-03-03 11:45:41 +09006483 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006484 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006485 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6486
6487 signApkRule := module.Rule("signapk")
6488 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006489
Colin Crossaa255532020-07-03 13:18:24 -07006490 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006491 var builder strings.Builder
6492 data.Custom(&builder, name, "TARGET_", "", data)
6493 androidMk := builder.String()
Prerana Patilb1896c82022-11-09 18:14:34 +00006494 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6495 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
6496 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
6497 ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex")
6498 ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex")
6499 ensureContains(t, androidMk, "LOCAL_MODULE := override_java_library.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006500 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006501 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006502 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006503 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006504 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006505 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006506 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6507 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6508 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006509 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006510}
6511
Albert Martineefabcf2022-03-21 20:11:16 +00006512func TestMinSdkVersionOverride(t *testing.T) {
6513 // Override from 29 to 31
6514 minSdkOverride31 := "31"
6515 ctx := testApex(t, `
6516 apex {
6517 name: "myapex",
6518 key: "myapex.key",
6519 native_shared_libs: ["mylib"],
6520 updatable: true,
6521 min_sdk_version: "29"
6522 }
6523
6524 override_apex {
6525 name: "override_myapex",
6526 base: "myapex",
6527 logging_parent: "com.foo.bar",
6528 package_name: "test.overridden.package"
6529 }
6530
6531 apex_key {
6532 name: "myapex.key",
6533 public_key: "testkey.avbpubkey",
6534 private_key: "testkey.pem",
6535 }
6536
6537 cc_library {
6538 name: "mylib",
6539 srcs: ["mylib.cpp"],
6540 runtime_libs: ["libbar"],
6541 system_shared_libs: [],
6542 stl: "none",
6543 apex_available: [ "myapex" ],
6544 min_sdk_version: "apex_inherit"
6545 }
6546
6547 cc_library {
6548 name: "libbar",
6549 srcs: ["mylib.cpp"],
6550 system_shared_libs: [],
6551 stl: "none",
6552 apex_available: [ "myapex" ],
6553 min_sdk_version: "apex_inherit"
6554 }
6555
6556 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6557
6558 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6559 copyCmds := apexRule.Args["copy_commands"]
6560
6561 // Ensure that direct non-stubs dep is always included
6562 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6563
6564 // Ensure that runtime_libs dep in included
6565 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6566
6567 // Ensure libraries target overridden min_sdk_version value
6568 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6569}
6570
6571func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6572 // Attempt to override from 31 to 29, should be a NOOP
6573 minSdkOverride29 := "29"
6574 ctx := testApex(t, `
6575 apex {
6576 name: "myapex",
6577 key: "myapex.key",
6578 native_shared_libs: ["mylib"],
6579 updatable: true,
6580 min_sdk_version: "31"
6581 }
6582
6583 override_apex {
6584 name: "override_myapex",
6585 base: "myapex",
6586 logging_parent: "com.foo.bar",
6587 package_name: "test.overridden.package"
6588 }
6589
6590 apex_key {
6591 name: "myapex.key",
6592 public_key: "testkey.avbpubkey",
6593 private_key: "testkey.pem",
6594 }
6595
6596 cc_library {
6597 name: "mylib",
6598 srcs: ["mylib.cpp"],
6599 runtime_libs: ["libbar"],
6600 system_shared_libs: [],
6601 stl: "none",
6602 apex_available: [ "myapex" ],
6603 min_sdk_version: "apex_inherit"
6604 }
6605
6606 cc_library {
6607 name: "libbar",
6608 srcs: ["mylib.cpp"],
6609 system_shared_libs: [],
6610 stl: "none",
6611 apex_available: [ "myapex" ],
6612 min_sdk_version: "apex_inherit"
6613 }
6614
6615 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6616
6617 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6618 copyCmds := apexRule.Args["copy_commands"]
6619
6620 // Ensure that direct non-stubs dep is always included
6621 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6622
6623 // Ensure that runtime_libs dep in included
6624 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6625
6626 // Ensure libraries target the original min_sdk_version value rather than the overridden
6627 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6628}
6629
Jooyung Han214bf372019-11-12 13:03:50 +09006630func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006631 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006632 apex {
6633 name: "myapex",
6634 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006635 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006636 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006637 }
6638
6639 apex_key {
6640 name: "myapex.key",
6641 public_key: "testkey.avbpubkey",
6642 private_key: "testkey.pem",
6643 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006644
6645 cc_library {
6646 name: "mylib",
6647 srcs: ["mylib.cpp"],
6648 stl: "libc++",
6649 system_shared_libs: [],
6650 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006651 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006652 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006653 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006654
6655 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6656 args := module.Rule("apexRule").Args
6657 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006658 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006659
6660 // The copies of the libraries in the apex should have one more dependency than
6661 // the ones outside the apex, namely the unwinder. Ideally we should check
6662 // the dependency names directly here but for some reason the names are blank in
6663 // this test.
6664 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006665 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006666 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6667 if len(apexImplicits) != len(nonApexImplicits)+1 {
6668 t.Errorf("%q missing unwinder dep", lib)
6669 }
6670 }
Jooyung Han214bf372019-11-12 13:03:50 +09006671}
6672
Paul Duffine05480a2021-03-08 15:07:14 +00006673var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006674 "api/current.txt": nil,
6675 "api/removed.txt": nil,
6676 "api/system-current.txt": nil,
6677 "api/system-removed.txt": nil,
6678 "api/test-current.txt": nil,
6679 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006680
Anton Hanssondff2c782020-12-21 17:10:01 +00006681 "100/public/api/foo.txt": nil,
6682 "100/public/api/foo-removed.txt": nil,
6683 "100/system/api/foo.txt": nil,
6684 "100/system/api/foo-removed.txt": nil,
6685
Paul Duffineedc5d52020-06-12 17:46:39 +01006686 // For java_sdk_library_import
6687 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006688}
6689
Jooyung Han58f26ab2019-12-18 15:34:32 +09006690func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006691 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006692 apex {
6693 name: "myapex",
6694 key: "myapex.key",
6695 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006696 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006697 }
6698
6699 apex_key {
6700 name: "myapex.key",
6701 public_key: "testkey.avbpubkey",
6702 private_key: "testkey.pem",
6703 }
6704
6705 java_sdk_library {
6706 name: "foo",
6707 srcs: ["a.java"],
6708 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006709 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006710 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006711
6712 prebuilt_apis {
6713 name: "sdk",
6714 api_dirs: ["100"],
6715 }
Paul Duffin9b879592020-05-26 13:21:35 +01006716 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006717
6718 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006719 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006720 "javalib/foo.jar",
6721 "etc/permissions/foo.xml",
6722 })
6723 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006724 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006725 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 +09006726}
6727
Paul Duffin9b879592020-05-26 13:21:35 +01006728func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006729 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006730 apex {
6731 name: "myapex",
6732 key: "myapex.key",
6733 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006734 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006735 }
6736
6737 apex_key {
6738 name: "myapex.key",
6739 public_key: "testkey.avbpubkey",
6740 private_key: "testkey.pem",
6741 }
6742
6743 java_sdk_library {
6744 name: "foo",
6745 srcs: ["a.java"],
6746 api_packages: ["foo"],
6747 apex_available: ["myapex"],
6748 sdk_version: "none",
6749 system_modules: "none",
6750 }
6751
6752 java_library {
6753 name: "bar",
6754 srcs: ["a.java"],
6755 libs: ["foo"],
6756 apex_available: ["myapex"],
6757 sdk_version: "none",
6758 system_modules: "none",
6759 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006760
6761 prebuilt_apis {
6762 name: "sdk",
6763 api_dirs: ["100"],
6764 }
Paul Duffin9b879592020-05-26 13:21:35 +01006765 `, withFiles(filesForSdkLibrary))
6766
6767 // java_sdk_library installs both impl jar and permission XML
6768 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6769 "javalib/bar.jar",
6770 "javalib/foo.jar",
6771 "etc/permissions/foo.xml",
6772 })
6773
6774 // The bar library should depend on the implementation jar.
6775 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006776 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006777 t.Errorf("expected %q, found %#q", expected, actual)
6778 }
6779}
6780
6781func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006782 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006783 apex {
6784 name: "myapex",
6785 key: "myapex.key",
6786 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006787 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006788 }
6789
6790 apex_key {
6791 name: "myapex.key",
6792 public_key: "testkey.avbpubkey",
6793 private_key: "testkey.pem",
6794 }
6795
6796 java_sdk_library {
6797 name: "foo",
6798 srcs: ["a.java"],
6799 api_packages: ["foo"],
6800 apex_available: ["myapex"],
6801 sdk_version: "none",
6802 system_modules: "none",
6803 }
6804
6805 java_library {
6806 name: "bar",
6807 srcs: ["a.java"],
6808 libs: ["foo"],
6809 sdk_version: "none",
6810 system_modules: "none",
6811 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006812
6813 prebuilt_apis {
6814 name: "sdk",
6815 api_dirs: ["100"],
6816 }
Paul Duffin9b879592020-05-26 13:21:35 +01006817 `, withFiles(filesForSdkLibrary))
6818
6819 // java_sdk_library installs both impl jar and permission XML
6820 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6821 "javalib/foo.jar",
6822 "etc/permissions/foo.xml",
6823 })
6824
6825 // The bar library should depend on the stubs jar.
6826 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006827 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006828 t.Errorf("expected %q, found %#q", expected, actual)
6829 }
6830}
6831
Paul Duffineedc5d52020-06-12 17:46:39 +01006832func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006833 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006834 prebuilt_apis {
6835 name: "sdk",
6836 api_dirs: ["100"],
6837 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006838 withFiles(map[string][]byte{
6839 "apex/a.java": nil,
6840 "apex/apex_manifest.json": nil,
6841 "apex/Android.bp": []byte(`
6842 package {
6843 default_visibility: ["//visibility:private"],
6844 }
6845
6846 apex {
6847 name: "myapex",
6848 key: "myapex.key",
6849 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006850 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006851 }
6852
6853 apex_key {
6854 name: "myapex.key",
6855 public_key: "testkey.avbpubkey",
6856 private_key: "testkey.pem",
6857 }
6858
6859 java_library {
6860 name: "bar",
6861 srcs: ["a.java"],
6862 libs: ["foo"],
6863 apex_available: ["myapex"],
6864 sdk_version: "none",
6865 system_modules: "none",
6866 }
6867`),
6868 "source/a.java": nil,
6869 "source/api/current.txt": nil,
6870 "source/api/removed.txt": nil,
6871 "source/Android.bp": []byte(`
6872 package {
6873 default_visibility: ["//visibility:private"],
6874 }
6875
6876 java_sdk_library {
6877 name: "foo",
6878 visibility: ["//apex"],
6879 srcs: ["a.java"],
6880 api_packages: ["foo"],
6881 apex_available: ["myapex"],
6882 sdk_version: "none",
6883 system_modules: "none",
6884 public: {
6885 enabled: true,
6886 },
6887 }
6888`),
6889 "prebuilt/a.jar": nil,
6890 "prebuilt/Android.bp": []byte(`
6891 package {
6892 default_visibility: ["//visibility:private"],
6893 }
6894
6895 java_sdk_library_import {
6896 name: "foo",
6897 visibility: ["//apex", "//source"],
6898 apex_available: ["myapex"],
6899 prefer: true,
6900 public: {
6901 jars: ["a.jar"],
6902 },
6903 }
6904`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006905 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006906 )
6907
6908 // java_sdk_library installs both impl jar and permission XML
6909 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6910 "javalib/bar.jar",
6911 "javalib/foo.jar",
6912 "etc/permissions/foo.xml",
6913 })
6914
6915 // The bar library should depend on the implementation jar.
6916 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006917 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006918 t.Errorf("expected %q, found %#q", expected, actual)
6919 }
6920}
6921
6922func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6923 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6924 apex {
6925 name: "myapex",
6926 key: "myapex.key",
6927 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006928 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006929 }
6930
6931 apex_key {
6932 name: "myapex.key",
6933 public_key: "testkey.avbpubkey",
6934 private_key: "testkey.pem",
6935 }
6936
6937 java_sdk_library_import {
6938 name: "foo",
6939 apex_available: ["myapex"],
6940 prefer: true,
6941 public: {
6942 jars: ["a.jar"],
6943 },
6944 }
6945
6946 `, withFiles(filesForSdkLibrary))
6947}
6948
atrost6e126252020-01-27 17:01:16 +00006949func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006950 result := android.GroupFixturePreparers(
6951 prepareForApexTest,
6952 java.PrepareForTestWithPlatformCompatConfig,
6953 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006954 apex {
6955 name: "myapex",
6956 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006957 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006958 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006959 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006960 }
6961
6962 apex_key {
6963 name: "myapex.key",
6964 public_key: "testkey.avbpubkey",
6965 private_key: "testkey.pem",
6966 }
6967
6968 platform_compat_config {
6969 name: "myjar-platform-compat-config",
6970 src: ":myjar",
6971 }
6972
6973 java_library {
6974 name: "myjar",
6975 srcs: ["foo/bar/MyClass.java"],
6976 sdk_version: "none",
6977 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006978 apex_available: [ "myapex" ],
6979 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006980
6981 // Make sure that a preferred prebuilt does not affect the apex contents.
6982 prebuilt_platform_compat_config {
6983 name: "myjar-platform-compat-config",
6984 metadata: "compat-config/metadata.xml",
6985 prefer: true,
6986 }
atrost6e126252020-01-27 17:01:16 +00006987 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006988 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006989 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6990 "etc/compatconfig/myjar-platform-compat-config.xml",
6991 "javalib/myjar.jar",
6992 })
6993}
6994
Jooyung Han862c0d62022-12-21 10:15:37 +09006995func TestNoDupeApexFiles(t *testing.T) {
6996 android.GroupFixturePreparers(
6997 android.PrepareForTestWithAndroidBuildComponents,
6998 PrepareForTestWithApexBuildComponents,
6999 prepareForTestWithMyapex,
7000 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7001 ).
7002 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7003 RunTestWithBp(t, `
7004 apex {
7005 name: "myapex",
7006 key: "myapex.key",
7007 prebuilts: ["foo", "bar"],
7008 updatable: false,
7009 }
7010
7011 apex_key {
7012 name: "myapex.key",
7013 public_key: "testkey.avbpubkey",
7014 private_key: "testkey.pem",
7015 }
7016
7017 prebuilt_etc {
7018 name: "foo",
7019 src: "myprebuilt",
7020 filename_from_src: true,
7021 }
7022
7023 prebuilt_etc {
7024 name: "bar",
7025 src: "myprebuilt",
7026 filename_from_src: true,
7027 }
7028 `)
7029}
7030
Jiyong Park479321d2019-12-16 11:47:12 +09007031func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7032 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7033 apex {
7034 name: "myapex",
7035 key: "myapex.key",
7036 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007037 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007038 }
7039
7040 apex_key {
7041 name: "myapex.key",
7042 public_key: "testkey.avbpubkey",
7043 private_key: "testkey.pem",
7044 }
7045
7046 java_library {
7047 name: "myjar",
7048 srcs: ["foo/bar/MyClass.java"],
7049 sdk_version: "none",
7050 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007051 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007052 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007053 }
7054 `)
7055}
7056
Jiyong Park7afd1072019-12-30 16:56:33 +09007057func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007058 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007059 apex {
7060 name: "myapex",
7061 key: "myapex.key",
7062 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007063 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007064 }
7065
7066 apex_key {
7067 name: "myapex.key",
7068 public_key: "testkey.avbpubkey",
7069 private_key: "testkey.pem",
7070 }
7071
7072 cc_library {
7073 name: "mylib",
7074 srcs: ["mylib.cpp"],
7075 system_shared_libs: [],
7076 stl: "none",
7077 required: ["a", "b"],
7078 host_required: ["c", "d"],
7079 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007080 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007081 }
7082 `)
7083
7084 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007085 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007086 name := apexBundle.BaseModuleName()
7087 prefix := "TARGET_"
7088 var builder strings.Builder
7089 data.Custom(&builder, name, prefix, "", data)
7090 androidMk := builder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08007091 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex a b\n")
7092 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7093 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007094}
7095
Jiyong Park7cd10e32020-01-14 09:22:18 +09007096func TestSymlinksFromApexToSystem(t *testing.T) {
7097 bp := `
7098 apex {
7099 name: "myapex",
7100 key: "myapex.key",
7101 native_shared_libs: ["mylib"],
7102 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007103 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007104 }
7105
Jiyong Park9d677202020-02-19 16:29:35 +09007106 apex {
7107 name: "myapex.updatable",
7108 key: "myapex.key",
7109 native_shared_libs: ["mylib"],
7110 java_libs: ["myjar"],
7111 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09007112 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09007113 }
7114
Jiyong Park7cd10e32020-01-14 09:22:18 +09007115 apex_key {
7116 name: "myapex.key",
7117 public_key: "testkey.avbpubkey",
7118 private_key: "testkey.pem",
7119 }
7120
7121 cc_library {
7122 name: "mylib",
7123 srcs: ["mylib.cpp"],
7124 shared_libs: ["myotherlib"],
7125 system_shared_libs: [],
7126 stl: "none",
7127 apex_available: [
7128 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007129 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007130 "//apex_available:platform",
7131 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007132 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007133 }
7134
7135 cc_library {
7136 name: "myotherlib",
7137 srcs: ["mylib.cpp"],
7138 system_shared_libs: [],
7139 stl: "none",
7140 apex_available: [
7141 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007142 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007143 "//apex_available:platform",
7144 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007145 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007146 }
7147
7148 java_library {
7149 name: "myjar",
7150 srcs: ["foo/bar/MyClass.java"],
7151 sdk_version: "none",
7152 system_modules: "none",
7153 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007154 apex_available: [
7155 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007156 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007157 "//apex_available:platform",
7158 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007159 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007160 }
7161
7162 java_library {
7163 name: "myotherjar",
7164 srcs: ["foo/bar/MyClass.java"],
7165 sdk_version: "none",
7166 system_modules: "none",
7167 apex_available: [
7168 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007169 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007170 "//apex_available:platform",
7171 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007172 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007173 }
7174 `
7175
7176 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7177 for _, f := range files {
7178 if f.path == file {
7179 if f.isLink {
7180 t.Errorf("%q is not a real file", file)
7181 }
7182 return
7183 }
7184 }
7185 t.Errorf("%q is not found", file)
7186 }
7187
7188 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
7189 for _, f := range files {
7190 if f.path == file {
7191 if !f.isLink {
7192 t.Errorf("%q is not a symlink", file)
7193 }
7194 return
7195 }
7196 }
7197 t.Errorf("%q is not found", file)
7198 }
7199
Jiyong Park9d677202020-02-19 16:29:35 +09007200 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7201 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007202 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007203 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007204 ensureRealfileExists(t, files, "javalib/myjar.jar")
7205 ensureRealfileExists(t, files, "lib64/mylib.so")
7206 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7207
Jiyong Park9d677202020-02-19 16:29:35 +09007208 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7209 ensureRealfileExists(t, files, "javalib/myjar.jar")
7210 ensureRealfileExists(t, files, "lib64/mylib.so")
7211 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7212
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")
7218 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007219
7220 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7221 ensureRealfileExists(t, files, "javalib/myjar.jar")
7222 ensureRealfileExists(t, files, "lib64/mylib.so")
7223 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007224}
7225
Yo Chiange8128052020-07-23 20:09:18 +08007226func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007227 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007228 apex {
7229 name: "myapex",
7230 key: "myapex.key",
7231 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007232 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007233 }
7234
7235 apex_key {
7236 name: "myapex.key",
7237 public_key: "testkey.avbpubkey",
7238 private_key: "testkey.pem",
7239 }
7240
7241 cc_library_shared {
7242 name: "mylib",
7243 srcs: ["mylib.cpp"],
7244 shared_libs: ["myotherlib"],
7245 system_shared_libs: [],
7246 stl: "none",
7247 apex_available: [
7248 "myapex",
7249 "//apex_available:platform",
7250 ],
7251 }
7252
7253 cc_prebuilt_library_shared {
7254 name: "myotherlib",
7255 srcs: ["prebuilt.so"],
7256 system_shared_libs: [],
7257 stl: "none",
7258 apex_available: [
7259 "myapex",
7260 "//apex_available:platform",
7261 ],
7262 }
7263 `)
7264
Prerana Patilb1896c82022-11-09 18:14:34 +00007265 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007266 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007267 var builder strings.Builder
7268 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7269 androidMk := builder.String()
7270 // `myotherlib` is added to `myapex` as symlink
Prerana Patilb1896c82022-11-09 18:14:34 +00007271 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007272 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7273 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7274 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Sasha Smundakdcb61292022-12-08 10:41:33 -08007275 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 +08007276}
7277
Jooyung Han643adc42020-02-27 13:50:06 +09007278func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007279 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007280 apex {
7281 name: "myapex",
7282 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007283 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007284 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007285 }
7286
7287 apex_key {
7288 name: "myapex.key",
7289 public_key: "testkey.avbpubkey",
7290 private_key: "testkey.pem",
7291 }
7292
7293 cc_library {
7294 name: "mylib",
7295 srcs: ["mylib.cpp"],
7296 shared_libs: ["mylib2"],
7297 system_shared_libs: [],
7298 stl: "none",
7299 apex_available: [ "myapex" ],
7300 }
7301
7302 cc_library {
7303 name: "mylib2",
7304 srcs: ["mylib.cpp"],
7305 system_shared_libs: [],
7306 stl: "none",
7307 apex_available: [ "myapex" ],
7308 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007309
7310 rust_ffi_shared {
7311 name: "libfoo.rust",
7312 crate_name: "foo",
7313 srcs: ["foo.rs"],
7314 shared_libs: ["libfoo.shared_from_rust"],
7315 prefer_rlib: true,
7316 apex_available: ["myapex"],
7317 }
7318
7319 cc_library_shared {
7320 name: "libfoo.shared_from_rust",
7321 srcs: ["mylib.cpp"],
7322 system_shared_libs: [],
7323 stl: "none",
7324 stubs: {
7325 versions: ["10", "11", "12"],
7326 },
7327 }
7328
Jooyung Han643adc42020-02-27 13:50:06 +09007329 `)
7330
7331 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7332 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007333 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007334 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7335 "lib64/mylib.so",
7336 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007337 "lib64/libfoo.rust.so",
7338 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7339 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007340 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007341
7342 // b/220397949
7343 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007344}
7345
Jooyung Han49f67012020-04-17 13:43:10 +09007346func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007347 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007348 apex {
7349 name: "myapex",
7350 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007351 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007352 }
7353 apex_key {
7354 name: "myapex.key",
7355 public_key: "testkey.avbpubkey",
7356 private_key: "testkey.pem",
7357 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007358 `,
7359 android.FixtureModifyConfig(func(config android.Config) {
7360 delete(config.Targets, android.Android)
7361 config.AndroidCommonTarget = android.Target{}
7362 }),
7363 )
Jooyung Han49f67012020-04-17 13:43:10 +09007364
7365 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7366 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7367 }
7368}
7369
Jiyong Parkbd159612020-02-28 15:22:21 +09007370func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007371 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007372 apex {
7373 name: "myapex",
7374 key: "myapex.key",
7375 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007376 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007377 }
7378
7379 apex_key {
7380 name: "myapex.key",
7381 public_key: "testkey.avbpubkey",
7382 private_key: "testkey.pem",
7383 }
7384
7385 android_app {
7386 name: "AppFoo",
7387 srcs: ["foo/bar/MyClass.java"],
7388 sdk_version: "none",
7389 system_modules: "none",
7390 apex_available: [ "myapex" ],
7391 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007392 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007393
Colin Crosscf371cc2020-11-13 11:48:42 -08007394 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007395 content := bundleConfigRule.Args["content"]
7396
7397 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007398 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 +09007399}
7400
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007401func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007402 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007403 apex {
7404 name: "myapex",
7405 key: "myapex.key",
7406 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007407 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007408 }
7409
7410 apex_key {
7411 name: "myapex.key",
7412 public_key: "testkey.avbpubkey",
7413 private_key: "testkey.pem",
7414 }
7415
7416 android_app_set {
7417 name: "AppSet",
7418 set: "AppSet.apks",
7419 }`)
7420 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007421 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007422 content := bundleConfigRule.Args["content"]
7423 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7424 s := mod.Rule("apexRule").Args["copy_commands"]
7425 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007426 if len(copyCmds) != 4 {
7427 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007428 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007429 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7430 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007431 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7432 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007433
7434 // Ensure that canned_fs_config has an entry for the app set zip file
7435 generateFsRule := mod.Rule("generateFsConfig")
7436 cmd := generateFsRule.RuleParams.Command
7437 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007438}
7439
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007440func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007441 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007442 apex_set {
7443 name: "myapex",
7444 filename: "foo_v2.apex",
7445 sanitized: {
7446 none: { set: "myapex.apks", },
7447 hwaddress: { set: "myapex.hwasan.apks", },
7448 },
Paul Duffin24704672021-04-06 16:09:30 +01007449 }
7450 `
7451 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007452
Paul Duffin24704672021-04-06 16:09:30 +01007453 // Check that the extractor produces the correct output file from the correct input file.
7454 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007455
Paul Duffin24704672021-04-06 16:09:30 +01007456 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7457 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007458
Paul Duffin24704672021-04-06 16:09:30 +01007459 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7460
7461 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007462 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7463 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007464
7465 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007466}
7467
Pranav Guptaeba03b02022-09-27 00:27:08 +00007468func TestApexSetApksModuleAssignment(t *testing.T) {
7469 ctx := testApex(t, `
7470 apex_set {
7471 name: "myapex",
7472 set: ":myapex_apks_file",
7473 }
7474
7475 filegroup {
7476 name: "myapex_apks_file",
7477 srcs: ["myapex.apks"],
7478 }
7479 `)
7480
7481 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7482
7483 // Check that the extractor produces the correct apks file from the input module
7484 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7485 extractedApex := m.Output(extractorOutput)
7486
7487 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7488}
7489
Paul Duffin89f570a2021-06-16 01:42:33 +01007490func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007491 t.Helper()
7492
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007493 bp := `
7494 java_library {
7495 name: "some-updatable-apex-lib",
7496 srcs: ["a.java"],
7497 sdk_version: "current",
7498 apex_available: [
7499 "some-updatable-apex",
7500 ],
satayevabcd5972021-08-06 17:49:46 +01007501 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007502 }
7503
7504 java_library {
7505 name: "some-non-updatable-apex-lib",
7506 srcs: ["a.java"],
7507 apex_available: [
7508 "some-non-updatable-apex",
7509 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007510 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007511 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007512 }
7513
7514 bootclasspath_fragment {
7515 name: "some-non-updatable-fragment",
7516 contents: ["some-non-updatable-apex-lib"],
7517 apex_available: [
7518 "some-non-updatable-apex",
7519 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007520 hidden_api: {
7521 split_packages: ["*"],
7522 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007523 }
7524
7525 java_library {
7526 name: "some-platform-lib",
7527 srcs: ["a.java"],
7528 sdk_version: "current",
7529 installable: true,
7530 }
7531
7532 java_library {
7533 name: "some-art-lib",
7534 srcs: ["a.java"],
7535 sdk_version: "current",
7536 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007537 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007538 ],
7539 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007540 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007541 }
7542
7543 apex {
7544 name: "some-updatable-apex",
7545 key: "some-updatable-apex.key",
7546 java_libs: ["some-updatable-apex-lib"],
7547 updatable: true,
7548 min_sdk_version: "current",
7549 }
7550
7551 apex {
7552 name: "some-non-updatable-apex",
7553 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007554 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007555 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007556 }
7557
7558 apex_key {
7559 name: "some-updatable-apex.key",
7560 }
7561
7562 apex_key {
7563 name: "some-non-updatable-apex.key",
7564 }
7565
7566 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007567 name: "com.android.art.debug",
7568 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007569 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007570 updatable: true,
7571 min_sdk_version: "current",
7572 }
7573
Paul Duffinf23bc472021-04-27 12:42:20 +01007574 bootclasspath_fragment {
7575 name: "art-bootclasspath-fragment",
7576 image_name: "art",
7577 contents: ["some-art-lib"],
7578 apex_available: [
7579 "com.android.art.debug",
7580 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007581 hidden_api: {
7582 split_packages: ["*"],
7583 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007584 }
7585
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007586 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007587 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007588 }
7589
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007590 filegroup {
7591 name: "some-updatable-apex-file_contexts",
7592 srcs: [
7593 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7594 ],
7595 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007596
7597 filegroup {
7598 name: "some-non-updatable-apex-file_contexts",
7599 srcs: [
7600 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7601 ],
7602 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007603 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007604
Paul Duffin89f570a2021-06-16 01:42:33 +01007605 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007606}
7607
Paul Duffin89f570a2021-06-16 01:42:33 +01007608func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007609 t.Helper()
7610
Paul Duffin55607122021-03-30 23:32:51 +01007611 fs := android.MockFS{
7612 "a.java": nil,
7613 "a.jar": nil,
7614 "apex_manifest.json": nil,
7615 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007616 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007617 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7618 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7619 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007620 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007621 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007622
Paul Duffin55607122021-03-30 23:32:51 +01007623 errorHandler := android.FixtureExpectsNoErrors
7624 if errmsg != "" {
7625 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007626 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007627
Paul Duffin55607122021-03-30 23:32:51 +01007628 result := android.GroupFixturePreparers(
7629 cc.PrepareForTestWithCcDefaultModules,
7630 java.PrepareForTestWithHiddenApiBuildComponents,
7631 java.PrepareForTestWithJavaDefaultModules,
7632 java.PrepareForTestWithJavaSdkLibraryFiles,
7633 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007634 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007635 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007636 android.FixtureModifyMockFS(func(fs android.MockFS) {
7637 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7638 insert := ""
7639 for _, fragment := range fragments {
7640 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7641 }
7642 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7643 platform_bootclasspath {
7644 name: "platform-bootclasspath",
7645 fragments: [
7646 %s
7647 ],
7648 }
7649 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007650 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007651 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007652 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007653 ).
7654 ExtendWithErrorHandler(errorHandler).
7655 RunTestWithBp(t, bp)
7656
7657 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007658}
7659
Paul Duffin5556c5f2022-06-09 17:32:21 +00007660func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007661 preparers := android.GroupFixturePreparers(
7662 java.PrepareForTestWithJavaDefaultModules,
7663 PrepareForTestWithApexBuildComponents,
7664 ).
7665 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7666 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7667
7668 bpBase := `
7669 apex_set {
7670 name: "com.android.myapex",
7671 installable: true,
7672 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7673 set: "myapex.apks",
7674 }
7675
7676 apex_set {
7677 name: "com.mycompany.android.myapex",
7678 apex_name: "com.android.myapex",
7679 installable: true,
7680 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7681 set: "company-myapex.apks",
7682 }
7683
7684 prebuilt_bootclasspath_fragment {
7685 name: "my-bootclasspath-fragment",
7686 apex_available: ["com.android.myapex"],
7687 %s
7688 }
7689 `
7690
7691 t.Run("java_import", func(t *testing.T) {
7692 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7693 java_import {
7694 name: "libfoo",
7695 jars: ["libfoo.jar"],
7696 apex_available: ["com.android.myapex"],
7697 }
7698 `)
7699 })
7700
7701 t.Run("java_sdk_library_import", func(t *testing.T) {
7702 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7703 java_sdk_library_import {
7704 name: "libfoo",
7705 public: {
7706 jars: ["libbar.jar"],
7707 },
7708 apex_available: ["com.android.myapex"],
7709 }
7710 `)
7711 })
7712
7713 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7714 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7715 image_name: "art",
7716 contents: ["libfoo"],
7717 `)+`
7718 java_sdk_library_import {
7719 name: "libfoo",
7720 public: {
7721 jars: ["libbar.jar"],
7722 },
7723 apex_available: ["com.android.myapex"],
7724 }
7725 `)
7726 })
7727}
7728
Paul Duffin5556c5f2022-06-09 17:32:21 +00007729func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7730 preparers := android.GroupFixturePreparers(
7731 java.PrepareForTestWithJavaDefaultModules,
7732 PrepareForTestWithApexBuildComponents,
7733 )
7734
7735 bpBase := `
7736 apex_set {
7737 name: "com.android.myapex",
7738 installable: true,
7739 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7740 set: "myapex.apks",
7741 }
7742
7743 apex_set {
7744 name: "com.android.myapex_compressed",
7745 apex_name: "com.android.myapex",
7746 installable: true,
7747 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7748 set: "myapex_compressed.apks",
7749 }
7750
7751 prebuilt_bootclasspath_fragment {
7752 name: "my-bootclasspath-fragment",
7753 apex_available: [
7754 "com.android.myapex",
7755 "com.android.myapex_compressed",
7756 ],
7757 hidden_api: {
7758 annotation_flags: "annotation-flags.csv",
7759 metadata: "metadata.csv",
7760 index: "index.csv",
7761 signature_patterns: "signature_patterns.csv",
7762 },
7763 %s
7764 }
7765 `
7766
7767 t.Run("java_import", func(t *testing.T) {
7768 result := preparers.RunTestWithBp(t,
7769 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7770 java_import {
7771 name: "libfoo",
7772 jars: ["libfoo.jar"],
7773 apex_available: [
7774 "com.android.myapex",
7775 "com.android.myapex_compressed",
7776 ],
7777 }
7778 `)
7779
7780 module := result.Module("libfoo", "android_common_com.android.myapex")
7781 usesLibraryDep := module.(java.UsesLibraryDependency)
7782 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7783 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7784 usesLibraryDep.DexJarBuildPath().Path())
7785 })
7786
7787 t.Run("java_sdk_library_import", func(t *testing.T) {
7788 result := preparers.RunTestWithBp(t,
7789 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7790 java_sdk_library_import {
7791 name: "libfoo",
7792 public: {
7793 jars: ["libbar.jar"],
7794 },
7795 apex_available: [
7796 "com.android.myapex",
7797 "com.android.myapex_compressed",
7798 ],
7799 compile_dex: true,
7800 }
7801 `)
7802
7803 module := result.Module("libfoo", "android_common_com.android.myapex")
7804 usesLibraryDep := module.(java.UsesLibraryDependency)
7805 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7806 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7807 usesLibraryDep.DexJarBuildPath().Path())
7808 })
7809
7810 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7811 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7812 image_name: "art",
7813 contents: ["libfoo"],
7814 `)+`
7815 java_sdk_library_import {
7816 name: "libfoo",
7817 public: {
7818 jars: ["libbar.jar"],
7819 },
7820 apex_available: [
7821 "com.android.myapex",
7822 "com.android.myapex_compressed",
7823 ],
7824 compile_dex: true,
7825 }
7826 `)
7827 })
7828}
7829
Jooyung Han548640b2020-04-27 12:10:30 +09007830func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7831 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7832 apex {
7833 name: "myapex",
7834 key: "myapex.key",
7835 updatable: true,
7836 }
7837
7838 apex_key {
7839 name: "myapex.key",
7840 public_key: "testkey.avbpubkey",
7841 private_key: "testkey.pem",
7842 }
7843 `)
7844}
7845
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007846func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7847 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7848 apex {
7849 name: "myapex",
7850 key: "myapex.key",
7851 }
7852
7853 apex_key {
7854 name: "myapex.key",
7855 public_key: "testkey.avbpubkey",
7856 private_key: "testkey.pem",
7857 }
7858 `)
7859}
7860
Daniel Norman69109112021-12-02 12:52:42 -08007861func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7862 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7863 apex {
7864 name: "myapex",
7865 key: "myapex.key",
7866 updatable: true,
7867 soc_specific: true,
7868 }
7869
7870 apex_key {
7871 name: "myapex.key",
7872 public_key: "testkey.avbpubkey",
7873 private_key: "testkey.pem",
7874 }
7875 `)
7876}
7877
satayevb98371c2021-06-15 16:49:50 +01007878func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7879 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7880 apex {
7881 name: "myapex",
7882 key: "myapex.key",
7883 systemserverclasspath_fragments: [
7884 "mysystemserverclasspathfragment",
7885 ],
7886 min_sdk_version: "29",
7887 updatable: true,
7888 }
7889
7890 apex_key {
7891 name: "myapex.key",
7892 public_key: "testkey.avbpubkey",
7893 private_key: "testkey.pem",
7894 }
7895
7896 java_library {
7897 name: "foo",
7898 srcs: ["b.java"],
7899 min_sdk_version: "29",
7900 installable: true,
7901 apex_available: [
7902 "myapex",
7903 ],
7904 }
7905
7906 systemserverclasspath_fragment {
7907 name: "mysystemserverclasspathfragment",
7908 generate_classpaths_proto: false,
7909 contents: [
7910 "foo",
7911 ],
7912 apex_available: [
7913 "myapex",
7914 ],
7915 }
satayevabcd5972021-08-06 17:49:46 +01007916 `,
7917 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7918 )
satayevb98371c2021-06-15 16:49:50 +01007919}
7920
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007921func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007922 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7923 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7924 // modules to be included in the BootJars.
7925 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7926 return android.GroupFixturePreparers(
7927 dexpreopt.FixtureSetBootJars(bootJars...),
7928 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7929 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7930 }),
7931 )
7932 }
7933
7934 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7935 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7936 // specified in the ArtApexJars configuration.
7937 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7938 return android.GroupFixturePreparers(
7939 dexpreopt.FixtureSetArtBootJars(bootJars...),
7940 dexpreopt.FixtureSetBootJars(bootJars...),
7941 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7942 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7943 }),
7944 )
7945 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007946
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007947 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007948 preparer := android.GroupFixturePreparers(
7949 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7950 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7951 )
7952 fragments := []java.ApexVariantReference{
7953 {
7954 Apex: proptools.StringPtr("com.android.art.debug"),
7955 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7956 },
7957 {
7958 Apex: proptools.StringPtr("some-non-updatable-apex"),
7959 Module: proptools.StringPtr("some-non-updatable-fragment"),
7960 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007961 }
satayevabcd5972021-08-06 17:49:46 +01007962 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007963 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007964
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007965 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007966 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7967 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007968 preparer := android.GroupFixturePreparers(
7969 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7970 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7971 )
Paul Duffin60264a02021-04-12 20:02:36 +01007972 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007973 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007974
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007975 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 +01007976 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 +01007977 // Update the dexpreopt ArtApexJars directly.
7978 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7979 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007980 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007981
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007982 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 +01007983 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 +01007984 // Update the dexpreopt ArtApexJars directly.
7985 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7986 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007987 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007988
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007989 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 +01007990 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 +01007991 preparer := android.GroupFixturePreparers(
7992 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7993 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7994 )
Paul Duffin60264a02021-04-12 20:02:36 +01007995 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007996 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007997
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007998 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 +01007999 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01008000 fragment := java.ApexVariantReference{
8001 Apex: proptools.StringPtr("some-non-updatable-apex"),
8002 Module: proptools.StringPtr("some-non-updatable-fragment"),
8003 }
8004 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008005 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008006
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008007 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008008 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008009 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8010 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008011 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008012
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008013 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008014 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008015 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8016 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008017 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008018
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008019 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008020 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01008021 // Update the dexpreopt ArtApexJars directly.
8022 preparer := prepareSetArtJars("platform:some-platform-lib")
8023 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008024 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008025
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008026 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008027 preparer := android.GroupFixturePreparers(
8028 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8029 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8030 )
8031 fragments := []java.ApexVariantReference{
8032 {
8033 Apex: proptools.StringPtr("some-non-updatable-apex"),
8034 Module: proptools.StringPtr("some-non-updatable-fragment"),
8035 },
8036 }
8037 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008038 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008039}
8040
8041func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008042 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008043 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008044 fragment := java.ApexVariantReference{
8045 Apex: proptools.StringPtr("myapex"),
8046 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8047 }
8048
Paul Duffin064b70c2020-11-02 17:32:38 +00008049 testDexpreoptWithApexes(t, `
8050 prebuilt_apex {
8051 name: "myapex" ,
8052 arch: {
8053 arm64: {
8054 src: "myapex-arm64.apex",
8055 },
8056 arm: {
8057 src: "myapex-arm.apex",
8058 },
8059 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008060 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8061 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008062
Paul Duffin89f570a2021-06-16 01:42:33 +01008063 prebuilt_bootclasspath_fragment {
8064 name: "my-bootclasspath-fragment",
8065 contents: ["libfoo"],
8066 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008067 hidden_api: {
8068 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8069 metadata: "my-bootclasspath-fragment/metadata.csv",
8070 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008071 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8072 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8073 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008074 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008075 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008076
Paul Duffin89f570a2021-06-16 01:42:33 +01008077 java_import {
8078 name: "libfoo",
8079 jars: ["libfoo.jar"],
8080 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008081 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008082 }
8083 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008084 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008085}
8086
Spandan Dasf14e2542021-11-12 00:01:37 +00008087func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008088 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008089 bp += `
8090 apex_key {
8091 name: "myapex.key",
8092 public_key: "testkey.avbpubkey",
8093 private_key: "testkey.pem",
8094 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008095 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008096 "lib1/src/A.java": nil,
8097 "lib2/src/B.java": nil,
8098 "system/sepolicy/apex/myapex-file_contexts": nil,
8099 }
8100
Paul Duffin45338f02021-03-30 23:07:52 +01008101 errorHandler := android.FixtureExpectsNoErrors
8102 if errmsg != "" {
8103 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008104 }
Colin Crossae8600b2020-10-29 17:09:13 -07008105
Paul Duffin45338f02021-03-30 23:07:52 +01008106 android.GroupFixturePreparers(
8107 android.PrepareForTestWithAndroidBuildComponents,
8108 java.PrepareForTestWithJavaBuildComponents,
8109 PrepareForTestWithApexBuildComponents,
8110 android.PrepareForTestWithNeverallowRules(rules),
8111 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008112 apexBootJars := make([]string, 0, len(bootJars))
8113 for _, apexBootJar := range bootJars {
8114 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008115 }
satayevd604b212021-07-21 14:23:52 +01008116 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008117 }),
8118 fs.AddToFixture(),
8119 ).
8120 ExtendWithErrorHandler(errorHandler).
8121 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008122}
8123
8124func TestApexPermittedPackagesRules(t *testing.T) {
8125 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008126 name string
8127 expectedError string
8128 bp string
8129 bootJars []string
8130 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008131 }{
8132
8133 {
8134 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8135 expectedError: "",
8136 bp: `
8137 java_library {
8138 name: "bcp_lib1",
8139 srcs: ["lib1/src/*.java"],
8140 permitted_packages: ["foo.bar"],
8141 apex_available: ["myapex"],
8142 sdk_version: "none",
8143 system_modules: "none",
8144 }
8145 java_library {
8146 name: "nonbcp_lib2",
8147 srcs: ["lib2/src/*.java"],
8148 apex_available: ["myapex"],
8149 permitted_packages: ["a.b"],
8150 sdk_version: "none",
8151 system_modules: "none",
8152 }
8153 apex {
8154 name: "myapex",
8155 key: "myapex.key",
8156 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008157 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008158 }`,
8159 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008160 bcpPermittedPackages: map[string][]string{
8161 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008162 "foo.bar",
8163 },
8164 },
8165 },
8166 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008167 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008168 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 +01008169 bp: `
8170 java_library {
8171 name: "bcp_lib1",
8172 srcs: ["lib1/src/*.java"],
8173 apex_available: ["myapex"],
8174 permitted_packages: ["foo.bar"],
8175 sdk_version: "none",
8176 system_modules: "none",
8177 }
8178 java_library {
8179 name: "bcp_lib2",
8180 srcs: ["lib2/src/*.java"],
8181 apex_available: ["myapex"],
8182 permitted_packages: ["foo.bar", "bar.baz"],
8183 sdk_version: "none",
8184 system_modules: "none",
8185 }
8186 apex {
8187 name: "myapex",
8188 key: "myapex.key",
8189 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008190 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008191 }
8192 `,
8193 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008194 bcpPermittedPackages: map[string][]string{
8195 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008196 "foo.bar",
8197 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008198 "bcp_lib2": []string{
8199 "foo.bar",
8200 },
8201 },
8202 },
8203 {
8204 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8205 expectedError: "",
8206 bp: `
8207 java_library {
8208 name: "bcp_lib_restricted",
8209 srcs: ["lib1/src/*.java"],
8210 apex_available: ["myapex"],
8211 permitted_packages: ["foo.bar"],
8212 sdk_version: "none",
8213 min_sdk_version: "29",
8214 system_modules: "none",
8215 }
8216 java_library {
8217 name: "bcp_lib_unrestricted",
8218 srcs: ["lib2/src/*.java"],
8219 apex_available: ["myapex"],
8220 permitted_packages: ["foo.bar", "bar.baz"],
8221 sdk_version: "none",
8222 min_sdk_version: "29",
8223 system_modules: "none",
8224 }
8225 apex {
8226 name: "myapex",
8227 key: "myapex.key",
8228 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8229 updatable: true,
8230 min_sdk_version: "29",
8231 }
8232 `,
8233 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8234 bcpPermittedPackages: map[string][]string{
8235 "bcp_lib1_non_updateable": []string{
8236 "foo.bar",
8237 },
8238 // 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 +01008239 },
8240 },
8241 }
8242 for _, tc := range testcases {
8243 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008244 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8245 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008246 })
8247 }
8248}
8249
Jiyong Park62304bb2020-04-13 16:19:48 +09008250func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008251 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008252 apex {
8253 name: "myapex",
8254 key: "myapex.key",
8255 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008256 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008257 }
8258
8259 apex_key {
8260 name: "myapex.key",
8261 public_key: "testkey.avbpubkey",
8262 private_key: "testkey.pem",
8263 }
8264
8265 cc_library {
8266 name: "mylib",
8267 srcs: ["mylib.cpp"],
8268 system_shared_libs: [],
8269 stl: "none",
8270 stubs: {
8271 versions: ["1"],
8272 },
8273 apex_available: ["myapex"],
8274 }
8275
8276 cc_library {
8277 name: "myprivlib",
8278 srcs: ["mylib.cpp"],
8279 system_shared_libs: [],
8280 stl: "none",
8281 apex_available: ["myapex"],
8282 }
8283
8284
8285 cc_test {
8286 name: "mytest",
8287 gtest: false,
8288 srcs: ["mylib.cpp"],
8289 system_shared_libs: [],
8290 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008291 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008292 test_for: ["myapex"]
8293 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008294
8295 cc_library {
8296 name: "mytestlib",
8297 srcs: ["mylib.cpp"],
8298 system_shared_libs: [],
8299 shared_libs: ["mylib", "myprivlib"],
8300 stl: "none",
8301 test_for: ["myapex"],
8302 }
8303
8304 cc_benchmark {
8305 name: "mybench",
8306 srcs: ["mylib.cpp"],
8307 system_shared_libs: [],
8308 shared_libs: ["mylib", "myprivlib"],
8309 stl: "none",
8310 test_for: ["myapex"],
8311 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008312 `)
8313
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008314 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008315 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008316 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8317 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8318 }
8319
8320 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008321 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008322 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8323 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8324 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8325}
Jiyong Park46a512f2020-12-04 18:02:13 +09008326
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008327func TestIndirectTestFor(t *testing.T) {
8328 ctx := testApex(t, `
8329 apex {
8330 name: "myapex",
8331 key: "myapex.key",
8332 native_shared_libs: ["mylib", "myprivlib"],
8333 updatable: false,
8334 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008335
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008336 apex_key {
8337 name: "myapex.key",
8338 public_key: "testkey.avbpubkey",
8339 private_key: "testkey.pem",
8340 }
8341
8342 cc_library {
8343 name: "mylib",
8344 srcs: ["mylib.cpp"],
8345 system_shared_libs: [],
8346 stl: "none",
8347 stubs: {
8348 versions: ["1"],
8349 },
8350 apex_available: ["myapex"],
8351 }
8352
8353 cc_library {
8354 name: "myprivlib",
8355 srcs: ["mylib.cpp"],
8356 system_shared_libs: [],
8357 stl: "none",
8358 shared_libs: ["mylib"],
8359 apex_available: ["myapex"],
8360 }
8361
8362 cc_library {
8363 name: "mytestlib",
8364 srcs: ["mylib.cpp"],
8365 system_shared_libs: [],
8366 shared_libs: ["myprivlib"],
8367 stl: "none",
8368 test_for: ["myapex"],
8369 }
8370 `)
8371
8372 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008373 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008374 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8375 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8376 }
8377
8378 // The platform variant of mytestlib links to the platform variant of the
8379 // internal myprivlib.
8380 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8381
8382 // The platform variant of myprivlib links to the platform variant of mylib
8383 // and bypasses its stubs.
8384 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 +09008385}
8386
Martin Stjernholmec009002021-03-27 15:18:31 +00008387func TestTestForForLibInOtherApex(t *testing.T) {
8388 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8389 _ = testApex(t, `
8390 apex {
8391 name: "com.android.art",
8392 key: "myapex.key",
8393 native_shared_libs: ["mylib"],
8394 updatable: false,
8395 }
8396
8397 apex {
8398 name: "com.android.art.debug",
8399 key: "myapex.key",
8400 native_shared_libs: ["mylib", "mytestlib"],
8401 updatable: false,
8402 }
8403
8404 apex_key {
8405 name: "myapex.key",
8406 public_key: "testkey.avbpubkey",
8407 private_key: "testkey.pem",
8408 }
8409
8410 cc_library {
8411 name: "mylib",
8412 srcs: ["mylib.cpp"],
8413 system_shared_libs: [],
8414 stl: "none",
8415 stubs: {
8416 versions: ["1"],
8417 },
8418 apex_available: ["com.android.art", "com.android.art.debug"],
8419 }
8420
8421 cc_library {
8422 name: "mytestlib",
8423 srcs: ["mylib.cpp"],
8424 system_shared_libs: [],
8425 shared_libs: ["mylib"],
8426 stl: "none",
8427 apex_available: ["com.android.art.debug"],
8428 test_for: ["com.android.art"],
8429 }
8430 `,
8431 android.MockFS{
8432 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8433 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8434 }.AddToFixture())
8435}
8436
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008437// TODO(jungjw): Move this to proptools
8438func intPtr(i int) *int {
8439 return &i
8440}
8441
8442func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008443 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008444 apex_set {
8445 name: "myapex",
8446 set: "myapex.apks",
8447 filename: "foo_v2.apex",
8448 overrides: ["foo"],
8449 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008450 `,
8451 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8452 variables.Platform_sdk_version = intPtr(30)
8453 }),
8454 android.FixtureModifyConfig(func(config android.Config) {
8455 config.Targets[android.Android] = []android.Target{
8456 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8457 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8458 }
8459 }),
8460 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008461
Paul Duffin24704672021-04-06 16:09:30 +01008462 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008463
8464 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008465 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008466 actual := extractedApex.Args["abis"]
8467 expected := "ARMEABI_V7A,ARM64_V8A"
8468 if actual != expected {
8469 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8470 }
8471 actual = extractedApex.Args["sdk-version"]
8472 expected = "30"
8473 if actual != expected {
8474 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8475 }
8476
Paul Duffin6717d882021-06-15 19:09:41 +01008477 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008478 a := m.Module().(*ApexSet)
8479 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008480 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008481 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8482 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8483 }
8484}
8485
Anton Hansson805e0a52022-11-25 14:06:46 +00008486func TestApexSet_NativeBridge(t *testing.T) {
8487 ctx := testApex(t, `
8488 apex_set {
8489 name: "myapex",
8490 set: "myapex.apks",
8491 filename: "foo_v2.apex",
8492 overrides: ["foo"],
8493 }
8494 `,
8495 android.FixtureModifyConfig(func(config android.Config) {
8496 config.Targets[android.Android] = []android.Target{
8497 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8498 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8499 }
8500 }),
8501 )
8502
8503 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8504
8505 // Check extract_apks tool parameters. No native bridge arch expected
8506 extractedApex := m.Output("extracted/myapex.apks")
8507 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8508}
8509
Jiyong Park7d95a512020-05-10 15:16:24 +09008510func TestNoStaticLinkingToStubsLib(t *testing.T) {
8511 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8512 apex {
8513 name: "myapex",
8514 key: "myapex.key",
8515 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008516 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008517 }
8518
8519 apex_key {
8520 name: "myapex.key",
8521 public_key: "testkey.avbpubkey",
8522 private_key: "testkey.pem",
8523 }
8524
8525 cc_library {
8526 name: "mylib",
8527 srcs: ["mylib.cpp"],
8528 static_libs: ["otherlib"],
8529 system_shared_libs: [],
8530 stl: "none",
8531 apex_available: [ "myapex" ],
8532 }
8533
8534 cc_library {
8535 name: "otherlib",
8536 srcs: ["mylib.cpp"],
8537 system_shared_libs: [],
8538 stl: "none",
8539 stubs: {
8540 versions: ["1", "2", "3"],
8541 },
8542 apex_available: [ "myapex" ],
8543 }
8544 `)
8545}
8546
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008547func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008548 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008549 apex {
8550 name: "myapex",
8551 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008552 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008553 custom_sign_tool: "sign_myapex",
8554 }
8555
8556 apex_key {
8557 name: "myapex.key",
8558 public_key: "testkey.avbpubkey",
8559 private_key: "testkey.pem",
8560 }
8561 `)
8562
8563 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8564 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8565 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"`)
8566}
8567
8568func TestApexKeysTxtOverrides(t *testing.T) {
8569 ctx := testApex(t, `
8570 apex {
8571 name: "myapex",
8572 key: "myapex.key",
8573 updatable: false,
8574 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008575 }
8576
8577 apex_key {
8578 name: "myapex.key",
8579 public_key: "testkey.avbpubkey",
8580 private_key: "testkey.pem",
8581 }
8582
8583 prebuilt_apex {
8584 name: "myapex",
8585 prefer: true,
8586 arch: {
8587 arm64: {
8588 src: "myapex-arm64.apex",
8589 },
8590 arm: {
8591 src: "myapex-arm.apex",
8592 },
8593 },
8594 }
8595
8596 apex_set {
8597 name: "myapex_set",
8598 set: "myapex.apks",
8599 filename: "myapex_set.apex",
8600 overrides: ["myapex"],
8601 }
8602 `)
8603
8604 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8605 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8606 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 +09008607 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 +09008608}
8609
Jooyung Han938b5932020-06-20 12:47:47 +09008610func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008611 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008612 apex {
8613 name: "myapex",
8614 key: "myapex.key",
8615 apps: ["app"],
8616 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008617 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008618 }
8619
8620 apex_key {
8621 name: "myapex.key",
8622 public_key: "testkey.avbpubkey",
8623 private_key: "testkey.pem",
8624 }
8625
8626 android_app {
8627 name: "app",
8628 srcs: ["foo/bar/MyClass.java"],
8629 package_name: "foo",
8630 sdk_version: "none",
8631 system_modules: "none",
8632 apex_available: [ "myapex" ],
8633 }
8634 `, withFiles(map[string][]byte{
8635 "sub/Android.bp": []byte(`
8636 override_apex {
8637 name: "override_myapex",
8638 base: "myapex",
8639 apps: ["override_app"],
8640 allowed_files: ":allowed",
8641 }
8642 // Overridable "path" property should be referenced indirectly
8643 filegroup {
8644 name: "allowed",
8645 srcs: ["allowed.txt"],
8646 }
8647 override_android_app {
8648 name: "override_app",
8649 base: "app",
8650 package_name: "bar",
8651 }
8652 `),
8653 }))
8654
8655 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8656 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8657 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8658 }
8659
8660 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8661 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8662 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8663 }
8664}
8665
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008666func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008667 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008668 apex {
8669 name: "myapex",
8670 key: "myapex.key",
8671 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008672 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008673 }
8674
8675 apex_key {
8676 name: "myapex.key",
8677 public_key: "testkey.avbpubkey",
8678 private_key: "testkey.pem",
8679 }
8680
8681 cc_library {
8682 name: "mylib",
8683 srcs: ["mylib.cpp"],
8684 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008685 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008686 },
8687 apex_available: ["myapex"],
8688 }
8689
8690 cc_prebuilt_library_shared {
8691 name: "mylib",
8692 prefer: false,
8693 srcs: ["prebuilt.so"],
8694 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008695 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008696 },
8697 apex_available: ["myapex"],
8698 }
8699 `)
8700}
8701
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008702func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008703 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008704 apex {
8705 name: "myapex",
8706 key: "myapex.key",
8707 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008708 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008709 }
8710 apex_key {
8711 name: "myapex.key",
8712 public_key: "testkey.avbpubkey",
8713 private_key: "testkey.pem",
8714 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008715 `,
8716 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8717 variables.CompressedApex = proptools.BoolPtr(true)
8718 }),
8719 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008720
8721 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8722 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8723
8724 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8725 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8726
8727 // Make sure output of bundle is .capex
8728 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8729 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8730
8731 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008732 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008733 var builder strings.Builder
8734 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8735 androidMk := builder.String()
8736 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8737}
8738
Martin Stjernholm2856c662020-12-02 15:03:42 +00008739func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008740 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008741 apex {
8742 name: "myapex",
8743 key: "myapex.key",
8744 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008745 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008746 }
8747
8748 apex_key {
8749 name: "myapex.key",
8750 public_key: "testkey.avbpubkey",
8751 private_key: "testkey.pem",
8752 }
8753
8754 cc_library {
8755 name: "mylib",
8756 srcs: ["mylib.cpp"],
8757 apex_available: ["myapex"],
8758 shared_libs: ["otherlib"],
8759 system_shared_libs: [],
8760 }
8761
8762 cc_library {
8763 name: "otherlib",
8764 srcs: ["mylib.cpp"],
8765 stubs: {
8766 versions: ["current"],
8767 },
8768 }
8769
8770 cc_prebuilt_library_shared {
8771 name: "otherlib",
8772 prefer: true,
8773 srcs: ["prebuilt.so"],
8774 stubs: {
8775 versions: ["current"],
8776 },
8777 }
8778 `)
8779
8780 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008781 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008782 var builder strings.Builder
8783 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8784 androidMk := builder.String()
8785
8786 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8787 // a thing there.
Sasha Smundakdcb61292022-12-08 10:41:33 -08008788 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 +00008789}
8790
Jiyong Parke3867542020-12-03 17:28:25 +09008791func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008792 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008793 apex {
8794 name: "myapex",
8795 key: "myapex.key",
8796 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008797 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008798 }
8799
8800 apex_key {
8801 name: "myapex.key",
8802 public_key: "testkey.avbpubkey",
8803 private_key: "testkey.pem",
8804 }
8805
8806 cc_library {
8807 name: "mylib",
8808 srcs: ["mylib.cpp"],
8809 system_shared_libs: [],
8810 stl: "none",
8811 apex_available: ["myapex"],
8812 shared_libs: ["mylib2"],
8813 target: {
8814 apex: {
8815 exclude_shared_libs: ["mylib2"],
8816 },
8817 },
8818 }
8819
8820 cc_library {
8821 name: "mylib2",
8822 srcs: ["mylib.cpp"],
8823 system_shared_libs: [],
8824 stl: "none",
8825 }
8826 `)
8827
8828 // Check if mylib is linked to mylib2 for the non-apex target
8829 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8830 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8831
8832 // Make sure that the link doesn't occur for the apex target
8833 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8834 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8835
8836 // It shouldn't appear in the copy cmd as well.
8837 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8838 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8839}
8840
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008841func TestPrebuiltStubLibDep(t *testing.T) {
8842 bpBase := `
8843 apex {
8844 name: "myapex",
8845 key: "myapex.key",
8846 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008847 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008848 }
8849 apex_key {
8850 name: "myapex.key",
8851 public_key: "testkey.avbpubkey",
8852 private_key: "testkey.pem",
8853 }
8854 cc_library {
8855 name: "mylib",
8856 srcs: ["mylib.cpp"],
8857 apex_available: ["myapex"],
8858 shared_libs: ["stublib"],
8859 system_shared_libs: [],
8860 }
8861 apex {
8862 name: "otherapex",
8863 enabled: %s,
8864 key: "myapex.key",
8865 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008866 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008867 }
8868 `
8869
8870 stublibSourceBp := `
8871 cc_library {
8872 name: "stublib",
8873 srcs: ["mylib.cpp"],
8874 apex_available: ["otherapex"],
8875 system_shared_libs: [],
8876 stl: "none",
8877 stubs: {
8878 versions: ["1"],
8879 },
8880 }
8881 `
8882
8883 stublibPrebuiltBp := `
8884 cc_prebuilt_library_shared {
8885 name: "stublib",
8886 srcs: ["prebuilt.so"],
8887 apex_available: ["otherapex"],
8888 stubs: {
8889 versions: ["1"],
8890 },
8891 %s
8892 }
8893 `
8894
8895 tests := []struct {
8896 name string
8897 stublibBp string
8898 usePrebuilt bool
8899 modNames []string // Modules to collect AndroidMkEntries for
8900 otherApexEnabled []string
8901 }{
8902 {
8903 name: "only_source",
8904 stublibBp: stublibSourceBp,
8905 usePrebuilt: false,
8906 modNames: []string{"stublib"},
8907 otherApexEnabled: []string{"true", "false"},
8908 },
8909 {
8910 name: "source_preferred",
8911 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8912 usePrebuilt: false,
8913 modNames: []string{"stublib", "prebuilt_stublib"},
8914 otherApexEnabled: []string{"true", "false"},
8915 },
8916 {
8917 name: "prebuilt_preferred",
8918 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8919 usePrebuilt: true,
8920 modNames: []string{"stublib", "prebuilt_stublib"},
8921 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8922 },
8923 {
8924 name: "only_prebuilt",
8925 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8926 usePrebuilt: true,
8927 modNames: []string{"stublib"},
8928 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8929 },
8930 }
8931
8932 for _, test := range tests {
8933 t.Run(test.name, func(t *testing.T) {
8934 for _, otherApexEnabled := range test.otherApexEnabled {
8935 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008936 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008937
8938 type modAndMkEntries struct {
8939 mod *cc.Module
8940 mkEntries android.AndroidMkEntries
8941 }
8942 entries := []*modAndMkEntries{}
8943
8944 // Gather shared lib modules that are installable
8945 for _, modName := range test.modNames {
8946 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8947 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8948 continue
8949 }
8950 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008951 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008952 continue
8953 }
Colin Crossaa255532020-07-03 13:18:24 -07008954 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008955 if ent.Disabled {
8956 continue
8957 }
8958 entries = append(entries, &modAndMkEntries{
8959 mod: mod,
8960 mkEntries: ent,
8961 })
8962 }
8963 }
8964 }
8965
8966 var entry *modAndMkEntries = nil
8967 for _, ent := range entries {
8968 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8969 if entry != nil {
8970 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8971 } else {
8972 entry = ent
8973 }
8974 }
8975 }
8976
8977 if entry == nil {
8978 t.Errorf("AndroidMk entry for \"stublib\" missing")
8979 } else {
8980 isPrebuilt := entry.mod.Prebuilt() != nil
8981 if isPrebuilt != test.usePrebuilt {
8982 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8983 }
8984 if !entry.mod.IsStubs() {
8985 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8986 }
8987 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8988 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8989 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008990 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008991 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008992 if !android.InList(expected, cflags) {
8993 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8994 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008995 }
8996 })
8997 }
8998 })
8999 }
9000}
9001
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009002func TestHostApexInHostOnlyBuild(t *testing.T) {
9003 testApex(t, `
9004 apex {
9005 name: "myapex",
9006 host_supported: true,
9007 key: "myapex.key",
9008 updatable: false,
9009 payload_type: "zip",
9010 }
9011 apex_key {
9012 name: "myapex.key",
9013 public_key: "testkey.avbpubkey",
9014 private_key: "testkey.pem",
9015 }
9016 `,
9017 android.FixtureModifyConfig(func(config android.Config) {
9018 // We may not have device targets in all builds, e.g. in
9019 // prebuilts/build-tools/build-prebuilts.sh
9020 config.Targets[android.Android] = []android.Target{}
9021 }))
9022}
9023
Colin Crossc33e5212021-05-25 18:16:02 -07009024func TestApexJavaCoverage(t *testing.T) {
9025 bp := `
9026 apex {
9027 name: "myapex",
9028 key: "myapex.key",
9029 java_libs: ["mylib"],
9030 bootclasspath_fragments: ["mybootclasspathfragment"],
9031 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9032 updatable: false,
9033 }
9034
9035 apex_key {
9036 name: "myapex.key",
9037 public_key: "testkey.avbpubkey",
9038 private_key: "testkey.pem",
9039 }
9040
9041 java_library {
9042 name: "mylib",
9043 srcs: ["mylib.java"],
9044 apex_available: ["myapex"],
9045 compile_dex: true,
9046 }
9047
9048 bootclasspath_fragment {
9049 name: "mybootclasspathfragment",
9050 contents: ["mybootclasspathlib"],
9051 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009052 hidden_api: {
9053 split_packages: ["*"],
9054 },
Colin Crossc33e5212021-05-25 18:16:02 -07009055 }
9056
9057 java_library {
9058 name: "mybootclasspathlib",
9059 srcs: ["mybootclasspathlib.java"],
9060 apex_available: ["myapex"],
9061 compile_dex: true,
9062 }
9063
9064 systemserverclasspath_fragment {
9065 name: "mysystemserverclasspathfragment",
9066 contents: ["mysystemserverclasspathlib"],
9067 apex_available: ["myapex"],
9068 }
9069
9070 java_library {
9071 name: "mysystemserverclasspathlib",
9072 srcs: ["mysystemserverclasspathlib.java"],
9073 apex_available: ["myapex"],
9074 compile_dex: true,
9075 }
9076 `
9077
9078 result := android.GroupFixturePreparers(
9079 PrepareForTestWithApexBuildComponents,
9080 prepareForTestWithMyapex,
9081 java.PrepareForTestWithJavaDefaultModules,
9082 android.PrepareForTestWithAndroidBuildComponents,
9083 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009084 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9085 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009086 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009087 ).RunTest(t)
9088
9089 // Make sure jacoco ran on both mylib and mybootclasspathlib
9090 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9091 t.Errorf("Failed to find jacoco rule for mylib")
9092 }
9093 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9094 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9095 }
9096 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9097 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9098 }
9099}
9100
Jiyong Park192600a2021-08-03 07:52:17 +00009101func TestProhibitStaticExecutable(t *testing.T) {
9102 testApexError(t, `executable mybin is static`, `
9103 apex {
9104 name: "myapex",
9105 key: "myapex.key",
9106 binaries: ["mybin"],
9107 min_sdk_version: "29",
9108 }
9109
9110 apex_key {
9111 name: "myapex.key",
9112 public_key: "testkey.avbpubkey",
9113 private_key: "testkey.pem",
9114 }
9115
9116 cc_binary {
9117 name: "mybin",
9118 srcs: ["mylib.cpp"],
9119 relative_install_path: "foo/bar",
9120 static_executable: true,
9121 system_shared_libs: [],
9122 stl: "none",
9123 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009124 min_sdk_version: "29",
9125 }
9126 `)
9127
9128 testApexError(t, `executable mybin.rust is static`, `
9129 apex {
9130 name: "myapex",
9131 key: "myapex.key",
9132 binaries: ["mybin.rust"],
9133 min_sdk_version: "29",
9134 }
9135
9136 apex_key {
9137 name: "myapex.key",
9138 public_key: "testkey.avbpubkey",
9139 private_key: "testkey.pem",
9140 }
9141
9142 rust_binary {
9143 name: "mybin.rust",
9144 srcs: ["foo.rs"],
9145 static_executable: true,
9146 apex_available: ["myapex"],
9147 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009148 }
9149 `)
9150}
9151
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009152func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9153 ctx := testApex(t, `
9154 apex {
9155 name: "myapex",
9156 key: "myapex.key",
9157 updatable: false,
9158 java_libs: ["foo"],
9159 }
9160
9161 apex_key {
9162 name: "myapex.key",
9163 public_key: "testkey.avbpubkey",
9164 private_key: "testkey.pem",
9165 }
9166
9167 java_library {
9168 name: "foo",
9169 srcs: ["foo.java"],
9170 apex_available: ["myapex"],
9171 installable: true,
9172 }
9173 `,
9174 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9175 )
9176
9177 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9178 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9179 var builder strings.Builder
9180 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9181 androidMk := builder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009182 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 +00009183}
9184
9185func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9186 ctx := testApex(t, `
9187 prebuilt_apex {
9188 name: "myapex",
9189 arch: {
9190 arm64: {
9191 src: "myapex-arm64.apex",
9192 },
9193 arm: {
9194 src: "myapex-arm.apex",
9195 },
9196 },
9197 exported_java_libs: ["foo"],
9198 }
9199
9200 java_import {
9201 name: "foo",
9202 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009203 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009204 }
9205 `,
9206 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9207 )
9208
9209 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9210 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9211 mainModuleEntries := entriesList[0]
9212 android.AssertArrayString(t,
9213 "LOCAL_REQUIRED_MODULES",
9214 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9215 []string{
9216 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9217 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9218 })
9219}
9220
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009221func TestAndroidMk_RequiredModules(t *testing.T) {
9222 ctx := testApex(t, `
9223 apex {
9224 name: "myapex",
9225 key: "myapex.key",
9226 updatable: false,
9227 java_libs: ["foo"],
9228 required: ["otherapex"],
9229 }
9230
9231 apex {
9232 name: "otherapex",
9233 key: "myapex.key",
9234 updatable: false,
9235 java_libs: ["foo"],
9236 required: ["otherapex"],
9237 }
9238
9239 apex_key {
9240 name: "myapex.key",
9241 public_key: "testkey.avbpubkey",
9242 private_key: "testkey.pem",
9243 }
9244
9245 java_library {
9246 name: "foo",
9247 srcs: ["foo.java"],
9248 apex_available: ["myapex", "otherapex"],
9249 installable: true,
9250 }
9251 `)
9252
9253 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9254 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9255 var builder strings.Builder
9256 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9257 androidMk := builder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009258 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009259}
9260
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009261func TestAndroidMk_RequiredDeps(t *testing.T) {
9262 ctx := testApex(t, `
9263 apex {
9264 name: "myapex",
9265 key: "myapex.key",
9266 updatable: false,
9267 }
9268
9269 apex_key {
9270 name: "myapex.key",
9271 public_key: "testkey.avbpubkey",
9272 private_key: "testkey.pem",
9273 }
9274 `)
9275
9276 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9277 bundle.requiredDeps = append(bundle.requiredDeps, "foo")
9278 data := android.AndroidMkDataForTest(t, ctx, bundle)
9279 var builder strings.Builder
9280 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9281 androidMk := builder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009282 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009283
9284 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
9285 flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
9286 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9287 var flattenedBuilder strings.Builder
9288 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9289 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009290 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009291}
9292
Jooyung Hana6d36672022-02-24 13:58:07 +09009293func TestApexOutputFileProducer(t *testing.T) {
9294 for _, tc := range []struct {
9295 name string
9296 ref string
9297 expected_data []string
9298 }{
9299 {
9300 name: "test_using_output",
9301 ref: ":myapex",
9302 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9303 },
9304 {
9305 name: "test_using_apex",
9306 ref: ":myapex{.apex}",
9307 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9308 },
9309 } {
9310 t.Run(tc.name, func(t *testing.T) {
9311 ctx := testApex(t, `
9312 apex {
9313 name: "myapex",
9314 key: "myapex.key",
9315 compressible: true,
9316 updatable: false,
9317 }
9318
9319 apex_key {
9320 name: "myapex.key",
9321 public_key: "testkey.avbpubkey",
9322 private_key: "testkey.pem",
9323 }
9324
9325 java_test {
9326 name: "`+tc.name+`",
9327 srcs: ["a.java"],
9328 data: ["`+tc.ref+`"],
9329 }
9330 `,
9331 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9332 variables.CompressedApex = proptools.BoolPtr(true)
9333 }))
9334 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9335 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9336 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9337 })
9338 }
9339}
9340
satayev758968a2021-12-06 11:42:40 +00009341func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9342 preparer := android.GroupFixturePreparers(
9343 PrepareForTestWithApexBuildComponents,
9344 prepareForTestWithMyapex,
9345 java.PrepareForTestWithJavaSdkLibraryFiles,
9346 java.PrepareForTestWithJavaDefaultModules,
9347 android.PrepareForTestWithAndroidBuildComponents,
9348 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9349 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9350 )
9351
9352 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9353 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9354 preparer.RunTestWithBp(t, `
9355 apex {
9356 name: "myapex",
9357 key: "myapex.key",
9358 bootclasspath_fragments: ["mybootclasspathfragment"],
9359 min_sdk_version: "30",
9360 updatable: false,
9361 }
9362
9363 apex_key {
9364 name: "myapex.key",
9365 public_key: "testkey.avbpubkey",
9366 private_key: "testkey.pem",
9367 }
9368
9369 bootclasspath_fragment {
9370 name: "mybootclasspathfragment",
9371 contents: ["mybootclasspathlib"],
9372 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009373 hidden_api: {
9374 split_packages: ["*"],
9375 },
satayev758968a2021-12-06 11:42:40 +00009376 }
9377
9378 java_sdk_library {
9379 name: "mybootclasspathlib",
9380 srcs: ["mybootclasspathlib.java"],
9381 apex_available: ["myapex"],
9382 compile_dex: true,
9383 unsafe_ignore_missing_latest_api: true,
9384 min_sdk_version: "31",
9385 static_libs: ["util"],
9386 }
9387
9388 java_library {
9389 name: "util",
9390 srcs: ["a.java"],
9391 apex_available: ["myapex"],
9392 min_sdk_version: "31",
9393 static_libs: ["another_util"],
9394 }
9395
9396 java_library {
9397 name: "another_util",
9398 srcs: ["a.java"],
9399 min_sdk_version: "31",
9400 apex_available: ["myapex"],
9401 }
9402 `)
9403 })
9404
9405 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9406 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9407 preparer.RunTestWithBp(t, `
9408 apex {
9409 name: "myapex",
9410 key: "myapex.key",
9411 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9412 min_sdk_version: "30",
9413 updatable: false,
9414 }
9415
9416 apex_key {
9417 name: "myapex.key",
9418 public_key: "testkey.avbpubkey",
9419 private_key: "testkey.pem",
9420 }
9421
9422 systemserverclasspath_fragment {
9423 name: "mysystemserverclasspathfragment",
9424 contents: ["mysystemserverclasspathlib"],
9425 apex_available: ["myapex"],
9426 }
9427
9428 java_sdk_library {
9429 name: "mysystemserverclasspathlib",
9430 srcs: ["mysystemserverclasspathlib.java"],
9431 apex_available: ["myapex"],
9432 compile_dex: true,
9433 min_sdk_version: "32",
9434 unsafe_ignore_missing_latest_api: true,
9435 static_libs: ["util"],
9436 }
9437
9438 java_library {
9439 name: "util",
9440 srcs: ["a.java"],
9441 apex_available: ["myapex"],
9442 min_sdk_version: "31",
9443 static_libs: ["another_util"],
9444 }
9445
9446 java_library {
9447 name: "another_util",
9448 srcs: ["a.java"],
9449 min_sdk_version: "31",
9450 apex_available: ["myapex"],
9451 }
9452 `)
9453 })
9454
9455 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9456 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9457 RunTestWithBp(t, `
9458 apex {
9459 name: "myapex",
9460 key: "myapex.key",
9461 bootclasspath_fragments: ["mybootclasspathfragment"],
9462 min_sdk_version: "30",
9463 updatable: false,
9464 }
9465
9466 apex_key {
9467 name: "myapex.key",
9468 public_key: "testkey.avbpubkey",
9469 private_key: "testkey.pem",
9470 }
9471
9472 bootclasspath_fragment {
9473 name: "mybootclasspathfragment",
9474 contents: ["mybootclasspathlib"],
9475 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009476 hidden_api: {
9477 split_packages: ["*"],
9478 },
satayev758968a2021-12-06 11:42:40 +00009479 }
9480
9481 java_sdk_library {
9482 name: "mybootclasspathlib",
9483 srcs: ["mybootclasspathlib.java"],
9484 apex_available: ["myapex"],
9485 compile_dex: true,
9486 unsafe_ignore_missing_latest_api: true,
9487 }
9488 `)
9489 })
9490
9491 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9492 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9493 RunTestWithBp(t, `
9494 apex {
9495 name: "myapex",
9496 key: "myapex.key",
9497 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9498 min_sdk_version: "30",
9499 updatable: false,
9500 }
9501
9502 apex_key {
9503 name: "myapex.key",
9504 public_key: "testkey.avbpubkey",
9505 private_key: "testkey.pem",
9506 }
9507
9508 systemserverclasspath_fragment {
9509 name: "mysystemserverclasspathfragment",
9510 contents: ["mysystemserverclasspathlib"],
9511 apex_available: ["myapex"],
9512 }
9513
9514 java_sdk_library {
9515 name: "mysystemserverclasspathlib",
9516 srcs: ["mysystemserverclasspathlib.java"],
9517 apex_available: ["myapex"],
9518 compile_dex: true,
9519 unsafe_ignore_missing_latest_api: true,
9520 }
9521 `)
9522 })
9523}
9524
Jiakai Zhang6decef92022-01-12 17:56:19 +00009525// Verifies that the APEX depends on all the Make modules in the list.
9526func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9527 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9528 for _, dep := range deps {
9529 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9530 }
9531}
9532
9533// Verifies that the APEX does not depend on any of the Make modules in the list.
9534func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9535 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9536 for _, dep := range deps {
9537 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9538 }
9539}
9540
Spandan Das66773252022-01-15 00:23:18 +00009541func TestApexStrictUpdtabilityLint(t *testing.T) {
9542 bpTemplate := `
9543 apex {
9544 name: "myapex",
9545 key: "myapex.key",
9546 java_libs: ["myjavalib"],
9547 updatable: %v,
9548 min_sdk_version: "29",
9549 }
9550 apex_key {
9551 name: "myapex.key",
9552 }
9553 java_library {
9554 name: "myjavalib",
9555 srcs: ["MyClass.java"],
9556 apex_available: [ "myapex" ],
9557 lint: {
9558 strict_updatability_linting: %v,
9559 },
9560 sdk_version: "current",
9561 min_sdk_version: "29",
9562 }
9563 `
9564 fs := android.MockFS{
9565 "lint-baseline.xml": nil,
9566 }
9567
9568 testCases := []struct {
9569 testCaseName string
9570 apexUpdatable bool
9571 javaStrictUpdtabilityLint bool
9572 lintFileExists bool
9573 disallowedFlagExpected bool
9574 }{
9575 {
9576 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9577 apexUpdatable: true,
9578 javaStrictUpdtabilityLint: true,
9579 lintFileExists: false,
9580 disallowedFlagExpected: false,
9581 },
9582 {
9583 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9584 apexUpdatable: false,
9585 javaStrictUpdtabilityLint: false,
9586 lintFileExists: true,
9587 disallowedFlagExpected: false,
9588 },
9589 {
9590 testCaseName: "non-updatable apex respects strict updatability of javalib",
9591 apexUpdatable: false,
9592 javaStrictUpdtabilityLint: true,
9593 lintFileExists: true,
9594 disallowedFlagExpected: true,
9595 },
9596 {
9597 testCaseName: "updatable apex sets strict updatability of javalib to true",
9598 apexUpdatable: true,
9599 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9600 lintFileExists: true,
9601 disallowedFlagExpected: true,
9602 },
9603 }
9604
9605 for _, testCase := range testCases {
9606 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9607 fixtures := []android.FixturePreparer{}
9608 if testCase.lintFileExists {
9609 fixtures = append(fixtures, fs.AddToFixture())
9610 }
9611
9612 result := testApex(t, bp, fixtures...)
9613 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9614 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9615 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9616
9617 if disallowedFlagActual != testCase.disallowedFlagExpected {
9618 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9619 }
9620 }
9621}
9622
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009623func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9624 bp := `
9625 apex {
9626 name: "myapex",
9627 key: "myapex.key",
9628 java_libs: ["myjavalib"],
9629 updatable: true,
9630 min_sdk_version: "29",
9631 }
9632 apex_key {
9633 name: "myapex.key",
9634 }
9635 java_library {
9636 name: "myjavalib",
9637 srcs: ["MyClass.java"],
9638 apex_available: [ "myapex" ],
9639 sdk_version: "current",
9640 min_sdk_version: "29",
9641 }
9642 `
9643
9644 testCases := []struct {
9645 testCaseName string
9646 moduleDirectory string
9647 disallowedFlagExpected bool
9648 }{
9649 {
9650 testCaseName: "lintable module defined outside libcore",
9651 moduleDirectory: "",
9652 disallowedFlagExpected: true,
9653 },
9654 {
9655 testCaseName: "lintable module defined in libcore root directory",
9656 moduleDirectory: "libcore/",
9657 disallowedFlagExpected: false,
9658 },
9659 {
9660 testCaseName: "lintable module defined in libcore child directory",
9661 moduleDirectory: "libcore/childdir/",
9662 disallowedFlagExpected: true,
9663 },
9664 }
9665
9666 for _, testCase := range testCases {
9667 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9668 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9669 result := testApex(t, "", lintFileCreator, bpFileCreator)
9670 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9671 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9672 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9673 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9674
9675 if disallowedFlagActual != testCase.disallowedFlagExpected {
9676 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9677 }
9678 }
9679}
9680
Spandan Das66773252022-01-15 00:23:18 +00009681// checks transtive deps of an apex coming from bootclasspath_fragment
9682func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9683 bp := `
9684 apex {
9685 name: "myapex",
9686 key: "myapex.key",
9687 bootclasspath_fragments: ["mybootclasspathfragment"],
9688 updatable: true,
9689 min_sdk_version: "29",
9690 }
9691 apex_key {
9692 name: "myapex.key",
9693 }
9694 bootclasspath_fragment {
9695 name: "mybootclasspathfragment",
9696 contents: ["myjavalib"],
9697 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009698 hidden_api: {
9699 split_packages: ["*"],
9700 },
Spandan Das66773252022-01-15 00:23:18 +00009701 }
9702 java_library {
9703 name: "myjavalib",
9704 srcs: ["MyClass.java"],
9705 apex_available: [ "myapex" ],
9706 sdk_version: "current",
9707 min_sdk_version: "29",
9708 compile_dex: true,
9709 }
9710 `
9711 fs := android.MockFS{
9712 "lint-baseline.xml": nil,
9713 }
9714
9715 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9716 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9717 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9718 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9719 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9720 }
9721}
9722
Spandan Das42e89502022-05-06 22:12:55 +00009723// updatable apexes should propagate updatable=true to its apps
9724func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9725 bp := `
9726 apex {
9727 name: "myapex",
9728 key: "myapex.key",
9729 updatable: %v,
9730 apps: [
9731 "myapp",
9732 ],
9733 min_sdk_version: "30",
9734 }
9735 apex_key {
9736 name: "myapex.key",
9737 }
9738 android_app {
9739 name: "myapp",
9740 updatable: %v,
9741 apex_available: [
9742 "myapex",
9743 ],
9744 sdk_version: "current",
9745 min_sdk_version: "30",
9746 }
9747 `
9748 testCases := []struct {
9749 name string
9750 apex_is_updatable_bp bool
9751 app_is_updatable_bp bool
9752 app_is_updatable_expected bool
9753 }{
9754 {
9755 name: "Non-updatable apex respects updatable property of non-updatable app",
9756 apex_is_updatable_bp: false,
9757 app_is_updatable_bp: false,
9758 app_is_updatable_expected: false,
9759 },
9760 {
9761 name: "Non-updatable apex respects updatable property of updatable app",
9762 apex_is_updatable_bp: false,
9763 app_is_updatable_bp: true,
9764 app_is_updatable_expected: true,
9765 },
9766 {
9767 name: "Updatable apex respects updatable property of updatable app",
9768 apex_is_updatable_bp: true,
9769 app_is_updatable_bp: true,
9770 app_is_updatable_expected: true,
9771 },
9772 {
9773 name: "Updatable apex sets updatable=true on non-updatable app",
9774 apex_is_updatable_bp: true,
9775 app_is_updatable_bp: false,
9776 app_is_updatable_expected: true,
9777 },
9778 }
9779 for _, testCase := range testCases {
9780 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9781 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9782 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9783 }
9784}
9785
Kiyoung Kim487689e2022-07-26 09:48:22 +09009786func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9787 bp := `
9788 apex {
9789 name: "myapex",
9790 key: "myapex.key",
9791 native_shared_libs: ["libfoo"],
9792 min_sdk_version: "29",
9793 }
9794 apex_key {
9795 name: "myapex.key",
9796 }
9797 cc_library {
9798 name: "libfoo",
9799 shared_libs: ["libc"],
9800 apex_available: ["myapex"],
9801 min_sdk_version: "29",
9802 }
9803 cc_api_library {
9804 name: "libc",
9805 src: "libc.so",
9806 min_sdk_version: "29",
9807 recovery_available: true,
9808 }
9809 api_imports {
9810 name: "api_imports",
9811 shared_libs: [
9812 "libc",
9813 ],
9814 header_libs: [],
9815 }
9816 `
9817 result := testApex(t, bp)
9818
9819 hasDep := func(m android.Module, wantDep android.Module) bool {
9820 t.Helper()
9821 var found bool
9822 result.VisitDirectDeps(m, func(dep blueprint.Module) {
9823 if dep == wantDep {
9824 found = true
9825 }
9826 })
9827 return found
9828 }
9829
9830 libfooApexVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex29").Module()
9831 libcApexVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared_apex29").Module()
9832
9833 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(libfooApexVariant, libcApexVariant))
9834
9835 // libfoo core variant should be buildable in the same inner tree since
9836 // certain mcombo files might build system and apexes in the same inner tree
9837 // libfoo core variant should link against source libc
9838 libfooCoreVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module()
9839 libcCoreVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared").Module()
9840 android.AssertBoolEquals(t, "core variant should link against source libc", true, hasDep(libfooCoreVariant, libcCoreVariant))
9841}