blob: 3ce9176c76dab9879a4847aa8e70589c5de66fd8 [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__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003332
Vinh Tranf9754732023-01-19 22:41:46 -05003333 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003334 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003335 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003336
Vinh Tranf9754732023-01-19 22:41:46 -05003337 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003338 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003339 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003340
Colin Crossaede88c2020-08-11 12:17:01 -07003341 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3342 // each variant defines additional macros to distinguish which apex variant it is built for
3343
3344 // non-APEX variant does not have __ANDROID_APEX__ defined
3345 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3346 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3347
Vinh Tranf9754732023-01-19 22:41:46 -05003348 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003349 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3350 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003351
Jooyung Hanc87a0592020-03-02 17:44:33 +09003352 // non-APEX variant does not have __ANDROID_APEX__ defined
3353 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3354 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3355
Vinh Tranf9754732023-01-19 22:41:46 -05003356 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003357 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003358 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003359}
Jiyong Park7e636d02019-01-28 16:16:54 +09003360
3361func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003362 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003363 apex {
3364 name: "myapex",
3365 key: "myapex.key",
3366 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003367 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003368 }
3369
3370 apex_key {
3371 name: "myapex.key",
3372 public_key: "testkey.avbpubkey",
3373 private_key: "testkey.pem",
3374 }
3375
3376 cc_library_headers {
3377 name: "mylib_headers",
3378 export_include_dirs: ["my_include"],
3379 system_shared_libs: [],
3380 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003381 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003382 }
3383
3384 cc_library {
3385 name: "mylib",
3386 srcs: ["mylib.cpp"],
3387 system_shared_libs: [],
3388 stl: "none",
3389 header_libs: ["mylib_headers"],
3390 export_header_lib_headers: ["mylib_headers"],
3391 stubs: {
3392 versions: ["1", "2", "3"],
3393 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003394 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003395 }
3396
3397 cc_library {
3398 name: "otherlib",
3399 srcs: ["mylib.cpp"],
3400 system_shared_libs: [],
3401 stl: "none",
3402 shared_libs: ["mylib"],
3403 }
3404 `)
3405
Colin Cross7113d202019-11-20 16:39:12 -08003406 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003407
3408 // Ensure that the include path of the header lib is exported to 'otherlib'
3409 ensureContains(t, cFlags, "-Imy_include")
3410}
Alex Light9670d332019-01-29 18:07:33 -08003411
Jiyong Park7cd10e32020-01-14 09:22:18 +09003412type fileInApex struct {
3413 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003414 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003415 isLink bool
3416}
3417
Jooyung Han1724d582022-12-21 10:17:44 +09003418func (f fileInApex) String() string {
3419 return f.src + ":" + f.path
3420}
3421
3422func (f fileInApex) match(expectation string) bool {
3423 parts := strings.Split(expectation, ":")
3424 if len(parts) == 1 {
3425 match, _ := path.Match(parts[0], f.path)
3426 return match
3427 }
3428 if len(parts) == 2 {
3429 matchSrc, _ := path.Match(parts[0], f.src)
3430 matchDst, _ := path.Match(parts[1], f.path)
3431 return matchSrc && matchDst
3432 }
3433 panic("invalid expected file specification: " + expectation)
3434}
3435
Jooyung Hana57af4a2020-01-23 05:36:59 +00003436func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003437 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003438 module := ctx.ModuleForTests(moduleName, variant)
3439 apexRule := module.MaybeRule("apexRule")
3440 apexDir := "/image.apex/"
3441 if apexRule.Rule == nil {
3442 apexRule = module.Rule("zipApexRule")
3443 apexDir = "/image.zipapex/"
3444 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003445 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003446 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003447 for _, cmd := range strings.Split(copyCmds, "&&") {
3448 cmd = strings.TrimSpace(cmd)
3449 if cmd == "" {
3450 continue
3451 }
3452 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003453 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003454 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003455 switch terms[0] {
3456 case "mkdir":
3457 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003458 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003459 t.Fatal("copyCmds contains invalid cp command", cmd)
3460 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003461 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003462 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003463 isLink = false
3464 case "ln":
3465 if len(terms) != 3 && len(terms) != 4 {
3466 // ln LINK TARGET or ln -s LINK TARGET
3467 t.Fatal("copyCmds contains invalid ln command", cmd)
3468 }
3469 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003470 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003471 isLink = true
3472 default:
3473 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3474 }
3475 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003476 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003477 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003478 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003479 }
Jooyung Han1724d582022-12-21 10:17:44 +09003480 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003481 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003482 }
3483 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003484 return ret
3485}
3486
Jooyung Hana57af4a2020-01-23 05:36:59 +00003487func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3488 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003489 var failed bool
3490 var surplus []string
3491 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003492 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Han1724d582022-12-21 10:17:44 +09003493 matchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003494 for _, expected := range files {
Jooyung Han1724d582022-12-21 10:17:44 +09003495 if file.match(expected) {
3496 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003497 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003498 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003499 }
3500 }
Jooyung Han1724d582022-12-21 10:17:44 +09003501 if !matchFound {
3502 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003503 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003504 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003505
Jooyung Han31c470b2019-10-18 16:26:59 +09003506 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003507 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003508 t.Log("surplus files", surplus)
3509 failed = true
3510 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003511
3512 if len(files) > len(filesMatched) {
3513 var missing []string
3514 for _, expected := range files {
3515 if !filesMatched[expected] {
3516 missing = append(missing, expected)
3517 }
3518 }
3519 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003520 t.Log("missing files", missing)
3521 failed = true
3522 }
3523 if failed {
3524 t.Fail()
3525 }
3526}
3527
Jooyung Han344d5432019-08-23 11:17:39 +09003528func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003529 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003530 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003531 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003532 "etc/llndk.libraries.29.txt",
3533 "etc/vndkcore.libraries.29.txt",
3534 "etc/vndksp.libraries.29.txt",
3535 "etc/vndkprivate.libraries.29.txt",
3536 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003537 }
3538 testCases := []struct {
3539 vndkVersion string
3540 expectedFiles []string
3541 }{
3542 {
3543 vndkVersion: "current",
3544 expectedFiles: append(commonFiles,
3545 "lib/libvndk.so",
3546 "lib/libvndksp.so",
3547 "lib64/libvndk.so",
3548 "lib64/libvndksp.so"),
3549 },
3550 {
3551 vndkVersion: "",
3552 expectedFiles: append(commonFiles,
3553 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3554 "lib/libvndksp.so",
3555 "lib64/libvndksp.so"),
3556 },
3557 }
3558 for _, tc := range testCases {
3559 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3560 ctx := testApex(t, `
3561 apex_vndk {
3562 name: "com.android.vndk.current",
3563 key: "com.android.vndk.current.key",
3564 updatable: false,
3565 }
3566
3567 apex_key {
3568 name: "com.android.vndk.current.key",
3569 public_key: "testkey.avbpubkey",
3570 private_key: "testkey.pem",
3571 }
3572
3573 cc_library {
3574 name: "libvndk",
3575 srcs: ["mylib.cpp"],
3576 vendor_available: true,
3577 product_available: true,
3578 vndk: {
3579 enabled: true,
3580 },
3581 system_shared_libs: [],
3582 stl: "none",
3583 apex_available: [ "com.android.vndk.current" ],
3584 }
3585
3586 cc_library {
3587 name: "libvndksp",
3588 srcs: ["mylib.cpp"],
3589 vendor_available: true,
3590 product_available: true,
3591 vndk: {
3592 enabled: true,
3593 support_system_process: true,
3594 },
3595 system_shared_libs: [],
3596 stl: "none",
3597 apex_available: [ "com.android.vndk.current" ],
3598 }
3599
3600 // VNDK-Ext should not cause any problems
3601
3602 cc_library {
3603 name: "libvndk.ext",
3604 srcs: ["mylib2.cpp"],
3605 vendor: true,
3606 vndk: {
3607 enabled: true,
3608 extends: "libvndk",
3609 },
3610 system_shared_libs: [],
3611 stl: "none",
3612 }
3613
3614 cc_library {
3615 name: "libvndksp.ext",
3616 srcs: ["mylib2.cpp"],
3617 vendor: true,
3618 vndk: {
3619 enabled: true,
3620 support_system_process: true,
3621 extends: "libvndksp",
3622 },
3623 system_shared_libs: [],
3624 stl: "none",
3625 }
3626 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3627 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3628 }))
3629 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3630 })
3631 }
Jooyung Han344d5432019-08-23 11:17:39 +09003632}
3633
3634func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003635 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003636 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003637 name: "com.android.vndk.current",
3638 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003639 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003640 }
3641
3642 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003643 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003644 public_key: "testkey.avbpubkey",
3645 private_key: "testkey.pem",
3646 }
3647
3648 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003649 name: "libvndk",
3650 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003651 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003652 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003653 vndk: {
3654 enabled: true,
3655 },
3656 system_shared_libs: [],
3657 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003658 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003659 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003660
3661 cc_prebuilt_library_shared {
3662 name: "libvndk.arm",
3663 srcs: ["libvndk.arm.so"],
3664 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003665 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003666 vndk: {
3667 enabled: true,
3668 },
3669 enabled: false,
3670 arch: {
3671 arm: {
3672 enabled: true,
3673 },
3674 },
3675 system_shared_libs: [],
3676 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003677 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003678 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003679 `+vndkLibrariesTxtFiles("current"),
3680 withFiles(map[string][]byte{
3681 "libvndk.so": nil,
3682 "libvndk.arm.so": nil,
3683 }))
Colin Cross2807f002021-03-02 10:15:29 -08003684 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003685 "lib/libvndk.so",
3686 "lib/libvndk.arm.so",
3687 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003688 "lib/libc++.so",
3689 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003690 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003691 })
Jooyung Han344d5432019-08-23 11:17:39 +09003692}
3693
Jooyung Han39edb6c2019-11-06 16:53:07 +09003694func vndkLibrariesTxtFiles(vers ...string) (result string) {
3695 for _, v := range vers {
3696 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003697 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003698 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003699 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003700 name: "` + txt + `.libraries.txt",
3701 }
3702 `
3703 }
3704 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003705 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003706 result += `
3707 prebuilt_etc {
3708 name: "` + txt + `.libraries.` + v + `.txt",
3709 src: "dummy.txt",
3710 }
3711 `
3712 }
3713 }
3714 }
3715 return
3716}
3717
Jooyung Han344d5432019-08-23 11:17:39 +09003718func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003719 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003720 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003721 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003722 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003723 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003724 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003725 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003726 }
3727
3728 apex_key {
3729 name: "myapex.key",
3730 public_key: "testkey.avbpubkey",
3731 private_key: "testkey.pem",
3732 }
3733
Jooyung Han31c470b2019-10-18 16:26:59 +09003734 vndk_prebuilt_shared {
3735 name: "libvndk27",
3736 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003737 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003738 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003739 vndk: {
3740 enabled: true,
3741 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003742 target_arch: "arm64",
3743 arch: {
3744 arm: {
3745 srcs: ["libvndk27_arm.so"],
3746 },
3747 arm64: {
3748 srcs: ["libvndk27_arm64.so"],
3749 },
3750 },
Colin Cross2807f002021-03-02 10:15:29 -08003751 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003752 }
3753
3754 vndk_prebuilt_shared {
3755 name: "libvndk27",
3756 version: "27",
3757 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003758 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003759 vndk: {
3760 enabled: true,
3761 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003762 target_arch: "x86_64",
3763 arch: {
3764 x86: {
3765 srcs: ["libvndk27_x86.so"],
3766 },
3767 x86_64: {
3768 srcs: ["libvndk27_x86_64.so"],
3769 },
3770 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003771 }
3772 `+vndkLibrariesTxtFiles("27"),
3773 withFiles(map[string][]byte{
3774 "libvndk27_arm.so": nil,
3775 "libvndk27_arm64.so": nil,
3776 "libvndk27_x86.so": nil,
3777 "libvndk27_x86_64.so": nil,
3778 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003779
Colin Cross2807f002021-03-02 10:15:29 -08003780 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003781 "lib/libvndk27_arm.so",
3782 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003783 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003784 })
Jooyung Han344d5432019-08-23 11:17:39 +09003785}
3786
Jooyung Han90eee022019-10-01 20:02:42 +09003787func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003788 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003789 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003790 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003791 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003792 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003793 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003794 }
3795 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003796 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003797 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003798 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003799 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003800 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003801 }
3802 apex_key {
3803 name: "myapex.key",
3804 public_key: "testkey.avbpubkey",
3805 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003806 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003807
3808 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003809 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003810 actual := proptools.String(bundle.properties.Apex_name)
3811 if !reflect.DeepEqual(actual, expected) {
3812 t.Errorf("Got '%v', expected '%v'", actual, expected)
3813 }
3814 }
3815
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003816 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003817 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003818}
3819
Jooyung Han344d5432019-08-23 11:17:39 +09003820func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003821 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003822 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003823 name: "com.android.vndk.current",
3824 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003825 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003826 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003827 }
3828
3829 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003830 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003831 public_key: "testkey.avbpubkey",
3832 private_key: "testkey.pem",
3833 }
3834
3835 cc_library {
3836 name: "libvndk",
3837 srcs: ["mylib.cpp"],
3838 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003839 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003840 native_bridge_supported: true,
3841 host_supported: true,
3842 vndk: {
3843 enabled: true,
3844 },
3845 system_shared_libs: [],
3846 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003847 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003848 }
Colin Cross2807f002021-03-02 10:15:29 -08003849 `+vndkLibrariesTxtFiles("current"),
3850 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003851
Colin Cross2807f002021-03-02 10:15:29 -08003852 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003853 "lib/libvndk.so",
3854 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003855 "lib/libc++.so",
3856 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003857 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003858 })
Jooyung Han344d5432019-08-23 11:17:39 +09003859}
3860
3861func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003862 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003863 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003864 name: "com.android.vndk.current",
3865 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003866 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003867 native_bridge_supported: true,
3868 }
3869
3870 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003871 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003872 public_key: "testkey.avbpubkey",
3873 private_key: "testkey.pem",
3874 }
3875
3876 cc_library {
3877 name: "libvndk",
3878 srcs: ["mylib.cpp"],
3879 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003880 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003881 native_bridge_supported: true,
3882 host_supported: true,
3883 vndk: {
3884 enabled: true,
3885 },
3886 system_shared_libs: [],
3887 stl: "none",
3888 }
3889 `)
3890}
3891
Jooyung Han31c470b2019-10-18 16:26:59 +09003892func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003893 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003894 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003895 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003896 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003897 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003898 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003899 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003900 }
3901
3902 apex_key {
3903 name: "myapex.key",
3904 public_key: "testkey.avbpubkey",
3905 private_key: "testkey.pem",
3906 }
3907
3908 vndk_prebuilt_shared {
3909 name: "libvndk27",
3910 version: "27",
3911 target_arch: "arm",
3912 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003913 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003914 vndk: {
3915 enabled: true,
3916 },
3917 arch: {
3918 arm: {
3919 srcs: ["libvndk27.so"],
3920 }
3921 },
3922 }
3923
3924 vndk_prebuilt_shared {
3925 name: "libvndk27",
3926 version: "27",
3927 target_arch: "arm",
3928 binder32bit: true,
3929 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003930 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003931 vndk: {
3932 enabled: true,
3933 },
3934 arch: {
3935 arm: {
3936 srcs: ["libvndk27binder32.so"],
3937 }
3938 },
Colin Cross2807f002021-03-02 10:15:29 -08003939 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003940 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003941 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003942 withFiles(map[string][]byte{
3943 "libvndk27.so": nil,
3944 "libvndk27binder32.so": nil,
3945 }),
3946 withBinder32bit,
3947 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003948 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003949 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3950 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003951 },
3952 }),
3953 )
3954
Colin Cross2807f002021-03-02 10:15:29 -08003955 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003956 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003957 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003958 })
3959}
3960
Jooyung Han45a96772020-06-15 14:59:42 +09003961func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003962 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003963 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003964 name: "com.android.vndk.current",
3965 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003966 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003967 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003968 }
3969
3970 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003971 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003972 public_key: "testkey.avbpubkey",
3973 private_key: "testkey.pem",
3974 }
3975
3976 cc_library {
3977 name: "libz",
3978 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003979 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003980 vndk: {
3981 enabled: true,
3982 },
3983 stubs: {
3984 symbol_file: "libz.map.txt",
3985 versions: ["30"],
3986 }
3987 }
3988 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3989 "libz.map.txt": nil,
3990 }))
3991
Colin Cross2807f002021-03-02 10:15:29 -08003992 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003993 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3994 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09003995 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
3996 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
3997 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
3998 "*/*",
3999 })
Jooyung Han45a96772020-06-15 14:59:42 +09004000}
4001
Jooyung Hane1633032019-08-01 17:41:43 +09004002func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004003 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004004 apex {
4005 name: "myapex_nodep",
4006 key: "myapex.key",
4007 native_shared_libs: ["lib_nodep"],
4008 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004009 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004010 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004011 }
4012
4013 apex {
4014 name: "myapex_dep",
4015 key: "myapex.key",
4016 native_shared_libs: ["lib_dep"],
4017 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004018 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004019 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004020 }
4021
4022 apex {
4023 name: "myapex_provider",
4024 key: "myapex.key",
4025 native_shared_libs: ["libfoo"],
4026 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004027 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004028 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004029 }
4030
4031 apex {
4032 name: "myapex_selfcontained",
4033 key: "myapex.key",
4034 native_shared_libs: ["lib_dep", "libfoo"],
4035 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004036 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004037 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004038 }
4039
4040 apex_key {
4041 name: "myapex.key",
4042 public_key: "testkey.avbpubkey",
4043 private_key: "testkey.pem",
4044 }
4045
4046 cc_library {
4047 name: "lib_nodep",
4048 srcs: ["mylib.cpp"],
4049 system_shared_libs: [],
4050 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004051 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004052 }
4053
4054 cc_library {
4055 name: "lib_dep",
4056 srcs: ["mylib.cpp"],
4057 shared_libs: ["libfoo"],
4058 system_shared_libs: [],
4059 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004060 apex_available: [
4061 "myapex_dep",
4062 "myapex_provider",
4063 "myapex_selfcontained",
4064 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004065 }
4066
4067 cc_library {
4068 name: "libfoo",
4069 srcs: ["mytest.cpp"],
4070 stubs: {
4071 versions: ["1"],
4072 },
4073 system_shared_libs: [],
4074 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004075 apex_available: [
4076 "myapex_provider",
4077 "myapex_selfcontained",
4078 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004079 }
4080 `)
4081
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004082 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004083 var provideNativeLibs, requireNativeLibs []string
4084
Sundong Ahnabb64432019-10-22 13:58:29 +09004085 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004086 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4087 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004088 ensureListEmpty(t, provideNativeLibs)
4089 ensureListEmpty(t, requireNativeLibs)
4090
Sundong Ahnabb64432019-10-22 13:58:29 +09004091 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004092 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4093 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004094 ensureListEmpty(t, provideNativeLibs)
4095 ensureListContains(t, requireNativeLibs, "libfoo.so")
4096
Sundong Ahnabb64432019-10-22 13:58:29 +09004097 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004098 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4099 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004100 ensureListContains(t, provideNativeLibs, "libfoo.so")
4101 ensureListEmpty(t, requireNativeLibs)
4102
Sundong Ahnabb64432019-10-22 13:58:29 +09004103 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004104 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4105 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004106 ensureListContains(t, provideNativeLibs, "libfoo.so")
4107 ensureListEmpty(t, requireNativeLibs)
4108}
4109
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004110func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004111 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004112 apex {
4113 name: "myapex",
4114 key: "myapex.key",
4115 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09004116 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004117 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004118 }
4119
4120 apex_key {
4121 name: "myapex.key",
4122 public_key: "testkey.avbpubkey",
4123 private_key: "testkey.pem",
4124 }
Jiyong Parkdb334862020-02-05 17:19:28 +09004125
4126 cc_library {
4127 name: "mylib",
4128 srcs: ["mylib.cpp"],
4129 system_shared_libs: [],
4130 stl: "none",
4131 apex_available: [
4132 "//apex_available:platform",
4133 "myapex",
4134 ],
4135 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004136 `)
4137
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004138 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004139 apexManifestRule := module.Rule("apexManifestRule")
4140 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4141 apexRule := module.Rule("apexRule")
4142 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004143
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004144 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004145 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004146 name := apexBundle.BaseModuleName()
4147 prefix := "TARGET_"
4148 var builder strings.Builder
4149 data.Custom(&builder, name, prefix, "", data)
4150 androidMk := builder.String()
Prerana Patilb1896c82022-11-09 18:14:34 +00004151 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Parkdb334862020-02-05 17:19:28 +09004152 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004153}
4154
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004155func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4156 ctx := testApex(t, `
4157 apex {
4158 name: "myapex",
4159 key: "myapex.key",
4160 apex_name: "com.android.myapex",
4161 native_shared_libs: ["mylib"],
4162 updatable: false,
4163 }
4164
4165 apex_key {
4166 name: "myapex.key",
4167 public_key: "testkey.avbpubkey",
4168 private_key: "testkey.pem",
4169 }
4170
4171 cc_library {
4172 name: "mylib",
4173 srcs: ["mylib.cpp"],
4174 system_shared_libs: [],
4175 stl: "none",
4176 apex_available: [
4177 "//apex_available:platform",
4178 "myapex",
4179 ],
4180 }
4181 `, android.FixtureMergeEnv(map[string]string{
4182 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4183 }))
4184
4185 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
4186 apexManifestRule := module.Rule("apexManifestRule")
4187 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4188}
4189
Vinh Tran8f5310f2022-10-07 18:16:47 -04004190func TestCompileMultilibProp(t *testing.T) {
4191 testCases := []struct {
4192 compileMultiLibProp string
4193 containedLibs []string
4194 notContainedLibs []string
4195 }{
4196 {
4197 containedLibs: []string{
4198 "image.apex/lib64/mylib.so",
4199 "image.apex/lib/mylib.so",
4200 },
4201 compileMultiLibProp: `compile_multilib: "both",`,
4202 },
4203 {
4204 containedLibs: []string{"image.apex/lib64/mylib.so"},
4205 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4206 compileMultiLibProp: `compile_multilib: "first",`,
4207 },
4208 {
4209 containedLibs: []string{"image.apex/lib64/mylib.so"},
4210 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4211 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4212 },
4213 {
4214 containedLibs: []string{"image.apex/lib64/mylib.so"},
4215 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4216 compileMultiLibProp: `compile_multilib: "64",`,
4217 },
4218 {
4219 containedLibs: []string{"image.apex/lib/mylib.so"},
4220 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4221 compileMultiLibProp: `compile_multilib: "32",`,
4222 },
4223 }
4224 for _, testCase := range testCases {
4225 ctx := testApex(t, fmt.Sprintf(`
4226 apex {
4227 name: "myapex",
4228 key: "myapex.key",
4229 %s
4230 native_shared_libs: ["mylib"],
4231 updatable: false,
4232 }
4233 apex_key {
4234 name: "myapex.key",
4235 public_key: "testkey.avbpubkey",
4236 private_key: "testkey.pem",
4237 }
4238 cc_library {
4239 name: "mylib",
4240 srcs: ["mylib.cpp"],
4241 apex_available: [
4242 "//apex_available:platform",
4243 "myapex",
4244 ],
4245 }
4246 `, testCase.compileMultiLibProp),
4247 )
4248 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4249 apexRule := module.Rule("apexRule")
4250 copyCmds := apexRule.Args["copy_commands"]
4251 for _, containedLib := range testCase.containedLibs {
4252 ensureContains(t, copyCmds, containedLib)
4253 }
4254 for _, notContainedLib := range testCase.notContainedLibs {
4255 ensureNotContains(t, copyCmds, notContainedLib)
4256 }
4257 }
4258}
4259
Alex Light0851b882019-02-07 13:20:53 -08004260func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004261 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004262 apex {
4263 name: "myapex",
4264 key: "myapex.key",
4265 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004266 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004267 }
4268
4269 apex_key {
4270 name: "myapex.key",
4271 public_key: "testkey.avbpubkey",
4272 private_key: "testkey.pem",
4273 }
4274
4275 cc_library {
4276 name: "mylib_common",
4277 srcs: ["mylib.cpp"],
4278 system_shared_libs: [],
4279 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004280 apex_available: [
4281 "//apex_available:platform",
4282 "myapex",
4283 ],
Alex Light0851b882019-02-07 13:20:53 -08004284 }
4285 `)
4286
Sundong Ahnabb64432019-10-22 13:58:29 +09004287 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004288 apexRule := module.Rule("apexRule")
4289 copyCmds := apexRule.Args["copy_commands"]
4290
4291 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4292 t.Log("Apex was a test apex!")
4293 t.Fail()
4294 }
4295 // Ensure that main rule creates an output
4296 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4297
4298 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004299 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004300
4301 // Ensure that both direct and indirect deps are copied into apex
4302 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4303
Colin Cross7113d202019-11-20 16:39:12 -08004304 // Ensure that the platform variant ends with _shared
4305 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004306
Colin Cross56a83212020-09-15 18:30:11 -07004307 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004308 t.Log("Found mylib_common not in any apex!")
4309 t.Fail()
4310 }
4311}
4312
4313func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004314 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004315 apex_test {
4316 name: "myapex",
4317 key: "myapex.key",
4318 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004319 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004320 }
4321
4322 apex_key {
4323 name: "myapex.key",
4324 public_key: "testkey.avbpubkey",
4325 private_key: "testkey.pem",
4326 }
4327
4328 cc_library {
4329 name: "mylib_common_test",
4330 srcs: ["mylib.cpp"],
4331 system_shared_libs: [],
4332 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004333 // TODO: remove //apex_available:platform
4334 apex_available: [
4335 "//apex_available:platform",
4336 "myapex",
4337 ],
Alex Light0851b882019-02-07 13:20:53 -08004338 }
4339 `)
4340
Sundong Ahnabb64432019-10-22 13:58:29 +09004341 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004342 apexRule := module.Rule("apexRule")
4343 copyCmds := apexRule.Args["copy_commands"]
4344
4345 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4346 t.Log("Apex was not a test apex!")
4347 t.Fail()
4348 }
4349 // Ensure that main rule creates an output
4350 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4351
4352 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004353 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004354
4355 // Ensure that both direct and indirect deps are copied into apex
4356 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4357
Colin Cross7113d202019-11-20 16:39:12 -08004358 // Ensure that the platform variant ends with _shared
4359 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004360}
4361
Alex Light9670d332019-01-29 18:07:33 -08004362func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004363 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004364 apex {
4365 name: "myapex",
4366 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004367 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004368 multilib: {
4369 first: {
4370 native_shared_libs: ["mylib_common"],
4371 }
4372 },
4373 target: {
4374 android: {
4375 multilib: {
4376 first: {
4377 native_shared_libs: ["mylib"],
4378 }
4379 }
4380 },
4381 host: {
4382 multilib: {
4383 first: {
4384 native_shared_libs: ["mylib2"],
4385 }
4386 }
4387 }
4388 }
4389 }
4390
4391 apex_key {
4392 name: "myapex.key",
4393 public_key: "testkey.avbpubkey",
4394 private_key: "testkey.pem",
4395 }
4396
4397 cc_library {
4398 name: "mylib",
4399 srcs: ["mylib.cpp"],
4400 system_shared_libs: [],
4401 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004402 // TODO: remove //apex_available:platform
4403 apex_available: [
4404 "//apex_available:platform",
4405 "myapex",
4406 ],
Alex Light9670d332019-01-29 18:07:33 -08004407 }
4408
4409 cc_library {
4410 name: "mylib_common",
4411 srcs: ["mylib.cpp"],
4412 system_shared_libs: [],
4413 stl: "none",
4414 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004415 // TODO: remove //apex_available:platform
4416 apex_available: [
4417 "//apex_available:platform",
4418 "myapex",
4419 ],
Alex Light9670d332019-01-29 18:07:33 -08004420 }
4421
4422 cc_library {
4423 name: "mylib2",
4424 srcs: ["mylib.cpp"],
4425 system_shared_libs: [],
4426 stl: "none",
4427 compile_multilib: "first",
4428 }
4429 `)
4430
Sundong Ahnabb64432019-10-22 13:58:29 +09004431 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004432 copyCmds := apexRule.Args["copy_commands"]
4433
4434 // Ensure that main rule creates an output
4435 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4436
4437 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004438 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4439 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4440 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004441
4442 // Ensure that both direct and indirect deps are copied into apex
4443 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4444 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4445 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4446
Colin Cross7113d202019-11-20 16:39:12 -08004447 // Ensure that the platform variant ends with _shared
4448 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4449 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4450 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004451}
Jiyong Park04480cf2019-02-06 00:16:29 +09004452
Jiyong Park59140302020-12-14 18:44:04 +09004453func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004454 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004455 apex {
4456 name: "myapex",
4457 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004458 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004459 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004460 arch: {
4461 arm64: {
4462 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004463 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004464 },
4465 x86_64: {
4466 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004467 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004468 },
4469 }
4470 }
4471
4472 apex_key {
4473 name: "myapex.key",
4474 public_key: "testkey.avbpubkey",
4475 private_key: "testkey.pem",
4476 }
4477
4478 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004479 name: "mylib.generic",
4480 srcs: ["mylib.cpp"],
4481 system_shared_libs: [],
4482 stl: "none",
4483 // TODO: remove //apex_available:platform
4484 apex_available: [
4485 "//apex_available:platform",
4486 "myapex",
4487 ],
4488 }
4489
4490 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004491 name: "mylib.arm64",
4492 srcs: ["mylib.cpp"],
4493 system_shared_libs: [],
4494 stl: "none",
4495 // TODO: remove //apex_available:platform
4496 apex_available: [
4497 "//apex_available:platform",
4498 "myapex",
4499 ],
4500 }
4501
4502 cc_library {
4503 name: "mylib.x64",
4504 srcs: ["mylib.cpp"],
4505 system_shared_libs: [],
4506 stl: "none",
4507 // TODO: remove //apex_available:platform
4508 apex_available: [
4509 "//apex_available:platform",
4510 "myapex",
4511 ],
4512 }
4513 `)
4514
4515 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4516 copyCmds := apexRule.Args["copy_commands"]
4517
4518 // Ensure that apex variant is created for the direct dep
4519 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004520 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004521 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4522
4523 // Ensure that both direct and indirect deps are copied into apex
4524 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4525 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4526}
4527
Jiyong Park04480cf2019-02-06 00:16:29 +09004528func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004529 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004530 apex {
4531 name: "myapex",
4532 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004533 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004534 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004535 }
4536
4537 apex_key {
4538 name: "myapex.key",
4539 public_key: "testkey.avbpubkey",
4540 private_key: "testkey.pem",
4541 }
4542
4543 sh_binary {
4544 name: "myscript",
4545 src: "mylib.cpp",
4546 filename: "myscript.sh",
4547 sub_dir: "script",
4548 }
4549 `)
4550
Sundong Ahnabb64432019-10-22 13:58:29 +09004551 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004552 copyCmds := apexRule.Args["copy_commands"]
4553
4554 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4555}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004556
Jooyung Han91df2082019-11-20 01:49:42 +09004557func TestApexInVariousPartition(t *testing.T) {
4558 testcases := []struct {
4559 propName, parition, flattenedPartition string
4560 }{
4561 {"", "system", "system_ext"},
4562 {"product_specific: true", "product", "product"},
4563 {"soc_specific: true", "vendor", "vendor"},
4564 {"proprietary: true", "vendor", "vendor"},
4565 {"vendor: true", "vendor", "vendor"},
4566 {"system_ext_specific: true", "system_ext", "system_ext"},
4567 }
4568 for _, tc := range testcases {
4569 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004570 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004571 apex {
4572 name: "myapex",
4573 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004574 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004575 `+tc.propName+`
4576 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004577
Jooyung Han91df2082019-11-20 01:49:42 +09004578 apex_key {
4579 name: "myapex.key",
4580 public_key: "testkey.avbpubkey",
4581 private_key: "testkey.pem",
4582 }
4583 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004584
Jooyung Han91df2082019-11-20 01:49:42 +09004585 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004586 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4587 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004588 if actual != expected {
4589 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4590 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004591
Jooyung Han91df2082019-11-20 01:49:42 +09004592 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004593 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4594 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004595 if actual != expected {
4596 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4597 }
4598 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004599 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004600}
Jiyong Park67882562019-03-21 01:11:21 +09004601
Jooyung Han580eb4f2020-06-24 19:33:06 +09004602func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004603 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004604 apex {
4605 name: "myapex",
4606 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004607 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004608 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004609
Jooyung Han580eb4f2020-06-24 19:33:06 +09004610 apex_key {
4611 name: "myapex.key",
4612 public_key: "testkey.avbpubkey",
4613 private_key: "testkey.pem",
4614 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004615 `)
4616 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004617 rule := module.Output("file_contexts")
4618 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4619}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004620
Jooyung Han580eb4f2020-06-24 19:33:06 +09004621func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004622 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004623 apex {
4624 name: "myapex",
4625 key: "myapex.key",
4626 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004627 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004628 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004629
Jooyung Han580eb4f2020-06-24 19:33:06 +09004630 apex_key {
4631 name: "myapex.key",
4632 public_key: "testkey.avbpubkey",
4633 private_key: "testkey.pem",
4634 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004635 `, withFiles(map[string][]byte{
4636 "my_own_file_contexts": nil,
4637 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004638}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004639
Jooyung Han580eb4f2020-06-24 19:33:06 +09004640func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004641 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004642 apex {
4643 name: "myapex",
4644 key: "myapex.key",
4645 product_specific: true,
4646 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004647 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004648 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004649
Jooyung Han580eb4f2020-06-24 19:33:06 +09004650 apex_key {
4651 name: "myapex.key",
4652 public_key: "testkey.avbpubkey",
4653 private_key: "testkey.pem",
4654 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004655 `)
4656
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: "product_specific_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 `, withFiles(map[string][]byte{
4672 "product_specific_file_contexts": nil,
4673 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004674 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4675 rule := module.Output("file_contexts")
4676 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4677}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004678
Jooyung Han580eb4f2020-06-24 19:33:06 +09004679func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004680 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004681 apex {
4682 name: "myapex",
4683 key: "myapex.key",
4684 product_specific: true,
4685 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004686 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004687 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004688
Jooyung Han580eb4f2020-06-24 19:33:06 +09004689 apex_key {
4690 name: "myapex.key",
4691 public_key: "testkey.avbpubkey",
4692 private_key: "testkey.pem",
4693 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004694
Jooyung Han580eb4f2020-06-24 19:33:06 +09004695 filegroup {
4696 name: "my-file-contexts",
4697 srcs: ["product_specific_file_contexts"],
4698 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004699 `, withFiles(map[string][]byte{
4700 "product_specific_file_contexts": nil,
4701 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004702 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4703 rule := module.Output("file_contexts")
4704 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004705}
4706
Jiyong Park67882562019-03-21 01:11:21 +09004707func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004708 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004709 apex_key {
4710 name: "myapex.key",
4711 public_key: ":my.avbpubkey",
4712 private_key: ":my.pem",
4713 product_specific: true,
4714 }
4715
4716 filegroup {
4717 name: "my.avbpubkey",
4718 srcs: ["testkey2.avbpubkey"],
4719 }
4720
4721 filegroup {
4722 name: "my.pem",
4723 srcs: ["testkey2.pem"],
4724 }
4725 `)
4726
4727 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4728 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004729 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004730 if actual_pubkey != expected_pubkey {
4731 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4732 }
4733 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004734 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004735 if actual_privkey != expected_privkey {
4736 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4737 }
4738}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004739
4740func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004741 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004742 prebuilt_apex {
4743 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004744 arch: {
4745 arm64: {
4746 src: "myapex-arm64.apex",
4747 },
4748 arm: {
4749 src: "myapex-arm.apex",
4750 },
4751 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004752 }
4753 `)
4754
Wei Li340ee8e2022-03-18 17:33:24 -07004755 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4756 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004757
Jiyong Parkc95714e2019-03-29 14:23:10 +09004758 expectedInput := "myapex-arm64.apex"
4759 if prebuilt.inputApex.String() != expectedInput {
4760 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4761 }
Wei Li340ee8e2022-03-18 17:33:24 -07004762 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4763 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4764 rule := testingModule.Rule("genProvenanceMetaData")
4765 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4766 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4767 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4768 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004769}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004770
Paul Duffinc0609c62021-03-01 17:27:16 +00004771func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004772 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004773 prebuilt_apex {
4774 name: "myapex",
4775 }
4776 `)
4777}
4778
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004779func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004780 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004781 prebuilt_apex {
4782 name: "myapex",
4783 src: "myapex-arm.apex",
4784 filename: "notmyapex.apex",
4785 }
4786 `)
4787
Wei Li340ee8e2022-03-18 17:33:24 -07004788 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4789 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004790
4791 expected := "notmyapex.apex"
4792 if p.installFilename != expected {
4793 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4794 }
Wei Li340ee8e2022-03-18 17:33:24 -07004795 rule := testingModule.Rule("genProvenanceMetaData")
4796 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4797 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4798 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4799 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004800}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004801
Samiul Islam7c02e262021-09-08 17:48:28 +01004802func TestApexSetFilenameOverride(t *testing.T) {
4803 testApex(t, `
4804 apex_set {
4805 name: "com.company.android.myapex",
4806 apex_name: "com.android.myapex",
4807 set: "company-myapex.apks",
4808 filename: "com.company.android.myapex.apex"
4809 }
4810 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4811
4812 testApex(t, `
4813 apex_set {
4814 name: "com.company.android.myapex",
4815 apex_name: "com.android.myapex",
4816 set: "company-myapex.apks",
4817 filename: "com.company.android.myapex.capex"
4818 }
4819 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4820
4821 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4822 apex_set {
4823 name: "com.company.android.myapex",
4824 apex_name: "com.android.myapex",
4825 set: "company-myapex.apks",
4826 filename: "some-random-suffix"
4827 }
4828 `)
4829}
4830
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004831func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004832 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004833 prebuilt_apex {
4834 name: "myapex.prebuilt",
4835 src: "myapex-arm.apex",
4836 overrides: [
4837 "myapex",
4838 ],
4839 }
4840 `)
4841
Wei Li340ee8e2022-03-18 17:33:24 -07004842 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4843 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004844
4845 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004846 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004847 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004848 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004849 }
Wei Li340ee8e2022-03-18 17:33:24 -07004850 rule := testingModule.Rule("genProvenanceMetaData")
4851 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4852 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4853 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4854 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004855}
4856
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004857func TestPrebuiltApexName(t *testing.T) {
4858 testApex(t, `
4859 prebuilt_apex {
4860 name: "com.company.android.myapex",
4861 apex_name: "com.android.myapex",
4862 src: "company-myapex-arm.apex",
4863 }
4864 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4865
4866 testApex(t, `
4867 apex_set {
4868 name: "com.company.android.myapex",
4869 apex_name: "com.android.myapex",
4870 set: "company-myapex.apks",
4871 }
4872 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4873}
4874
4875func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4876 _ = android.GroupFixturePreparers(
4877 java.PrepareForTestWithJavaDefaultModules,
4878 PrepareForTestWithApexBuildComponents,
4879 android.FixtureWithRootAndroidBp(`
4880 platform_bootclasspath {
4881 name: "platform-bootclasspath",
4882 fragments: [
4883 {
4884 apex: "com.android.art",
4885 module: "art-bootclasspath-fragment",
4886 },
4887 ],
4888 }
4889
4890 prebuilt_apex {
4891 name: "com.company.android.art",
4892 apex_name: "com.android.art",
4893 src: "com.company.android.art-arm.apex",
4894 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4895 }
4896
4897 prebuilt_bootclasspath_fragment {
4898 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004899 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004900 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004901 hidden_api: {
4902 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4903 metadata: "my-bootclasspath-fragment/metadata.csv",
4904 index: "my-bootclasspath-fragment/index.csv",
4905 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4906 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4907 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004908 }
4909
4910 java_import {
4911 name: "core-oj",
4912 jars: ["prebuilt.jar"],
4913 }
4914 `),
4915 ).RunTest(t)
4916}
4917
Paul Duffin092153d2021-01-26 11:42:39 +00004918// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4919// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004920func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004921 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004922
Paul Duffin89886cb2021-02-05 16:44:03 +00004923 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004924 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004925 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004926 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004927 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004928 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004929 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4930 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4931 android.NormalizePathForTesting(dexJarBuildPath))
4932 }
4933
4934 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004935 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004936 // Make sure the import has been given the correct path to the dex jar.
4937 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4938 dexJarBuildPath := p.DexJarInstallPath()
4939 stem := android.RemoveOptionalPrebuiltPrefix(name)
4940 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4941 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4942 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004943 }
4944
Paul Duffin39853512021-02-26 11:09:39 +00004945 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004946 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004947 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004948 android.AssertArrayString(t, "Check if there is no source variant",
4949 []string{"android_common"},
4950 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004951 }
4952
4953 t.Run("prebuilt only", func(t *testing.T) {
4954 bp := `
4955 prebuilt_apex {
4956 name: "myapex",
4957 arch: {
4958 arm64: {
4959 src: "myapex-arm64.apex",
4960 },
4961 arm: {
4962 src: "myapex-arm.apex",
4963 },
4964 },
Paul Duffin39853512021-02-26 11:09:39 +00004965 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004966 }
4967
4968 java_import {
4969 name: "libfoo",
4970 jars: ["libfoo.jar"],
4971 }
Paul Duffin39853512021-02-26 11:09:39 +00004972
4973 java_sdk_library_import {
4974 name: "libbar",
4975 public: {
4976 jars: ["libbar.jar"],
4977 },
4978 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004979 `
4980
4981 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4982 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4983
Martin Stjernholm44825602021-09-17 01:44:12 +01004984 deapexerName := deapexerModuleName("myapex")
4985 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4986
Paul Duffinf6932af2021-02-26 18:21:56 +00004987 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004988 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004989 rule := deapexer.Rule("deapexer")
4990 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4991 t.Errorf("expected: %q, found: %q", expected, actual)
4992 }
4993
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004994 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004995 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004996 rule = prebuiltApex.Rule("android/soong/android.Cp")
4997 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4998 t.Errorf("expected: %q, found: %q", expected, actual)
4999 }
5000
Paul Duffin89886cb2021-02-05 16:44:03 +00005001 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005002 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005003
5004 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005005 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005006 })
5007
5008 t.Run("prebuilt with source preferred", func(t *testing.T) {
5009
5010 bp := `
5011 prebuilt_apex {
5012 name: "myapex",
5013 arch: {
5014 arm64: {
5015 src: "myapex-arm64.apex",
5016 },
5017 arm: {
5018 src: "myapex-arm.apex",
5019 },
5020 },
Paul Duffin39853512021-02-26 11:09:39 +00005021 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005022 }
5023
5024 java_import {
5025 name: "libfoo",
5026 jars: ["libfoo.jar"],
5027 }
5028
5029 java_library {
5030 name: "libfoo",
5031 }
Paul Duffin39853512021-02-26 11:09:39 +00005032
5033 java_sdk_library_import {
5034 name: "libbar",
5035 public: {
5036 jars: ["libbar.jar"],
5037 },
5038 }
5039
5040 java_sdk_library {
5041 name: "libbar",
5042 srcs: ["foo/bar/MyClass.java"],
5043 unsafe_ignore_missing_latest_api: true,
5044 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005045 `
5046
5047 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5048 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5049
Paul Duffin89886cb2021-02-05 16:44:03 +00005050 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005051 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005052 ensureNoSourceVariant(t, ctx, "libfoo")
5053
5054 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005055 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005056 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005057 })
5058
5059 t.Run("prebuilt preferred with source", func(t *testing.T) {
5060 bp := `
5061 prebuilt_apex {
5062 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005063 arch: {
5064 arm64: {
5065 src: "myapex-arm64.apex",
5066 },
5067 arm: {
5068 src: "myapex-arm.apex",
5069 },
5070 },
Paul Duffin39853512021-02-26 11:09:39 +00005071 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005072 }
5073
5074 java_import {
5075 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005076 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005077 jars: ["libfoo.jar"],
5078 }
5079
5080 java_library {
5081 name: "libfoo",
5082 }
Paul Duffin39853512021-02-26 11:09:39 +00005083
5084 java_sdk_library_import {
5085 name: "libbar",
5086 prefer: true,
5087 public: {
5088 jars: ["libbar.jar"],
5089 },
5090 }
5091
5092 java_sdk_library {
5093 name: "libbar",
5094 srcs: ["foo/bar/MyClass.java"],
5095 unsafe_ignore_missing_latest_api: true,
5096 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005097 `
5098
5099 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5100 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5101
Paul Duffin89886cb2021-02-05 16:44:03 +00005102 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005103 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005104 ensureNoSourceVariant(t, ctx, "libfoo")
5105
5106 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005107 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005108 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005109 })
5110}
5111
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005112func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005113 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005114 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005115 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5116 // is disabled.
5117 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5118 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005119
Paul Duffin37856732021-02-26 14:24:15 +00005120 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5121 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005122 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005123 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005124 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005125 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005126 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005127 foundLibfooJar = true
5128 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005129 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005130 }
5131 }
5132 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005133 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 +00005134 }
5135 }
5136
Paul Duffin40a3f652021-07-19 13:11:24 +01005137 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005138 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005139 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005140 var rule android.TestingBuildParams
5141
5142 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5143 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005144 }
5145
Paul Duffin40a3f652021-07-19 13:11:24 +01005146 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5147 t.Helper()
5148 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5149 var rule android.TestingBuildParams
5150
5151 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5152 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5153 }
5154
Paul Duffin89f570a2021-06-16 01:42:33 +01005155 fragment := java.ApexVariantReference{
5156 Apex: proptools.StringPtr("myapex"),
5157 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5158 }
5159
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005160 t.Run("prebuilt only", func(t *testing.T) {
5161 bp := `
5162 prebuilt_apex {
5163 name: "myapex",
5164 arch: {
5165 arm64: {
5166 src: "myapex-arm64.apex",
5167 },
5168 arm: {
5169 src: "myapex-arm.apex",
5170 },
5171 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005172 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5173 }
5174
5175 prebuilt_bootclasspath_fragment {
5176 name: "my-bootclasspath-fragment",
5177 contents: ["libfoo", "libbar"],
5178 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005179 hidden_api: {
5180 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5181 metadata: "my-bootclasspath-fragment/metadata.csv",
5182 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005183 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5184 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5185 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005186 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005187 }
5188
5189 java_import {
5190 name: "libfoo",
5191 jars: ["libfoo.jar"],
5192 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005193 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005194 }
Paul Duffin37856732021-02-26 14:24:15 +00005195
5196 java_sdk_library_import {
5197 name: "libbar",
5198 public: {
5199 jars: ["libbar.jar"],
5200 },
5201 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005202 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005203 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005204 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005205 `
5206
Paul Duffin89f570a2021-06-16 01:42:33 +01005207 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005208 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5209 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005210
Paul Duffin537ea3d2021-05-14 10:38:00 +01005211 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005212 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005213 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005214 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005215 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5216 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005217 })
5218
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005219 t.Run("apex_set only", func(t *testing.T) {
5220 bp := `
5221 apex_set {
5222 name: "myapex",
5223 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005224 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5225 }
5226
5227 prebuilt_bootclasspath_fragment {
5228 name: "my-bootclasspath-fragment",
5229 contents: ["libfoo", "libbar"],
5230 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005231 hidden_api: {
5232 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5233 metadata: "my-bootclasspath-fragment/metadata.csv",
5234 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005235 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5236 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5237 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005238 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005239 }
5240
5241 java_import {
5242 name: "libfoo",
5243 jars: ["libfoo.jar"],
5244 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005245 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005246 }
5247
5248 java_sdk_library_import {
5249 name: "libbar",
5250 public: {
5251 jars: ["libbar.jar"],
5252 },
5253 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005254 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005255 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005256 }
5257 `
5258
Paul Duffin89f570a2021-06-16 01:42:33 +01005259 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005260 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5261 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5262
Paul Duffin537ea3d2021-05-14 10:38:00 +01005263 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005264 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005265 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005266 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005267 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5268 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005269 })
5270
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005271 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5272 bp := `
5273 prebuilt_apex {
5274 name: "myapex",
5275 arch: {
5276 arm64: {
5277 src: "myapex-arm64.apex",
5278 },
5279 arm: {
5280 src: "myapex-arm.apex",
5281 },
5282 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005283 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5284 }
5285
5286 prebuilt_bootclasspath_fragment {
5287 name: "my-bootclasspath-fragment",
5288 contents: ["libfoo", "libbar"],
5289 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005290 hidden_api: {
5291 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5292 metadata: "my-bootclasspath-fragment/metadata.csv",
5293 index: "my-bootclasspath-fragment/index.csv",
5294 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5295 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5296 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005297 }
5298
5299 java_import {
5300 name: "libfoo",
5301 jars: ["libfoo.jar"],
5302 apex_available: ["myapex"],
5303 }
5304
5305 java_library {
5306 name: "libfoo",
5307 srcs: ["foo/bar/MyClass.java"],
5308 apex_available: ["myapex"],
5309 }
Paul Duffin37856732021-02-26 14:24:15 +00005310
5311 java_sdk_library_import {
5312 name: "libbar",
5313 public: {
5314 jars: ["libbar.jar"],
5315 },
5316 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005317 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005318 }
5319
5320 java_sdk_library {
5321 name: "libbar",
5322 srcs: ["foo/bar/MyClass.java"],
5323 unsafe_ignore_missing_latest_api: true,
5324 apex_available: ["myapex"],
5325 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005326 `
5327
5328 // In this test the source (java_library) libfoo is active since the
5329 // prebuilt (java_import) defaults to prefer:false. However the
5330 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5331 // find the dex boot jar in it. We either need to disable the source libfoo
5332 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005333 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005334 // dexbootjar check is skipped if AllowMissingDependencies is true
5335 preparerAllowMissingDeps := android.GroupFixturePreparers(
5336 preparer,
5337 android.PrepareForTestWithAllowMissingDependencies,
5338 )
5339 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005340 })
5341
5342 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5343 bp := `
5344 prebuilt_apex {
5345 name: "myapex",
5346 arch: {
5347 arm64: {
5348 src: "myapex-arm64.apex",
5349 },
5350 arm: {
5351 src: "myapex-arm.apex",
5352 },
5353 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005354 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5355 }
5356
5357 prebuilt_bootclasspath_fragment {
5358 name: "my-bootclasspath-fragment",
5359 contents: ["libfoo", "libbar"],
5360 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005361 hidden_api: {
5362 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5363 metadata: "my-bootclasspath-fragment/metadata.csv",
5364 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005365 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5366 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5367 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005368 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005369 }
5370
5371 java_import {
5372 name: "libfoo",
5373 prefer: true,
5374 jars: ["libfoo.jar"],
5375 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005376 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005377 }
5378
5379 java_library {
5380 name: "libfoo",
5381 srcs: ["foo/bar/MyClass.java"],
5382 apex_available: ["myapex"],
5383 }
Paul Duffin37856732021-02-26 14:24:15 +00005384
5385 java_sdk_library_import {
5386 name: "libbar",
5387 prefer: true,
5388 public: {
5389 jars: ["libbar.jar"],
5390 },
5391 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005392 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005393 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005394 }
5395
5396 java_sdk_library {
5397 name: "libbar",
5398 srcs: ["foo/bar/MyClass.java"],
5399 unsafe_ignore_missing_latest_api: true,
5400 apex_available: ["myapex"],
5401 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005402 `
5403
Paul Duffin89f570a2021-06-16 01:42:33 +01005404 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005405 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5406 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005407
Paul Duffin537ea3d2021-05-14 10:38:00 +01005408 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005409 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005410 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005411 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005412 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5413 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005414 })
5415
5416 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5417 bp := `
5418 apex {
5419 name: "myapex",
5420 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005421 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005422 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005423 }
5424
5425 apex_key {
5426 name: "myapex.key",
5427 public_key: "testkey.avbpubkey",
5428 private_key: "testkey.pem",
5429 }
5430
5431 prebuilt_apex {
5432 name: "myapex",
5433 arch: {
5434 arm64: {
5435 src: "myapex-arm64.apex",
5436 },
5437 arm: {
5438 src: "myapex-arm.apex",
5439 },
5440 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005441 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5442 }
5443
5444 prebuilt_bootclasspath_fragment {
5445 name: "my-bootclasspath-fragment",
5446 contents: ["libfoo", "libbar"],
5447 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005448 hidden_api: {
5449 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5450 metadata: "my-bootclasspath-fragment/metadata.csv",
5451 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005452 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5453 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5454 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005455 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005456 }
5457
5458 java_import {
5459 name: "libfoo",
5460 jars: ["libfoo.jar"],
5461 apex_available: ["myapex"],
5462 }
5463
5464 java_library {
5465 name: "libfoo",
5466 srcs: ["foo/bar/MyClass.java"],
5467 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005468 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005469 }
Paul Duffin37856732021-02-26 14:24:15 +00005470
5471 java_sdk_library_import {
5472 name: "libbar",
5473 public: {
5474 jars: ["libbar.jar"],
5475 },
5476 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005477 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005478 }
5479
5480 java_sdk_library {
5481 name: "libbar",
5482 srcs: ["foo/bar/MyClass.java"],
5483 unsafe_ignore_missing_latest_api: true,
5484 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005485 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005486 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005487 `
5488
Paul Duffin89f570a2021-06-16 01:42:33 +01005489 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005490 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5491 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005492
Paul Duffin537ea3d2021-05-14 10:38:00 +01005493 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005494 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005495 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005496 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005497 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5498 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005499 })
5500
5501 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5502 bp := `
5503 apex {
5504 name: "myapex",
5505 enabled: false,
5506 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005507 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005508 }
5509
5510 apex_key {
5511 name: "myapex.key",
5512 public_key: "testkey.avbpubkey",
5513 private_key: "testkey.pem",
5514 }
5515
5516 prebuilt_apex {
5517 name: "myapex",
5518 arch: {
5519 arm64: {
5520 src: "myapex-arm64.apex",
5521 },
5522 arm: {
5523 src: "myapex-arm.apex",
5524 },
5525 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005526 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5527 }
5528
5529 prebuilt_bootclasspath_fragment {
5530 name: "my-bootclasspath-fragment",
5531 contents: ["libfoo", "libbar"],
5532 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005533 hidden_api: {
5534 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5535 metadata: "my-bootclasspath-fragment/metadata.csv",
5536 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005537 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5538 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5539 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005540 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005541 }
5542
5543 java_import {
5544 name: "libfoo",
5545 prefer: true,
5546 jars: ["libfoo.jar"],
5547 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005548 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005549 }
5550
5551 java_library {
5552 name: "libfoo",
5553 srcs: ["foo/bar/MyClass.java"],
5554 apex_available: ["myapex"],
5555 }
Paul Duffin37856732021-02-26 14:24:15 +00005556
5557 java_sdk_library_import {
5558 name: "libbar",
5559 prefer: true,
5560 public: {
5561 jars: ["libbar.jar"],
5562 },
5563 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005564 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005565 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005566 }
5567
5568 java_sdk_library {
5569 name: "libbar",
5570 srcs: ["foo/bar/MyClass.java"],
5571 unsafe_ignore_missing_latest_api: true,
5572 apex_available: ["myapex"],
5573 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005574 `
5575
Paul Duffin89f570a2021-06-16 01:42:33 +01005576 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005577 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5578 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005579
Paul Duffin537ea3d2021-05-14 10:38:00 +01005580 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005581 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005582 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005583 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005584 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5585 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005586 })
5587}
5588
Roland Levillain630846d2019-06-26 12:48:34 +01005589func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005590 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005591 apex_test {
5592 name: "myapex",
5593 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005594 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005595 tests: [
5596 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005597 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005598 ],
5599 }
5600
5601 apex_key {
5602 name: "myapex.key",
5603 public_key: "testkey.avbpubkey",
5604 private_key: "testkey.pem",
5605 }
5606
Liz Kammer1c14a212020-05-12 15:26:55 -07005607 filegroup {
5608 name: "fg",
5609 srcs: [
5610 "baz",
5611 "bar/baz"
5612 ],
5613 }
5614
Roland Levillain630846d2019-06-26 12:48:34 +01005615 cc_test {
5616 name: "mytest",
5617 gtest: false,
5618 srcs: ["mytest.cpp"],
5619 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005620 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005621 system_shared_libs: [],
5622 static_executable: true,
5623 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005624 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005625 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005626
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005627 cc_library {
5628 name: "mylib",
5629 srcs: ["mylib.cpp"],
5630 system_shared_libs: [],
5631 stl: "none",
5632 }
5633
Liz Kammer5bd365f2020-05-27 15:15:11 -07005634 filegroup {
5635 name: "fg2",
5636 srcs: [
5637 "testdata/baz"
5638 ],
5639 }
5640
Roland Levillain9b5fde92019-06-28 15:41:19 +01005641 cc_test {
5642 name: "mytests",
5643 gtest: false,
5644 srcs: [
5645 "mytest1.cpp",
5646 "mytest2.cpp",
5647 "mytest3.cpp",
5648 ],
5649 test_per_src: true,
5650 relative_install_path: "test",
5651 system_shared_libs: [],
5652 static_executable: true,
5653 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005654 data: [
5655 ":fg",
5656 ":fg2",
5657 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005658 }
Roland Levillain630846d2019-06-26 12:48:34 +01005659 `)
5660
Sundong Ahnabb64432019-10-22 13:58:29 +09005661 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005662 copyCmds := apexRule.Args["copy_commands"]
5663
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005664 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005665 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005666 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005667
Liz Kammer1c14a212020-05-12 15:26:55 -07005668 //Ensure that test data are copied into apex.
5669 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5670 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5671
Roland Levillain9b5fde92019-06-28 15:41:19 +01005672 // Ensure that test deps built with `test_per_src` are copied into apex.
5673 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5674 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5675 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005676
5677 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005678 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005679 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005680 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005681 prefix := "TARGET_"
5682 var builder strings.Builder
5683 data.Custom(&builder, name, prefix, "", data)
5684 androidMk := builder.String()
Prerana Patilb1896c82022-11-09 18:14:34 +00005685 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5686 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5687 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5688 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
5689 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
5690 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005691 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005692
5693 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005694 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005695 data.Custom(&builder, name, prefix, "", data)
5696 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005697 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5698 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005699}
5700
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005701func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005702 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005703 apex {
5704 name: "myapex",
5705 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005706 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005707 }
5708 apex_key {
5709 name: "myapex.key",
5710 public_key: "testkey.avbpubkey",
5711 private_key: "testkey.pem",
5712 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005713 `,
5714 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5715 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5716 }),
5717 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005718 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005719 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005720 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005721 var builder strings.Builder
5722 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5723 androidMk := builder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08005724 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex myapex.flattened\n")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005725}
5726
Jooyung Hand48f3c32019-08-23 11:18:57 +09005727func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5728 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5729 apex {
5730 name: "myapex",
5731 key: "myapex.key",
5732 native_shared_libs: ["libfoo"],
5733 }
5734
5735 apex_key {
5736 name: "myapex.key",
5737 public_key: "testkey.avbpubkey",
5738 private_key: "testkey.pem",
5739 }
5740
5741 cc_library {
5742 name: "libfoo",
5743 stl: "none",
5744 system_shared_libs: [],
5745 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005746 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005747 }
5748 `)
5749 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5750 apex {
5751 name: "myapex",
5752 key: "myapex.key",
5753 java_libs: ["myjar"],
5754 }
5755
5756 apex_key {
5757 name: "myapex.key",
5758 public_key: "testkey.avbpubkey",
5759 private_key: "testkey.pem",
5760 }
5761
5762 java_library {
5763 name: "myjar",
5764 srcs: ["foo/bar/MyClass.java"],
5765 sdk_version: "none",
5766 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005767 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005768 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005769 }
5770 `)
5771}
5772
Bill Peckhama41a6962021-01-11 10:58:54 -08005773func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005774 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005775 apex {
5776 name: "myapex",
5777 key: "myapex.key",
5778 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005779 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005780 }
5781
5782 apex_key {
5783 name: "myapex.key",
5784 public_key: "testkey.avbpubkey",
5785 private_key: "testkey.pem",
5786 }
5787
5788 java_import {
5789 name: "myjavaimport",
5790 apex_available: ["myapex"],
5791 jars: ["my.jar"],
5792 compile_dex: true,
5793 }
5794 `)
5795
5796 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5797 apexRule := module.Rule("apexRule")
5798 copyCmds := apexRule.Args["copy_commands"]
5799 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5800}
5801
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005802func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005803 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005804 apex {
5805 name: "myapex",
5806 key: "myapex.key",
5807 apps: [
5808 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005809 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005810 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005811 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005812 }
5813
5814 apex_key {
5815 name: "myapex.key",
5816 public_key: "testkey.avbpubkey",
5817 private_key: "testkey.pem",
5818 }
5819
5820 android_app {
5821 name: "AppFoo",
5822 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005823 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005824 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005825 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005826 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005827 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005828 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005829
5830 android_app {
5831 name: "AppFooPriv",
5832 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005833 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005834 system_modules: "none",
5835 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005836 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005837 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005838 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005839
5840 cc_library_shared {
5841 name: "libjni",
5842 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005843 shared_libs: ["libfoo"],
5844 stl: "none",
5845 system_shared_libs: [],
5846 apex_available: [ "myapex" ],
5847 sdk_version: "current",
5848 }
5849
5850 cc_library_shared {
5851 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005852 stl: "none",
5853 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005854 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005855 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005856 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005857 `)
5858
Sundong Ahnabb64432019-10-22 13:58:29 +09005859 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005860 apexRule := module.Rule("apexRule")
5861 copyCmds := apexRule.Args["copy_commands"]
5862
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005863 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5864 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005865
Colin Crossaede88c2020-08-11 12:17:01 -07005866 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005867 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005868 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005869 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005870 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005871 // JNI libraries including transitive deps are
5872 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005873 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005874 // ... embedded inside APK (jnilibs.zip)
5875 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5876 // ... and not directly inside the APEX
5877 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5878 }
Dario Frenicde2a032019-10-27 00:29:22 +01005879}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005880
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005881func TestApexWithAppImportBuildId(t *testing.T) {
5882 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5883 for _, id := range invalidBuildIds {
5884 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5885 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5886 variables.BuildId = proptools.StringPtr(id)
5887 })
5888 testApexError(t, message, `apex {
5889 name: "myapex",
5890 key: "myapex.key",
5891 apps: ["AppFooPrebuilt"],
5892 updatable: false,
5893 }
5894
5895 apex_key {
5896 name: "myapex.key",
5897 public_key: "testkey.avbpubkey",
5898 private_key: "testkey.pem",
5899 }
5900
5901 android_app_import {
5902 name: "AppFooPrebuilt",
5903 apk: "PrebuiltAppFoo.apk",
5904 presigned: true,
5905 apex_available: ["myapex"],
5906 }
5907 `, fixture)
5908 }
5909}
5910
Dario Frenicde2a032019-10-27 00:29:22 +01005911func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005912 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005913 apex {
5914 name: "myapex",
5915 key: "myapex.key",
5916 apps: [
5917 "AppFooPrebuilt",
5918 "AppFooPrivPrebuilt",
5919 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005920 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005921 }
5922
5923 apex_key {
5924 name: "myapex.key",
5925 public_key: "testkey.avbpubkey",
5926 private_key: "testkey.pem",
5927 }
5928
5929 android_app_import {
5930 name: "AppFooPrebuilt",
5931 apk: "PrebuiltAppFoo.apk",
5932 presigned: true,
5933 dex_preopt: {
5934 enabled: false,
5935 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005936 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005937 }
5938
5939 android_app_import {
5940 name: "AppFooPrivPrebuilt",
5941 apk: "PrebuiltAppFooPriv.apk",
5942 privileged: true,
5943 presigned: true,
5944 dex_preopt: {
5945 enabled: false,
5946 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005947 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005948 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005949 }
5950 `)
5951
Sundong Ahnabb64432019-10-22 13:58:29 +09005952 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005953 apexRule := module.Rule("apexRule")
5954 copyCmds := apexRule.Args["copy_commands"]
5955
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005956 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5957 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005958}
5959
5960func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005961 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005962 apex {
5963 name: "myapex",
5964 key: "myapex.key",
5965 apps: [
5966 "AppFoo",
5967 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005968 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005969 }
5970
5971 apex_key {
5972 name: "myapex.key",
5973 public_key: "testkey.avbpubkey",
5974 private_key: "testkey.pem",
5975 }
5976
5977 android_app {
5978 name: "AppFoo",
5979 srcs: ["foo/bar/MyClass.java"],
5980 sdk_version: "none",
5981 system_modules: "none",
5982 apex_available: [ "myapex" ],
5983 }
5984
5985 android_app_import {
5986 name: "AppFoo",
5987 apk: "AppFooPrebuilt.apk",
5988 filename: "AppFooPrebuilt.apk",
5989 presigned: true,
5990 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005991 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005992 }
5993 `, withFiles(map[string][]byte{
5994 "AppFooPrebuilt.apk": nil,
5995 }))
5996
5997 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005998 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005999 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006000}
6001
Dario Freni6f3937c2019-12-20 22:58:03 +00006002func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006003 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006004 apex {
6005 name: "myapex",
6006 key: "myapex.key",
6007 apps: [
6008 "TesterHelpAppFoo",
6009 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006010 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006011 }
6012
6013 apex_key {
6014 name: "myapex.key",
6015 public_key: "testkey.avbpubkey",
6016 private_key: "testkey.pem",
6017 }
6018
6019 android_test_helper_app {
6020 name: "TesterHelpAppFoo",
6021 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006022 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006023 }
6024
6025 `)
6026
6027 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6028 apexRule := module.Rule("apexRule")
6029 copyCmds := apexRule.Args["copy_commands"]
6030
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006031 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006032}
6033
Jooyung Han18020ea2019-11-13 10:50:48 +09006034func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6035 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006036 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006037 apex {
6038 name: "myapex",
6039 key: "myapex.key",
6040 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006041 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006042 }
6043
6044 apex_key {
6045 name: "myapex.key",
6046 public_key: "testkey.avbpubkey",
6047 private_key: "testkey.pem",
6048 }
6049
6050 apex {
6051 name: "otherapex",
6052 key: "myapex.key",
6053 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006054 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006055 }
6056
6057 cc_defaults {
6058 name: "libfoo-defaults",
6059 apex_available: ["otherapex"],
6060 }
6061
6062 cc_library {
6063 name: "libfoo",
6064 defaults: ["libfoo-defaults"],
6065 stl: "none",
6066 system_shared_libs: [],
6067 }`)
6068}
6069
Paul Duffine52e66f2020-03-30 17:54:29 +01006070func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006071 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006072 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006073 apex {
6074 name: "myapex",
6075 key: "myapex.key",
6076 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006077 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006078 }
6079
6080 apex_key {
6081 name: "myapex.key",
6082 public_key: "testkey.avbpubkey",
6083 private_key: "testkey.pem",
6084 }
6085
6086 apex {
6087 name: "otherapex",
6088 key: "otherapex.key",
6089 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006090 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006091 }
6092
6093 apex_key {
6094 name: "otherapex.key",
6095 public_key: "testkey.avbpubkey",
6096 private_key: "testkey.pem",
6097 }
6098
6099 cc_library {
6100 name: "libfoo",
6101 stl: "none",
6102 system_shared_libs: [],
6103 apex_available: ["otherapex"],
6104 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006105}
Jiyong Park127b40b2019-09-30 16:04:35 +09006106
Paul Duffine52e66f2020-03-30 17:54:29 +01006107func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006108 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006109 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006110.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006111.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006112.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006113.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006114.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006115.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006116 apex {
6117 name: "myapex",
6118 key: "myapex.key",
6119 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006120 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006121 }
6122
6123 apex_key {
6124 name: "myapex.key",
6125 public_key: "testkey.avbpubkey",
6126 private_key: "testkey.pem",
6127 }
6128
Jiyong Park127b40b2019-09-30 16:04:35 +09006129 cc_library {
6130 name: "libfoo",
6131 stl: "none",
6132 shared_libs: ["libbar"],
6133 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006134 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006135 }
6136
6137 cc_library {
6138 name: "libbar",
6139 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006140 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006141 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006142 apex_available: ["myapex"],
6143 }
6144
6145 cc_library {
6146 name: "libbaz",
6147 stl: "none",
6148 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006149 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006150}
Jiyong Park127b40b2019-09-30 16:04:35 +09006151
Paul Duffine52e66f2020-03-30 17:54:29 +01006152func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006153 testApexError(t, "\"otherapex\" is not a valid module name", `
6154 apex {
6155 name: "myapex",
6156 key: "myapex.key",
6157 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006158 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006159 }
6160
6161 apex_key {
6162 name: "myapex.key",
6163 public_key: "testkey.avbpubkey",
6164 private_key: "testkey.pem",
6165 }
6166
6167 cc_library {
6168 name: "libfoo",
6169 stl: "none",
6170 system_shared_libs: [],
6171 apex_available: ["otherapex"],
6172 }`)
6173
Paul Duffine52e66f2020-03-30 17:54:29 +01006174 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006175 apex {
6176 name: "myapex",
6177 key: "myapex.key",
6178 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006179 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006180 }
6181
6182 apex_key {
6183 name: "myapex.key",
6184 public_key: "testkey.avbpubkey",
6185 private_key: "testkey.pem",
6186 }
6187
6188 cc_library {
6189 name: "libfoo",
6190 stl: "none",
6191 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006192 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006193 apex_available: ["myapex"],
6194 }
6195
6196 cc_library {
6197 name: "libbar",
6198 stl: "none",
6199 system_shared_libs: [],
6200 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006201 }
6202
6203 cc_library {
6204 name: "libbaz",
6205 stl: "none",
6206 system_shared_libs: [],
6207 stubs: {
6208 versions: ["10", "20", "30"],
6209 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006210 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006211}
Jiyong Park127b40b2019-09-30 16:04:35 +09006212
Jiyong Park89e850a2020-04-07 16:37:39 +09006213func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006214 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006215 apex {
6216 name: "myapex",
6217 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006218 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006219 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006220 }
6221
6222 apex_key {
6223 name: "myapex.key",
6224 public_key: "testkey.avbpubkey",
6225 private_key: "testkey.pem",
6226 }
6227
6228 cc_library {
6229 name: "libfoo",
6230 stl: "none",
6231 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006232 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006233 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006234 }
6235
6236 cc_library {
6237 name: "libfoo2",
6238 stl: "none",
6239 system_shared_libs: [],
6240 shared_libs: ["libbaz"],
6241 apex_available: ["//apex_available:platform"],
6242 }
6243
6244 cc_library {
6245 name: "libbar",
6246 stl: "none",
6247 system_shared_libs: [],
6248 apex_available: ["myapex"],
6249 }
6250
6251 cc_library {
6252 name: "libbaz",
6253 stl: "none",
6254 system_shared_libs: [],
6255 apex_available: ["myapex"],
6256 stubs: {
6257 versions: ["1"],
6258 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006259 }`)
6260
Jiyong Park89e850a2020-04-07 16:37:39 +09006261 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6262 // because it depends on libbar which isn't available to platform
6263 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6264 if libfoo.NotAvailableForPlatform() != true {
6265 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6266 }
6267
6268 // libfoo2 however can be available to platform because it depends on libbaz which provides
6269 // stubs
6270 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6271 if libfoo2.NotAvailableForPlatform() == true {
6272 t.Errorf("%q should be available to platform", libfoo2.String())
6273 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006274}
Jiyong Parka90ca002019-10-07 15:47:24 +09006275
Paul Duffine52e66f2020-03-30 17:54:29 +01006276func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006277 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006278 apex {
6279 name: "myapex",
6280 key: "myapex.key",
6281 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006282 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006283 }
6284
6285 apex_key {
6286 name: "myapex.key",
6287 public_key: "testkey.avbpubkey",
6288 private_key: "testkey.pem",
6289 }
6290
6291 cc_library {
6292 name: "libfoo",
6293 stl: "none",
6294 system_shared_libs: [],
6295 apex_available: ["myapex"],
6296 static: {
6297 apex_available: ["//apex_available:platform"],
6298 },
6299 }`)
6300
Jiyong Park89e850a2020-04-07 16:37:39 +09006301 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6302 if libfooShared.NotAvailableForPlatform() != true {
6303 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6304 }
6305 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6306 if libfooStatic.NotAvailableForPlatform() != false {
6307 t.Errorf("%q should be available to platform", libfooStatic.String())
6308 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006309}
6310
Jiyong Park5d790c32019-11-15 18:40:32 +09006311func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006312 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006313 apex {
6314 name: "myapex",
6315 key: "myapex.key",
6316 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006317 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006318 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006319 bootclasspath_fragments: ["mybootclasspath_fragment"],
6320 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6321 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006322 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006323 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006324 }
6325
6326 override_apex {
6327 name: "override_myapex",
6328 base: "myapex",
6329 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006330 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006331 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006332 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6333 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6334 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006335 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006336 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006337 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006338 key: "mynewapex.key",
6339 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006340 }
6341
6342 apex_key {
6343 name: "myapex.key",
6344 public_key: "testkey.avbpubkey",
6345 private_key: "testkey.pem",
6346 }
6347
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006348 apex_key {
6349 name: "mynewapex.key",
6350 public_key: "testkey2.avbpubkey",
6351 private_key: "testkey2.pem",
6352 }
6353
6354 android_app_certificate {
6355 name: "myapex.certificate",
6356 certificate: "testkey",
6357 }
6358
Jiyong Park5d790c32019-11-15 18:40:32 +09006359 android_app {
6360 name: "app",
6361 srcs: ["foo/bar/MyClass.java"],
6362 package_name: "foo",
6363 sdk_version: "none",
6364 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006365 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006366 }
6367
6368 override_android_app {
6369 name: "override_app",
6370 base: "app",
6371 package_name: "bar",
6372 }
markchien7c803b82021-08-26 22:10:06 +08006373
6374 bpf {
6375 name: "bpf",
6376 srcs: ["bpf.c"],
6377 }
6378
6379 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006380 name: "overrideBpf",
6381 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006382 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006383
6384 prebuilt_etc {
6385 name: "myetc",
6386 src: "myprebuilt",
6387 }
6388
6389 prebuilt_etc {
6390 name: "override_myetc",
6391 src: "override_myprebuilt",
6392 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006393
6394 java_library {
6395 name: "bcplib",
6396 srcs: ["a.java"],
6397 compile_dex: true,
6398 apex_available: ["myapex"],
6399 permitted_packages: ["bcp.lib"],
6400 }
6401
6402 bootclasspath_fragment {
6403 name: "mybootclasspath_fragment",
6404 contents: ["bcplib"],
6405 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006406 hidden_api: {
6407 split_packages: ["*"],
6408 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006409 }
6410
6411 java_library {
6412 name: "override_bcplib",
6413 srcs: ["a.java"],
6414 compile_dex: true,
6415 apex_available: ["myapex"],
6416 permitted_packages: ["override.bcp.lib"],
6417 }
6418
6419 bootclasspath_fragment {
6420 name: "override_bootclasspath_fragment",
6421 contents: ["override_bcplib"],
6422 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006423 hidden_api: {
6424 split_packages: ["*"],
6425 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006426 }
6427
6428 java_library {
6429 name: "systemserverlib",
6430 srcs: ["a.java"],
6431 apex_available: ["myapex"],
6432 }
6433
6434 systemserverclasspath_fragment {
6435 name: "mysystemserverclasspath_fragment",
6436 standalone_contents: ["systemserverlib"],
6437 apex_available: ["myapex"],
6438 }
6439
6440 java_library {
6441 name: "override_systemserverlib",
6442 srcs: ["a.java"],
6443 apex_available: ["myapex"],
6444 }
6445
6446 systemserverclasspath_fragment {
6447 name: "override_systemserverclasspath_fragment",
6448 standalone_contents: ["override_systemserverlib"],
6449 apex_available: ["myapex"],
6450 }
6451
6452 java_library {
6453 name: "myjava_library",
6454 srcs: ["a.java"],
6455 compile_dex: true,
6456 apex_available: ["myapex"],
6457 }
6458
6459 java_library {
6460 name: "override_java_library",
6461 srcs: ["a.java"],
6462 compile_dex: true,
6463 apex_available: ["myapex"],
6464 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006465 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006466
Jiyong Park317645e2019-12-05 13:20:58 +09006467 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6468 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6469 if originalVariant.GetOverriddenBy() != "" {
6470 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6471 }
6472 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6473 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6474 }
6475
Jiyong Park5d790c32019-11-15 18:40:32 +09006476 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6477 apexRule := module.Rule("apexRule")
6478 copyCmds := apexRule.Args["copy_commands"]
6479
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006480 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6481 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006482
markchien7c803b82021-08-26 22:10:06 +08006483 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006484 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006485
Daniel Norman5a3ce132021-08-26 15:44:43 -07006486 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6487 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6488
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006489 apexBundle := module.Module().(*apexBundle)
6490 name := apexBundle.Name()
6491 if name != "override_myapex" {
6492 t.Errorf("name should be \"override_myapex\", but was %q", name)
6493 }
6494
Baligh Uddin004d7172020-02-19 21:29:28 -08006495 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6496 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6497 }
6498
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006499 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6500 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6501 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6502 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6503 android.AssertArrayString(t, "Java_libs does not match",
6504 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6505
Jiyong Park20bacab2020-03-03 11:45:41 +09006506 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006507 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006508 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6509
6510 signApkRule := module.Rule("signapk")
6511 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006512
Colin Crossaa255532020-07-03 13:18:24 -07006513 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006514 var builder strings.Builder
6515 data.Custom(&builder, name, "TARGET_", "", data)
6516 androidMk := builder.String()
Prerana Patilb1896c82022-11-09 18:14:34 +00006517 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6518 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
6519 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
6520 ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex")
6521 ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex")
6522 ensureContains(t, androidMk, "LOCAL_MODULE := override_java_library.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006523 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006524 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006525 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006526 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006527 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006528 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006529 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6530 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6531 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006532 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006533}
6534
Albert Martineefabcf2022-03-21 20:11:16 +00006535func TestMinSdkVersionOverride(t *testing.T) {
6536 // Override from 29 to 31
6537 minSdkOverride31 := "31"
6538 ctx := testApex(t, `
6539 apex {
6540 name: "myapex",
6541 key: "myapex.key",
6542 native_shared_libs: ["mylib"],
6543 updatable: true,
6544 min_sdk_version: "29"
6545 }
6546
6547 override_apex {
6548 name: "override_myapex",
6549 base: "myapex",
6550 logging_parent: "com.foo.bar",
6551 package_name: "test.overridden.package"
6552 }
6553
6554 apex_key {
6555 name: "myapex.key",
6556 public_key: "testkey.avbpubkey",
6557 private_key: "testkey.pem",
6558 }
6559
6560 cc_library {
6561 name: "mylib",
6562 srcs: ["mylib.cpp"],
6563 runtime_libs: ["libbar"],
6564 system_shared_libs: [],
6565 stl: "none",
6566 apex_available: [ "myapex" ],
6567 min_sdk_version: "apex_inherit"
6568 }
6569
6570 cc_library {
6571 name: "libbar",
6572 srcs: ["mylib.cpp"],
6573 system_shared_libs: [],
6574 stl: "none",
6575 apex_available: [ "myapex" ],
6576 min_sdk_version: "apex_inherit"
6577 }
6578
6579 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6580
6581 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6582 copyCmds := apexRule.Args["copy_commands"]
6583
6584 // Ensure that direct non-stubs dep is always included
6585 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6586
6587 // Ensure that runtime_libs dep in included
6588 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6589
6590 // Ensure libraries target overridden min_sdk_version value
6591 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6592}
6593
6594func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6595 // Attempt to override from 31 to 29, should be a NOOP
6596 minSdkOverride29 := "29"
6597 ctx := testApex(t, `
6598 apex {
6599 name: "myapex",
6600 key: "myapex.key",
6601 native_shared_libs: ["mylib"],
6602 updatable: true,
6603 min_sdk_version: "31"
6604 }
6605
6606 override_apex {
6607 name: "override_myapex",
6608 base: "myapex",
6609 logging_parent: "com.foo.bar",
6610 package_name: "test.overridden.package"
6611 }
6612
6613 apex_key {
6614 name: "myapex.key",
6615 public_key: "testkey.avbpubkey",
6616 private_key: "testkey.pem",
6617 }
6618
6619 cc_library {
6620 name: "mylib",
6621 srcs: ["mylib.cpp"],
6622 runtime_libs: ["libbar"],
6623 system_shared_libs: [],
6624 stl: "none",
6625 apex_available: [ "myapex" ],
6626 min_sdk_version: "apex_inherit"
6627 }
6628
6629 cc_library {
6630 name: "libbar",
6631 srcs: ["mylib.cpp"],
6632 system_shared_libs: [],
6633 stl: "none",
6634 apex_available: [ "myapex" ],
6635 min_sdk_version: "apex_inherit"
6636 }
6637
6638 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6639
6640 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6641 copyCmds := apexRule.Args["copy_commands"]
6642
6643 // Ensure that direct non-stubs dep is always included
6644 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6645
6646 // Ensure that runtime_libs dep in included
6647 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6648
6649 // Ensure libraries target the original min_sdk_version value rather than the overridden
6650 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6651}
6652
Jooyung Han214bf372019-11-12 13:03:50 +09006653func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006654 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006655 apex {
6656 name: "myapex",
6657 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006658 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006659 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006660 }
6661
6662 apex_key {
6663 name: "myapex.key",
6664 public_key: "testkey.avbpubkey",
6665 private_key: "testkey.pem",
6666 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006667
6668 cc_library {
6669 name: "mylib",
6670 srcs: ["mylib.cpp"],
6671 stl: "libc++",
6672 system_shared_libs: [],
6673 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006674 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006675 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006676 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006677
6678 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6679 args := module.Rule("apexRule").Args
6680 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006681 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006682
6683 // The copies of the libraries in the apex should have one more dependency than
6684 // the ones outside the apex, namely the unwinder. Ideally we should check
6685 // the dependency names directly here but for some reason the names are blank in
6686 // this test.
6687 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006688 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006689 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6690 if len(apexImplicits) != len(nonApexImplicits)+1 {
6691 t.Errorf("%q missing unwinder dep", lib)
6692 }
6693 }
Jooyung Han214bf372019-11-12 13:03:50 +09006694}
6695
Paul Duffine05480a2021-03-08 15:07:14 +00006696var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006697 "api/current.txt": nil,
6698 "api/removed.txt": nil,
6699 "api/system-current.txt": nil,
6700 "api/system-removed.txt": nil,
6701 "api/test-current.txt": nil,
6702 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006703
Anton Hanssondff2c782020-12-21 17:10:01 +00006704 "100/public/api/foo.txt": nil,
6705 "100/public/api/foo-removed.txt": nil,
6706 "100/system/api/foo.txt": nil,
6707 "100/system/api/foo-removed.txt": nil,
6708
Paul Duffineedc5d52020-06-12 17:46:39 +01006709 // For java_sdk_library_import
6710 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006711}
6712
Jooyung Han58f26ab2019-12-18 15:34:32 +09006713func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006714 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006715 apex {
6716 name: "myapex",
6717 key: "myapex.key",
6718 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006719 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006720 }
6721
6722 apex_key {
6723 name: "myapex.key",
6724 public_key: "testkey.avbpubkey",
6725 private_key: "testkey.pem",
6726 }
6727
6728 java_sdk_library {
6729 name: "foo",
6730 srcs: ["a.java"],
6731 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006732 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006733 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006734
6735 prebuilt_apis {
6736 name: "sdk",
6737 api_dirs: ["100"],
6738 }
Paul Duffin9b879592020-05-26 13:21:35 +01006739 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006740
6741 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006742 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006743 "javalib/foo.jar",
6744 "etc/permissions/foo.xml",
6745 })
6746 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006747 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006748 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 +09006749}
6750
Paul Duffin9b879592020-05-26 13:21:35 +01006751func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006752 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006753 apex {
6754 name: "myapex",
6755 key: "myapex.key",
6756 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006757 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006758 }
6759
6760 apex_key {
6761 name: "myapex.key",
6762 public_key: "testkey.avbpubkey",
6763 private_key: "testkey.pem",
6764 }
6765
6766 java_sdk_library {
6767 name: "foo",
6768 srcs: ["a.java"],
6769 api_packages: ["foo"],
6770 apex_available: ["myapex"],
6771 sdk_version: "none",
6772 system_modules: "none",
6773 }
6774
6775 java_library {
6776 name: "bar",
6777 srcs: ["a.java"],
6778 libs: ["foo"],
6779 apex_available: ["myapex"],
6780 sdk_version: "none",
6781 system_modules: "none",
6782 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006783
6784 prebuilt_apis {
6785 name: "sdk",
6786 api_dirs: ["100"],
6787 }
Paul Duffin9b879592020-05-26 13:21:35 +01006788 `, withFiles(filesForSdkLibrary))
6789
6790 // java_sdk_library installs both impl jar and permission XML
6791 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6792 "javalib/bar.jar",
6793 "javalib/foo.jar",
6794 "etc/permissions/foo.xml",
6795 })
6796
6797 // The bar library should depend on the implementation jar.
6798 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006799 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006800 t.Errorf("expected %q, found %#q", expected, actual)
6801 }
6802}
6803
6804func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006805 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006806 apex {
6807 name: "myapex",
6808 key: "myapex.key",
6809 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006810 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006811 }
6812
6813 apex_key {
6814 name: "myapex.key",
6815 public_key: "testkey.avbpubkey",
6816 private_key: "testkey.pem",
6817 }
6818
6819 java_sdk_library {
6820 name: "foo",
6821 srcs: ["a.java"],
6822 api_packages: ["foo"],
6823 apex_available: ["myapex"],
6824 sdk_version: "none",
6825 system_modules: "none",
6826 }
6827
6828 java_library {
6829 name: "bar",
6830 srcs: ["a.java"],
6831 libs: ["foo"],
6832 sdk_version: "none",
6833 system_modules: "none",
6834 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006835
6836 prebuilt_apis {
6837 name: "sdk",
6838 api_dirs: ["100"],
6839 }
Paul Duffin9b879592020-05-26 13:21:35 +01006840 `, withFiles(filesForSdkLibrary))
6841
6842 // java_sdk_library installs both impl jar and permission XML
6843 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6844 "javalib/foo.jar",
6845 "etc/permissions/foo.xml",
6846 })
6847
6848 // The bar library should depend on the stubs jar.
6849 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006850 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006851 t.Errorf("expected %q, found %#q", expected, actual)
6852 }
6853}
6854
Paul Duffineedc5d52020-06-12 17:46:39 +01006855func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006856 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006857 prebuilt_apis {
6858 name: "sdk",
6859 api_dirs: ["100"],
6860 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006861 withFiles(map[string][]byte{
6862 "apex/a.java": nil,
6863 "apex/apex_manifest.json": nil,
6864 "apex/Android.bp": []byte(`
6865 package {
6866 default_visibility: ["//visibility:private"],
6867 }
6868
6869 apex {
6870 name: "myapex",
6871 key: "myapex.key",
6872 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006873 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006874 }
6875
6876 apex_key {
6877 name: "myapex.key",
6878 public_key: "testkey.avbpubkey",
6879 private_key: "testkey.pem",
6880 }
6881
6882 java_library {
6883 name: "bar",
6884 srcs: ["a.java"],
6885 libs: ["foo"],
6886 apex_available: ["myapex"],
6887 sdk_version: "none",
6888 system_modules: "none",
6889 }
6890`),
6891 "source/a.java": nil,
6892 "source/api/current.txt": nil,
6893 "source/api/removed.txt": nil,
6894 "source/Android.bp": []byte(`
6895 package {
6896 default_visibility: ["//visibility:private"],
6897 }
6898
6899 java_sdk_library {
6900 name: "foo",
6901 visibility: ["//apex"],
6902 srcs: ["a.java"],
6903 api_packages: ["foo"],
6904 apex_available: ["myapex"],
6905 sdk_version: "none",
6906 system_modules: "none",
6907 public: {
6908 enabled: true,
6909 },
6910 }
6911`),
6912 "prebuilt/a.jar": nil,
6913 "prebuilt/Android.bp": []byte(`
6914 package {
6915 default_visibility: ["//visibility:private"],
6916 }
6917
6918 java_sdk_library_import {
6919 name: "foo",
6920 visibility: ["//apex", "//source"],
6921 apex_available: ["myapex"],
6922 prefer: true,
6923 public: {
6924 jars: ["a.jar"],
6925 },
6926 }
6927`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006928 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006929 )
6930
6931 // java_sdk_library installs both impl jar and permission XML
6932 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6933 "javalib/bar.jar",
6934 "javalib/foo.jar",
6935 "etc/permissions/foo.xml",
6936 })
6937
6938 // The bar library should depend on the implementation jar.
6939 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006940 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006941 t.Errorf("expected %q, found %#q", expected, actual)
6942 }
6943}
6944
6945func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6946 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6947 apex {
6948 name: "myapex",
6949 key: "myapex.key",
6950 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006951 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006952 }
6953
6954 apex_key {
6955 name: "myapex.key",
6956 public_key: "testkey.avbpubkey",
6957 private_key: "testkey.pem",
6958 }
6959
6960 java_sdk_library_import {
6961 name: "foo",
6962 apex_available: ["myapex"],
6963 prefer: true,
6964 public: {
6965 jars: ["a.jar"],
6966 },
6967 }
6968
6969 `, withFiles(filesForSdkLibrary))
6970}
6971
atrost6e126252020-01-27 17:01:16 +00006972func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006973 result := android.GroupFixturePreparers(
6974 prepareForApexTest,
6975 java.PrepareForTestWithPlatformCompatConfig,
6976 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006977 apex {
6978 name: "myapex",
6979 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006980 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006981 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006982 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006983 }
6984
6985 apex_key {
6986 name: "myapex.key",
6987 public_key: "testkey.avbpubkey",
6988 private_key: "testkey.pem",
6989 }
6990
6991 platform_compat_config {
6992 name: "myjar-platform-compat-config",
6993 src: ":myjar",
6994 }
6995
6996 java_library {
6997 name: "myjar",
6998 srcs: ["foo/bar/MyClass.java"],
6999 sdk_version: "none",
7000 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007001 apex_available: [ "myapex" ],
7002 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007003
7004 // Make sure that a preferred prebuilt does not affect the apex contents.
7005 prebuilt_platform_compat_config {
7006 name: "myjar-platform-compat-config",
7007 metadata: "compat-config/metadata.xml",
7008 prefer: true,
7009 }
atrost6e126252020-01-27 17:01:16 +00007010 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007011 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007012 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7013 "etc/compatconfig/myjar-platform-compat-config.xml",
7014 "javalib/myjar.jar",
7015 })
7016}
7017
Jooyung Han862c0d62022-12-21 10:15:37 +09007018func TestNoDupeApexFiles(t *testing.T) {
7019 android.GroupFixturePreparers(
7020 android.PrepareForTestWithAndroidBuildComponents,
7021 PrepareForTestWithApexBuildComponents,
7022 prepareForTestWithMyapex,
7023 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7024 ).
7025 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7026 RunTestWithBp(t, `
7027 apex {
7028 name: "myapex",
7029 key: "myapex.key",
7030 prebuilts: ["foo", "bar"],
7031 updatable: false,
7032 }
7033
7034 apex_key {
7035 name: "myapex.key",
7036 public_key: "testkey.avbpubkey",
7037 private_key: "testkey.pem",
7038 }
7039
7040 prebuilt_etc {
7041 name: "foo",
7042 src: "myprebuilt",
7043 filename_from_src: true,
7044 }
7045
7046 prebuilt_etc {
7047 name: "bar",
7048 src: "myprebuilt",
7049 filename_from_src: true,
7050 }
7051 `)
7052}
7053
Jiyong Park479321d2019-12-16 11:47:12 +09007054func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7055 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7056 apex {
7057 name: "myapex",
7058 key: "myapex.key",
7059 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007060 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007061 }
7062
7063 apex_key {
7064 name: "myapex.key",
7065 public_key: "testkey.avbpubkey",
7066 private_key: "testkey.pem",
7067 }
7068
7069 java_library {
7070 name: "myjar",
7071 srcs: ["foo/bar/MyClass.java"],
7072 sdk_version: "none",
7073 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007074 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007075 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007076 }
7077 `)
7078}
7079
Jiyong Park7afd1072019-12-30 16:56:33 +09007080func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007081 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007082 apex {
7083 name: "myapex",
7084 key: "myapex.key",
7085 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007086 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007087 }
7088
7089 apex_key {
7090 name: "myapex.key",
7091 public_key: "testkey.avbpubkey",
7092 private_key: "testkey.pem",
7093 }
7094
7095 cc_library {
7096 name: "mylib",
7097 srcs: ["mylib.cpp"],
7098 system_shared_libs: [],
7099 stl: "none",
7100 required: ["a", "b"],
7101 host_required: ["c", "d"],
7102 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007103 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007104 }
7105 `)
7106
7107 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007108 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007109 name := apexBundle.BaseModuleName()
7110 prefix := "TARGET_"
7111 var builder strings.Builder
7112 data.Custom(&builder, name, prefix, "", data)
7113 androidMk := builder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08007114 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex a b\n")
7115 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7116 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007117}
7118
Jiyong Park7cd10e32020-01-14 09:22:18 +09007119func TestSymlinksFromApexToSystem(t *testing.T) {
7120 bp := `
7121 apex {
7122 name: "myapex",
7123 key: "myapex.key",
7124 native_shared_libs: ["mylib"],
7125 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007126 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007127 }
7128
Jiyong Park9d677202020-02-19 16:29:35 +09007129 apex {
7130 name: "myapex.updatable",
7131 key: "myapex.key",
7132 native_shared_libs: ["mylib"],
7133 java_libs: ["myjar"],
7134 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09007135 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09007136 }
7137
Jiyong Park7cd10e32020-01-14 09:22:18 +09007138 apex_key {
7139 name: "myapex.key",
7140 public_key: "testkey.avbpubkey",
7141 private_key: "testkey.pem",
7142 }
7143
7144 cc_library {
7145 name: "mylib",
7146 srcs: ["mylib.cpp"],
7147 shared_libs: ["myotherlib"],
7148 system_shared_libs: [],
7149 stl: "none",
7150 apex_available: [
7151 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007152 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007153 "//apex_available:platform",
7154 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007155 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007156 }
7157
7158 cc_library {
7159 name: "myotherlib",
7160 srcs: ["mylib.cpp"],
7161 system_shared_libs: [],
7162 stl: "none",
7163 apex_available: [
7164 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007165 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007166 "//apex_available:platform",
7167 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007168 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007169 }
7170
7171 java_library {
7172 name: "myjar",
7173 srcs: ["foo/bar/MyClass.java"],
7174 sdk_version: "none",
7175 system_modules: "none",
7176 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007177 apex_available: [
7178 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007179 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007180 "//apex_available:platform",
7181 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007182 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007183 }
7184
7185 java_library {
7186 name: "myotherjar",
7187 srcs: ["foo/bar/MyClass.java"],
7188 sdk_version: "none",
7189 system_modules: "none",
7190 apex_available: [
7191 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007192 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007193 "//apex_available:platform",
7194 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007195 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007196 }
7197 `
7198
7199 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7200 for _, f := range files {
7201 if f.path == file {
7202 if f.isLink {
7203 t.Errorf("%q is not a real file", file)
7204 }
7205 return
7206 }
7207 }
7208 t.Errorf("%q is not found", file)
7209 }
7210
7211 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
7212 for _, f := range files {
7213 if f.path == file {
7214 if !f.isLink {
7215 t.Errorf("%q is not a symlink", file)
7216 }
7217 return
7218 }
7219 }
7220 t.Errorf("%q is not found", file)
7221 }
7222
Jiyong Park9d677202020-02-19 16:29:35 +09007223 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7224 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007225 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007226 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007227 ensureRealfileExists(t, files, "javalib/myjar.jar")
7228 ensureRealfileExists(t, files, "lib64/mylib.so")
7229 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7230
Jiyong Park9d677202020-02-19 16:29:35 +09007231 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7232 ensureRealfileExists(t, files, "javalib/myjar.jar")
7233 ensureRealfileExists(t, files, "lib64/mylib.so")
7234 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7235
7236 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007237 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007238 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007239 ensureRealfileExists(t, files, "javalib/myjar.jar")
7240 ensureRealfileExists(t, files, "lib64/mylib.so")
7241 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007242
7243 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7244 ensureRealfileExists(t, files, "javalib/myjar.jar")
7245 ensureRealfileExists(t, files, "lib64/mylib.so")
7246 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007247}
7248
Yo Chiange8128052020-07-23 20:09:18 +08007249func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007250 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007251 apex {
7252 name: "myapex",
7253 key: "myapex.key",
7254 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007255 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007256 }
7257
7258 apex_key {
7259 name: "myapex.key",
7260 public_key: "testkey.avbpubkey",
7261 private_key: "testkey.pem",
7262 }
7263
7264 cc_library_shared {
7265 name: "mylib",
7266 srcs: ["mylib.cpp"],
7267 shared_libs: ["myotherlib"],
7268 system_shared_libs: [],
7269 stl: "none",
7270 apex_available: [
7271 "myapex",
7272 "//apex_available:platform",
7273 ],
7274 }
7275
7276 cc_prebuilt_library_shared {
7277 name: "myotherlib",
7278 srcs: ["prebuilt.so"],
7279 system_shared_libs: [],
7280 stl: "none",
7281 apex_available: [
7282 "myapex",
7283 "//apex_available:platform",
7284 ],
7285 }
7286 `)
7287
Prerana Patilb1896c82022-11-09 18:14:34 +00007288 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007289 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007290 var builder strings.Builder
7291 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7292 androidMk := builder.String()
7293 // `myotherlib` is added to `myapex` as symlink
Prerana Patilb1896c82022-11-09 18:14:34 +00007294 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007295 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7296 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7297 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Sasha Smundakdcb61292022-12-08 10:41:33 -08007298 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 +08007299}
7300
Jooyung Han643adc42020-02-27 13:50:06 +09007301func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007302 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007303 apex {
7304 name: "myapex",
7305 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007306 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007307 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007308 }
7309
7310 apex_key {
7311 name: "myapex.key",
7312 public_key: "testkey.avbpubkey",
7313 private_key: "testkey.pem",
7314 }
7315
7316 cc_library {
7317 name: "mylib",
7318 srcs: ["mylib.cpp"],
7319 shared_libs: ["mylib2"],
7320 system_shared_libs: [],
7321 stl: "none",
7322 apex_available: [ "myapex" ],
7323 }
7324
7325 cc_library {
7326 name: "mylib2",
7327 srcs: ["mylib.cpp"],
7328 system_shared_libs: [],
7329 stl: "none",
7330 apex_available: [ "myapex" ],
7331 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007332
7333 rust_ffi_shared {
7334 name: "libfoo.rust",
7335 crate_name: "foo",
7336 srcs: ["foo.rs"],
7337 shared_libs: ["libfoo.shared_from_rust"],
7338 prefer_rlib: true,
7339 apex_available: ["myapex"],
7340 }
7341
7342 cc_library_shared {
7343 name: "libfoo.shared_from_rust",
7344 srcs: ["mylib.cpp"],
7345 system_shared_libs: [],
7346 stl: "none",
7347 stubs: {
7348 versions: ["10", "11", "12"],
7349 },
7350 }
7351
Jooyung Han643adc42020-02-27 13:50:06 +09007352 `)
7353
7354 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7355 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007356 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007357 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7358 "lib64/mylib.so",
7359 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007360 "lib64/libfoo.rust.so",
7361 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7362 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007363 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007364
7365 // b/220397949
7366 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007367}
7368
Jooyung Han49f67012020-04-17 13:43:10 +09007369func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007370 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007371 apex {
7372 name: "myapex",
7373 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007374 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007375 }
7376 apex_key {
7377 name: "myapex.key",
7378 public_key: "testkey.avbpubkey",
7379 private_key: "testkey.pem",
7380 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007381 `,
7382 android.FixtureModifyConfig(func(config android.Config) {
7383 delete(config.Targets, android.Android)
7384 config.AndroidCommonTarget = android.Target{}
7385 }),
7386 )
Jooyung Han49f67012020-04-17 13:43:10 +09007387
7388 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7389 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7390 }
7391}
7392
Jiyong Parkbd159612020-02-28 15:22:21 +09007393func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007394 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007395 apex {
7396 name: "myapex",
7397 key: "myapex.key",
7398 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007399 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007400 }
7401
7402 apex_key {
7403 name: "myapex.key",
7404 public_key: "testkey.avbpubkey",
7405 private_key: "testkey.pem",
7406 }
7407
7408 android_app {
7409 name: "AppFoo",
7410 srcs: ["foo/bar/MyClass.java"],
7411 sdk_version: "none",
7412 system_modules: "none",
7413 apex_available: [ "myapex" ],
7414 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007415 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007416
Colin Crosscf371cc2020-11-13 11:48:42 -08007417 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007418 content := bundleConfigRule.Args["content"]
7419
7420 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007421 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 +09007422}
7423
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007424func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007425 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007426 apex {
7427 name: "myapex",
7428 key: "myapex.key",
7429 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007430 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007431 }
7432
7433 apex_key {
7434 name: "myapex.key",
7435 public_key: "testkey.avbpubkey",
7436 private_key: "testkey.pem",
7437 }
7438
7439 android_app_set {
7440 name: "AppSet",
7441 set: "AppSet.apks",
7442 }`)
7443 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007444 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007445 content := bundleConfigRule.Args["content"]
7446 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7447 s := mod.Rule("apexRule").Args["copy_commands"]
7448 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007449 if len(copyCmds) != 4 {
7450 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007451 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007452 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7453 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007454 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7455 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007456
7457 // Ensure that canned_fs_config has an entry for the app set zip file
7458 generateFsRule := mod.Rule("generateFsConfig")
7459 cmd := generateFsRule.RuleParams.Command
7460 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007461}
7462
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007463func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007464 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007465 apex_set {
7466 name: "myapex",
7467 filename: "foo_v2.apex",
7468 sanitized: {
7469 none: { set: "myapex.apks", },
7470 hwaddress: { set: "myapex.hwasan.apks", },
7471 },
Paul Duffin24704672021-04-06 16:09:30 +01007472 }
7473 `
7474 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007475
Paul Duffin24704672021-04-06 16:09:30 +01007476 // Check that the extractor produces the correct output file from the correct input file.
7477 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007478
Paul Duffin24704672021-04-06 16:09:30 +01007479 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7480 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007481
Paul Duffin24704672021-04-06 16:09:30 +01007482 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7483
7484 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007485 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7486 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007487
7488 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007489}
7490
Pranav Guptaeba03b02022-09-27 00:27:08 +00007491func TestApexSetApksModuleAssignment(t *testing.T) {
7492 ctx := testApex(t, `
7493 apex_set {
7494 name: "myapex",
7495 set: ":myapex_apks_file",
7496 }
7497
7498 filegroup {
7499 name: "myapex_apks_file",
7500 srcs: ["myapex.apks"],
7501 }
7502 `)
7503
7504 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7505
7506 // Check that the extractor produces the correct apks file from the input module
7507 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7508 extractedApex := m.Output(extractorOutput)
7509
7510 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7511}
7512
Paul Duffin89f570a2021-06-16 01:42:33 +01007513func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007514 t.Helper()
7515
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007516 bp := `
7517 java_library {
7518 name: "some-updatable-apex-lib",
7519 srcs: ["a.java"],
7520 sdk_version: "current",
7521 apex_available: [
7522 "some-updatable-apex",
7523 ],
satayevabcd5972021-08-06 17:49:46 +01007524 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007525 }
7526
7527 java_library {
7528 name: "some-non-updatable-apex-lib",
7529 srcs: ["a.java"],
7530 apex_available: [
7531 "some-non-updatable-apex",
7532 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007533 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007534 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007535 }
7536
7537 bootclasspath_fragment {
7538 name: "some-non-updatable-fragment",
7539 contents: ["some-non-updatable-apex-lib"],
7540 apex_available: [
7541 "some-non-updatable-apex",
7542 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007543 hidden_api: {
7544 split_packages: ["*"],
7545 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007546 }
7547
7548 java_library {
7549 name: "some-platform-lib",
7550 srcs: ["a.java"],
7551 sdk_version: "current",
7552 installable: true,
7553 }
7554
7555 java_library {
7556 name: "some-art-lib",
7557 srcs: ["a.java"],
7558 sdk_version: "current",
7559 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007560 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007561 ],
7562 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007563 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007564 }
7565
7566 apex {
7567 name: "some-updatable-apex",
7568 key: "some-updatable-apex.key",
7569 java_libs: ["some-updatable-apex-lib"],
7570 updatable: true,
7571 min_sdk_version: "current",
7572 }
7573
7574 apex {
7575 name: "some-non-updatable-apex",
7576 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007577 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007578 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007579 }
7580
7581 apex_key {
7582 name: "some-updatable-apex.key",
7583 }
7584
7585 apex_key {
7586 name: "some-non-updatable-apex.key",
7587 }
7588
7589 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007590 name: "com.android.art.debug",
7591 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007592 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007593 updatable: true,
7594 min_sdk_version: "current",
7595 }
7596
Paul Duffinf23bc472021-04-27 12:42:20 +01007597 bootclasspath_fragment {
7598 name: "art-bootclasspath-fragment",
7599 image_name: "art",
7600 contents: ["some-art-lib"],
7601 apex_available: [
7602 "com.android.art.debug",
7603 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007604 hidden_api: {
7605 split_packages: ["*"],
7606 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007607 }
7608
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007609 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007610 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007611 }
7612
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007613 filegroup {
7614 name: "some-updatable-apex-file_contexts",
7615 srcs: [
7616 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7617 ],
7618 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007619
7620 filegroup {
7621 name: "some-non-updatable-apex-file_contexts",
7622 srcs: [
7623 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7624 ],
7625 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007626 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007627
Paul Duffin89f570a2021-06-16 01:42:33 +01007628 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007629}
7630
Paul Duffin89f570a2021-06-16 01:42:33 +01007631func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007632 t.Helper()
7633
Paul Duffin55607122021-03-30 23:32:51 +01007634 fs := android.MockFS{
7635 "a.java": nil,
7636 "a.jar": nil,
7637 "apex_manifest.json": nil,
7638 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007639 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007640 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7641 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7642 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007643 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007644 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007645
Paul Duffin55607122021-03-30 23:32:51 +01007646 errorHandler := android.FixtureExpectsNoErrors
7647 if errmsg != "" {
7648 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007649 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007650
Paul Duffin55607122021-03-30 23:32:51 +01007651 result := android.GroupFixturePreparers(
7652 cc.PrepareForTestWithCcDefaultModules,
7653 java.PrepareForTestWithHiddenApiBuildComponents,
7654 java.PrepareForTestWithJavaDefaultModules,
7655 java.PrepareForTestWithJavaSdkLibraryFiles,
7656 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007657 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007658 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007659 android.FixtureModifyMockFS(func(fs android.MockFS) {
7660 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7661 insert := ""
7662 for _, fragment := range fragments {
7663 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7664 }
7665 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7666 platform_bootclasspath {
7667 name: "platform-bootclasspath",
7668 fragments: [
7669 %s
7670 ],
7671 }
7672 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007673 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007674 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007675 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007676 ).
7677 ExtendWithErrorHandler(errorHandler).
7678 RunTestWithBp(t, bp)
7679
7680 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007681}
7682
Paul Duffin5556c5f2022-06-09 17:32:21 +00007683func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007684 preparers := android.GroupFixturePreparers(
7685 java.PrepareForTestWithJavaDefaultModules,
7686 PrepareForTestWithApexBuildComponents,
7687 ).
7688 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7689 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7690
7691 bpBase := `
7692 apex_set {
7693 name: "com.android.myapex",
7694 installable: true,
7695 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7696 set: "myapex.apks",
7697 }
7698
7699 apex_set {
7700 name: "com.mycompany.android.myapex",
7701 apex_name: "com.android.myapex",
7702 installable: true,
7703 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7704 set: "company-myapex.apks",
7705 }
7706
7707 prebuilt_bootclasspath_fragment {
7708 name: "my-bootclasspath-fragment",
7709 apex_available: ["com.android.myapex"],
7710 %s
7711 }
7712 `
7713
7714 t.Run("java_import", func(t *testing.T) {
7715 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7716 java_import {
7717 name: "libfoo",
7718 jars: ["libfoo.jar"],
7719 apex_available: ["com.android.myapex"],
7720 }
7721 `)
7722 })
7723
7724 t.Run("java_sdk_library_import", func(t *testing.T) {
7725 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7726 java_sdk_library_import {
7727 name: "libfoo",
7728 public: {
7729 jars: ["libbar.jar"],
7730 },
7731 apex_available: ["com.android.myapex"],
7732 }
7733 `)
7734 })
7735
7736 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7737 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7738 image_name: "art",
7739 contents: ["libfoo"],
7740 `)+`
7741 java_sdk_library_import {
7742 name: "libfoo",
7743 public: {
7744 jars: ["libbar.jar"],
7745 },
7746 apex_available: ["com.android.myapex"],
7747 }
7748 `)
7749 })
7750}
7751
Paul Duffin5556c5f2022-06-09 17:32:21 +00007752func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7753 preparers := android.GroupFixturePreparers(
7754 java.PrepareForTestWithJavaDefaultModules,
7755 PrepareForTestWithApexBuildComponents,
7756 )
7757
7758 bpBase := `
7759 apex_set {
7760 name: "com.android.myapex",
7761 installable: true,
7762 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7763 set: "myapex.apks",
7764 }
7765
7766 apex_set {
7767 name: "com.android.myapex_compressed",
7768 apex_name: "com.android.myapex",
7769 installable: true,
7770 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7771 set: "myapex_compressed.apks",
7772 }
7773
7774 prebuilt_bootclasspath_fragment {
7775 name: "my-bootclasspath-fragment",
7776 apex_available: [
7777 "com.android.myapex",
7778 "com.android.myapex_compressed",
7779 ],
7780 hidden_api: {
7781 annotation_flags: "annotation-flags.csv",
7782 metadata: "metadata.csv",
7783 index: "index.csv",
7784 signature_patterns: "signature_patterns.csv",
7785 },
7786 %s
7787 }
7788 `
7789
7790 t.Run("java_import", func(t *testing.T) {
7791 result := preparers.RunTestWithBp(t,
7792 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7793 java_import {
7794 name: "libfoo",
7795 jars: ["libfoo.jar"],
7796 apex_available: [
7797 "com.android.myapex",
7798 "com.android.myapex_compressed",
7799 ],
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("java_sdk_library_import", func(t *testing.T) {
7811 result := preparers.RunTestWithBp(t,
7812 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7813 java_sdk_library_import {
7814 name: "libfoo",
7815 public: {
7816 jars: ["libbar.jar"],
7817 },
7818 apex_available: [
7819 "com.android.myapex",
7820 "com.android.myapex_compressed",
7821 ],
7822 compile_dex: true,
7823 }
7824 `)
7825
7826 module := result.Module("libfoo", "android_common_com.android.myapex")
7827 usesLibraryDep := module.(java.UsesLibraryDependency)
7828 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7829 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7830 usesLibraryDep.DexJarBuildPath().Path())
7831 })
7832
7833 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7834 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7835 image_name: "art",
7836 contents: ["libfoo"],
7837 `)+`
7838 java_sdk_library_import {
7839 name: "libfoo",
7840 public: {
7841 jars: ["libbar.jar"],
7842 },
7843 apex_available: [
7844 "com.android.myapex",
7845 "com.android.myapex_compressed",
7846 ],
7847 compile_dex: true,
7848 }
7849 `)
7850 })
7851}
7852
Jooyung Han548640b2020-04-27 12:10:30 +09007853func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7854 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7855 apex {
7856 name: "myapex",
7857 key: "myapex.key",
7858 updatable: true,
7859 }
7860
7861 apex_key {
7862 name: "myapex.key",
7863 public_key: "testkey.avbpubkey",
7864 private_key: "testkey.pem",
7865 }
7866 `)
7867}
7868
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007869func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7870 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7871 apex {
7872 name: "myapex",
7873 key: "myapex.key",
7874 }
7875
7876 apex_key {
7877 name: "myapex.key",
7878 public_key: "testkey.avbpubkey",
7879 private_key: "testkey.pem",
7880 }
7881 `)
7882}
7883
Daniel Norman69109112021-12-02 12:52:42 -08007884func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7885 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7886 apex {
7887 name: "myapex",
7888 key: "myapex.key",
7889 updatable: true,
7890 soc_specific: true,
7891 }
7892
7893 apex_key {
7894 name: "myapex.key",
7895 public_key: "testkey.avbpubkey",
7896 private_key: "testkey.pem",
7897 }
7898 `)
7899}
7900
satayevb98371c2021-06-15 16:49:50 +01007901func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7902 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7903 apex {
7904 name: "myapex",
7905 key: "myapex.key",
7906 systemserverclasspath_fragments: [
7907 "mysystemserverclasspathfragment",
7908 ],
7909 min_sdk_version: "29",
7910 updatable: true,
7911 }
7912
7913 apex_key {
7914 name: "myapex.key",
7915 public_key: "testkey.avbpubkey",
7916 private_key: "testkey.pem",
7917 }
7918
7919 java_library {
7920 name: "foo",
7921 srcs: ["b.java"],
7922 min_sdk_version: "29",
7923 installable: true,
7924 apex_available: [
7925 "myapex",
7926 ],
7927 }
7928
7929 systemserverclasspath_fragment {
7930 name: "mysystemserverclasspathfragment",
7931 generate_classpaths_proto: false,
7932 contents: [
7933 "foo",
7934 ],
7935 apex_available: [
7936 "myapex",
7937 ],
7938 }
satayevabcd5972021-08-06 17:49:46 +01007939 `,
7940 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7941 )
satayevb98371c2021-06-15 16:49:50 +01007942}
7943
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007944func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007945 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7946 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7947 // modules to be included in the BootJars.
7948 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7949 return android.GroupFixturePreparers(
7950 dexpreopt.FixtureSetBootJars(bootJars...),
7951 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7952 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7953 }),
7954 )
7955 }
7956
7957 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7958 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7959 // specified in the ArtApexJars configuration.
7960 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7961 return android.GroupFixturePreparers(
7962 dexpreopt.FixtureSetArtBootJars(bootJars...),
7963 dexpreopt.FixtureSetBootJars(bootJars...),
7964 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7965 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7966 }),
7967 )
7968 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007969
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007970 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007971 preparer := android.GroupFixturePreparers(
7972 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7973 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7974 )
7975 fragments := []java.ApexVariantReference{
7976 {
7977 Apex: proptools.StringPtr("com.android.art.debug"),
7978 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7979 },
7980 {
7981 Apex: proptools.StringPtr("some-non-updatable-apex"),
7982 Module: proptools.StringPtr("some-non-updatable-fragment"),
7983 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007984 }
satayevabcd5972021-08-06 17:49:46 +01007985 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007986 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007987
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007988 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007989 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7990 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007991 preparer := android.GroupFixturePreparers(
7992 prepareSetBootJars("com.android.art.debug:some-art-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("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007999 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 +01008000 // Update the dexpreopt ArtApexJars directly.
8001 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
8002 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008003 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008004
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008005 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 +01008006 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 +01008007 // Update the dexpreopt ArtApexJars directly.
8008 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
8009 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008010 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008011
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008012 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 +01008013 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 +01008014 preparer := android.GroupFixturePreparers(
8015 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
8016 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8017 )
Paul Duffin60264a02021-04-12 20:02:36 +01008018 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008019 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008020
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008021 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008022 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01008023 fragment := java.ApexVariantReference{
8024 Apex: proptools.StringPtr("some-non-updatable-apex"),
8025 Module: proptools.StringPtr("some-non-updatable-fragment"),
8026 }
8027 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008028 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008029
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008030 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008031 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008032 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8033 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008034 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008035
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008036 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008037 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008038 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8039 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008040 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008041
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008042 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008043 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01008044 // Update the dexpreopt ArtApexJars directly.
8045 preparer := prepareSetArtJars("platform:some-platform-lib")
8046 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008047 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008048
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008049 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008050 preparer := android.GroupFixturePreparers(
8051 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8052 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8053 )
8054 fragments := []java.ApexVariantReference{
8055 {
8056 Apex: proptools.StringPtr("some-non-updatable-apex"),
8057 Module: proptools.StringPtr("some-non-updatable-fragment"),
8058 },
8059 }
8060 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008061 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008062}
8063
8064func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008065 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008066 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008067 fragment := java.ApexVariantReference{
8068 Apex: proptools.StringPtr("myapex"),
8069 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8070 }
8071
Paul Duffin064b70c2020-11-02 17:32:38 +00008072 testDexpreoptWithApexes(t, `
8073 prebuilt_apex {
8074 name: "myapex" ,
8075 arch: {
8076 arm64: {
8077 src: "myapex-arm64.apex",
8078 },
8079 arm: {
8080 src: "myapex-arm.apex",
8081 },
8082 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008083 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8084 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008085
Paul Duffin89f570a2021-06-16 01:42:33 +01008086 prebuilt_bootclasspath_fragment {
8087 name: "my-bootclasspath-fragment",
8088 contents: ["libfoo"],
8089 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008090 hidden_api: {
8091 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8092 metadata: "my-bootclasspath-fragment/metadata.csv",
8093 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008094 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8095 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8096 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008097 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008098 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008099
Paul Duffin89f570a2021-06-16 01:42:33 +01008100 java_import {
8101 name: "libfoo",
8102 jars: ["libfoo.jar"],
8103 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008104 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008105 }
8106 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008107 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008108}
8109
Spandan Dasf14e2542021-11-12 00:01:37 +00008110func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008111 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008112 bp += `
8113 apex_key {
8114 name: "myapex.key",
8115 public_key: "testkey.avbpubkey",
8116 private_key: "testkey.pem",
8117 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008118 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008119 "lib1/src/A.java": nil,
8120 "lib2/src/B.java": nil,
8121 "system/sepolicy/apex/myapex-file_contexts": nil,
8122 }
8123
Paul Duffin45338f02021-03-30 23:07:52 +01008124 errorHandler := android.FixtureExpectsNoErrors
8125 if errmsg != "" {
8126 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008127 }
Colin Crossae8600b2020-10-29 17:09:13 -07008128
Paul Duffin45338f02021-03-30 23:07:52 +01008129 android.GroupFixturePreparers(
8130 android.PrepareForTestWithAndroidBuildComponents,
8131 java.PrepareForTestWithJavaBuildComponents,
8132 PrepareForTestWithApexBuildComponents,
8133 android.PrepareForTestWithNeverallowRules(rules),
8134 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008135 apexBootJars := make([]string, 0, len(bootJars))
8136 for _, apexBootJar := range bootJars {
8137 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008138 }
satayevd604b212021-07-21 14:23:52 +01008139 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008140 }),
8141 fs.AddToFixture(),
8142 ).
8143 ExtendWithErrorHandler(errorHandler).
8144 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008145}
8146
8147func TestApexPermittedPackagesRules(t *testing.T) {
8148 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008149 name string
8150 expectedError string
8151 bp string
8152 bootJars []string
8153 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008154 }{
8155
8156 {
8157 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8158 expectedError: "",
8159 bp: `
8160 java_library {
8161 name: "bcp_lib1",
8162 srcs: ["lib1/src/*.java"],
8163 permitted_packages: ["foo.bar"],
8164 apex_available: ["myapex"],
8165 sdk_version: "none",
8166 system_modules: "none",
8167 }
8168 java_library {
8169 name: "nonbcp_lib2",
8170 srcs: ["lib2/src/*.java"],
8171 apex_available: ["myapex"],
8172 permitted_packages: ["a.b"],
8173 sdk_version: "none",
8174 system_modules: "none",
8175 }
8176 apex {
8177 name: "myapex",
8178 key: "myapex.key",
8179 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008180 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008181 }`,
8182 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008183 bcpPermittedPackages: map[string][]string{
8184 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008185 "foo.bar",
8186 },
8187 },
8188 },
8189 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008190 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008191 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 +01008192 bp: `
8193 java_library {
8194 name: "bcp_lib1",
8195 srcs: ["lib1/src/*.java"],
8196 apex_available: ["myapex"],
8197 permitted_packages: ["foo.bar"],
8198 sdk_version: "none",
8199 system_modules: "none",
8200 }
8201 java_library {
8202 name: "bcp_lib2",
8203 srcs: ["lib2/src/*.java"],
8204 apex_available: ["myapex"],
8205 permitted_packages: ["foo.bar", "bar.baz"],
8206 sdk_version: "none",
8207 system_modules: "none",
8208 }
8209 apex {
8210 name: "myapex",
8211 key: "myapex.key",
8212 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008213 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008214 }
8215 `,
8216 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008217 bcpPermittedPackages: map[string][]string{
8218 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008219 "foo.bar",
8220 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008221 "bcp_lib2": []string{
8222 "foo.bar",
8223 },
8224 },
8225 },
8226 {
8227 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8228 expectedError: "",
8229 bp: `
8230 java_library {
8231 name: "bcp_lib_restricted",
8232 srcs: ["lib1/src/*.java"],
8233 apex_available: ["myapex"],
8234 permitted_packages: ["foo.bar"],
8235 sdk_version: "none",
8236 min_sdk_version: "29",
8237 system_modules: "none",
8238 }
8239 java_library {
8240 name: "bcp_lib_unrestricted",
8241 srcs: ["lib2/src/*.java"],
8242 apex_available: ["myapex"],
8243 permitted_packages: ["foo.bar", "bar.baz"],
8244 sdk_version: "none",
8245 min_sdk_version: "29",
8246 system_modules: "none",
8247 }
8248 apex {
8249 name: "myapex",
8250 key: "myapex.key",
8251 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8252 updatable: true,
8253 min_sdk_version: "29",
8254 }
8255 `,
8256 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8257 bcpPermittedPackages: map[string][]string{
8258 "bcp_lib1_non_updateable": []string{
8259 "foo.bar",
8260 },
8261 // 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 +01008262 },
8263 },
8264 }
8265 for _, tc := range testcases {
8266 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008267 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8268 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008269 })
8270 }
8271}
8272
Jiyong Park62304bb2020-04-13 16:19:48 +09008273func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008274 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008275 apex {
8276 name: "myapex",
8277 key: "myapex.key",
8278 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008279 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008280 }
8281
8282 apex_key {
8283 name: "myapex.key",
8284 public_key: "testkey.avbpubkey",
8285 private_key: "testkey.pem",
8286 }
8287
8288 cc_library {
8289 name: "mylib",
8290 srcs: ["mylib.cpp"],
8291 system_shared_libs: [],
8292 stl: "none",
8293 stubs: {
8294 versions: ["1"],
8295 },
8296 apex_available: ["myapex"],
8297 }
8298
8299 cc_library {
8300 name: "myprivlib",
8301 srcs: ["mylib.cpp"],
8302 system_shared_libs: [],
8303 stl: "none",
8304 apex_available: ["myapex"],
8305 }
8306
8307
8308 cc_test {
8309 name: "mytest",
8310 gtest: false,
8311 srcs: ["mylib.cpp"],
8312 system_shared_libs: [],
8313 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008314 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008315 test_for: ["myapex"]
8316 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008317
8318 cc_library {
8319 name: "mytestlib",
8320 srcs: ["mylib.cpp"],
8321 system_shared_libs: [],
8322 shared_libs: ["mylib", "myprivlib"],
8323 stl: "none",
8324 test_for: ["myapex"],
8325 }
8326
8327 cc_benchmark {
8328 name: "mybench",
8329 srcs: ["mylib.cpp"],
8330 system_shared_libs: [],
8331 shared_libs: ["mylib", "myprivlib"],
8332 stl: "none",
8333 test_for: ["myapex"],
8334 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008335 `)
8336
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008337 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008338 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008339 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8340 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8341 }
8342
8343 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008344 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008345 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8346 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8347 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8348}
Jiyong Park46a512f2020-12-04 18:02:13 +09008349
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008350func TestIndirectTestFor(t *testing.T) {
8351 ctx := testApex(t, `
8352 apex {
8353 name: "myapex",
8354 key: "myapex.key",
8355 native_shared_libs: ["mylib", "myprivlib"],
8356 updatable: false,
8357 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008358
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008359 apex_key {
8360 name: "myapex.key",
8361 public_key: "testkey.avbpubkey",
8362 private_key: "testkey.pem",
8363 }
8364
8365 cc_library {
8366 name: "mylib",
8367 srcs: ["mylib.cpp"],
8368 system_shared_libs: [],
8369 stl: "none",
8370 stubs: {
8371 versions: ["1"],
8372 },
8373 apex_available: ["myapex"],
8374 }
8375
8376 cc_library {
8377 name: "myprivlib",
8378 srcs: ["mylib.cpp"],
8379 system_shared_libs: [],
8380 stl: "none",
8381 shared_libs: ["mylib"],
8382 apex_available: ["myapex"],
8383 }
8384
8385 cc_library {
8386 name: "mytestlib",
8387 srcs: ["mylib.cpp"],
8388 system_shared_libs: [],
8389 shared_libs: ["myprivlib"],
8390 stl: "none",
8391 test_for: ["myapex"],
8392 }
8393 `)
8394
8395 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008396 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008397 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8398 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8399 }
8400
8401 // The platform variant of mytestlib links to the platform variant of the
8402 // internal myprivlib.
8403 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8404
8405 // The platform variant of myprivlib links to the platform variant of mylib
8406 // and bypasses its stubs.
8407 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 +09008408}
8409
Martin Stjernholmec009002021-03-27 15:18:31 +00008410func TestTestForForLibInOtherApex(t *testing.T) {
8411 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8412 _ = testApex(t, `
8413 apex {
8414 name: "com.android.art",
8415 key: "myapex.key",
8416 native_shared_libs: ["mylib"],
8417 updatable: false,
8418 }
8419
8420 apex {
8421 name: "com.android.art.debug",
8422 key: "myapex.key",
8423 native_shared_libs: ["mylib", "mytestlib"],
8424 updatable: false,
8425 }
8426
8427 apex_key {
8428 name: "myapex.key",
8429 public_key: "testkey.avbpubkey",
8430 private_key: "testkey.pem",
8431 }
8432
8433 cc_library {
8434 name: "mylib",
8435 srcs: ["mylib.cpp"],
8436 system_shared_libs: [],
8437 stl: "none",
8438 stubs: {
8439 versions: ["1"],
8440 },
8441 apex_available: ["com.android.art", "com.android.art.debug"],
8442 }
8443
8444 cc_library {
8445 name: "mytestlib",
8446 srcs: ["mylib.cpp"],
8447 system_shared_libs: [],
8448 shared_libs: ["mylib"],
8449 stl: "none",
8450 apex_available: ["com.android.art.debug"],
8451 test_for: ["com.android.art"],
8452 }
8453 `,
8454 android.MockFS{
8455 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8456 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8457 }.AddToFixture())
8458}
8459
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008460// TODO(jungjw): Move this to proptools
8461func intPtr(i int) *int {
8462 return &i
8463}
8464
8465func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008466 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008467 apex_set {
8468 name: "myapex",
8469 set: "myapex.apks",
8470 filename: "foo_v2.apex",
8471 overrides: ["foo"],
8472 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008473 `,
8474 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8475 variables.Platform_sdk_version = intPtr(30)
8476 }),
8477 android.FixtureModifyConfig(func(config android.Config) {
8478 config.Targets[android.Android] = []android.Target{
8479 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8480 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8481 }
8482 }),
8483 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008484
Paul Duffin24704672021-04-06 16:09:30 +01008485 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008486
8487 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008488 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008489 actual := extractedApex.Args["abis"]
8490 expected := "ARMEABI_V7A,ARM64_V8A"
8491 if actual != expected {
8492 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8493 }
8494 actual = extractedApex.Args["sdk-version"]
8495 expected = "30"
8496 if actual != expected {
8497 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8498 }
8499
Paul Duffin6717d882021-06-15 19:09:41 +01008500 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008501 a := m.Module().(*ApexSet)
8502 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008503 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008504 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8505 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8506 }
8507}
8508
Anton Hansson805e0a52022-11-25 14:06:46 +00008509func TestApexSet_NativeBridge(t *testing.T) {
8510 ctx := testApex(t, `
8511 apex_set {
8512 name: "myapex",
8513 set: "myapex.apks",
8514 filename: "foo_v2.apex",
8515 overrides: ["foo"],
8516 }
8517 `,
8518 android.FixtureModifyConfig(func(config android.Config) {
8519 config.Targets[android.Android] = []android.Target{
8520 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8521 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8522 }
8523 }),
8524 )
8525
8526 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8527
8528 // Check extract_apks tool parameters. No native bridge arch expected
8529 extractedApex := m.Output("extracted/myapex.apks")
8530 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8531}
8532
Jiyong Park7d95a512020-05-10 15:16:24 +09008533func TestNoStaticLinkingToStubsLib(t *testing.T) {
8534 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8535 apex {
8536 name: "myapex",
8537 key: "myapex.key",
8538 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008539 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008540 }
8541
8542 apex_key {
8543 name: "myapex.key",
8544 public_key: "testkey.avbpubkey",
8545 private_key: "testkey.pem",
8546 }
8547
8548 cc_library {
8549 name: "mylib",
8550 srcs: ["mylib.cpp"],
8551 static_libs: ["otherlib"],
8552 system_shared_libs: [],
8553 stl: "none",
8554 apex_available: [ "myapex" ],
8555 }
8556
8557 cc_library {
8558 name: "otherlib",
8559 srcs: ["mylib.cpp"],
8560 system_shared_libs: [],
8561 stl: "none",
8562 stubs: {
8563 versions: ["1", "2", "3"],
8564 },
8565 apex_available: [ "myapex" ],
8566 }
8567 `)
8568}
8569
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008570func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008571 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008572 apex {
8573 name: "myapex",
8574 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008575 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008576 custom_sign_tool: "sign_myapex",
8577 }
8578
8579 apex_key {
8580 name: "myapex.key",
8581 public_key: "testkey.avbpubkey",
8582 private_key: "testkey.pem",
8583 }
8584 `)
8585
8586 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8587 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8588 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"`)
8589}
8590
8591func TestApexKeysTxtOverrides(t *testing.T) {
8592 ctx := testApex(t, `
8593 apex {
8594 name: "myapex",
8595 key: "myapex.key",
8596 updatable: false,
8597 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008598 }
8599
8600 apex_key {
8601 name: "myapex.key",
8602 public_key: "testkey.avbpubkey",
8603 private_key: "testkey.pem",
8604 }
8605
8606 prebuilt_apex {
8607 name: "myapex",
8608 prefer: true,
8609 arch: {
8610 arm64: {
8611 src: "myapex-arm64.apex",
8612 },
8613 arm: {
8614 src: "myapex-arm.apex",
8615 },
8616 },
8617 }
8618
8619 apex_set {
8620 name: "myapex_set",
8621 set: "myapex.apks",
8622 filename: "myapex_set.apex",
8623 overrides: ["myapex"],
8624 }
8625 `)
8626
8627 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8628 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8629 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 +09008630 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 +09008631}
8632
Jooyung Han938b5932020-06-20 12:47:47 +09008633func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008634 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008635 apex {
8636 name: "myapex",
8637 key: "myapex.key",
8638 apps: ["app"],
8639 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008640 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008641 }
8642
8643 apex_key {
8644 name: "myapex.key",
8645 public_key: "testkey.avbpubkey",
8646 private_key: "testkey.pem",
8647 }
8648
8649 android_app {
8650 name: "app",
8651 srcs: ["foo/bar/MyClass.java"],
8652 package_name: "foo",
8653 sdk_version: "none",
8654 system_modules: "none",
8655 apex_available: [ "myapex" ],
8656 }
8657 `, withFiles(map[string][]byte{
8658 "sub/Android.bp": []byte(`
8659 override_apex {
8660 name: "override_myapex",
8661 base: "myapex",
8662 apps: ["override_app"],
8663 allowed_files: ":allowed",
8664 }
8665 // Overridable "path" property should be referenced indirectly
8666 filegroup {
8667 name: "allowed",
8668 srcs: ["allowed.txt"],
8669 }
8670 override_android_app {
8671 name: "override_app",
8672 base: "app",
8673 package_name: "bar",
8674 }
8675 `),
8676 }))
8677
8678 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8679 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8680 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8681 }
8682
8683 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8684 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8685 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8686 }
8687}
8688
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008689func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008690 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008691 apex {
8692 name: "myapex",
8693 key: "myapex.key",
8694 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008695 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008696 }
8697
8698 apex_key {
8699 name: "myapex.key",
8700 public_key: "testkey.avbpubkey",
8701 private_key: "testkey.pem",
8702 }
8703
8704 cc_library {
8705 name: "mylib",
8706 srcs: ["mylib.cpp"],
8707 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008708 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008709 },
8710 apex_available: ["myapex"],
8711 }
8712
8713 cc_prebuilt_library_shared {
8714 name: "mylib",
8715 prefer: false,
8716 srcs: ["prebuilt.so"],
8717 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008718 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008719 },
8720 apex_available: ["myapex"],
8721 }
8722 `)
8723}
8724
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008725func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008726 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008727 apex {
8728 name: "myapex",
8729 key: "myapex.key",
8730 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008731 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008732 }
8733 apex_key {
8734 name: "myapex.key",
8735 public_key: "testkey.avbpubkey",
8736 private_key: "testkey.pem",
8737 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008738 `,
8739 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8740 variables.CompressedApex = proptools.BoolPtr(true)
8741 }),
8742 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008743
8744 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8745 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8746
8747 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8748 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8749
8750 // Make sure output of bundle is .capex
8751 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8752 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8753
8754 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008755 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008756 var builder strings.Builder
8757 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8758 androidMk := builder.String()
8759 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8760}
8761
Martin Stjernholm2856c662020-12-02 15:03:42 +00008762func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008763 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008764 apex {
8765 name: "myapex",
8766 key: "myapex.key",
8767 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008768 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008769 }
8770
8771 apex_key {
8772 name: "myapex.key",
8773 public_key: "testkey.avbpubkey",
8774 private_key: "testkey.pem",
8775 }
8776
8777 cc_library {
8778 name: "mylib",
8779 srcs: ["mylib.cpp"],
8780 apex_available: ["myapex"],
8781 shared_libs: ["otherlib"],
8782 system_shared_libs: [],
8783 }
8784
8785 cc_library {
8786 name: "otherlib",
8787 srcs: ["mylib.cpp"],
8788 stubs: {
8789 versions: ["current"],
8790 },
8791 }
8792
8793 cc_prebuilt_library_shared {
8794 name: "otherlib",
8795 prefer: true,
8796 srcs: ["prebuilt.so"],
8797 stubs: {
8798 versions: ["current"],
8799 },
8800 }
8801 `)
8802
8803 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008804 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008805 var builder strings.Builder
8806 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8807 androidMk := builder.String()
8808
8809 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8810 // a thing there.
Sasha Smundakdcb61292022-12-08 10:41:33 -08008811 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 +00008812}
8813
Jiyong Parke3867542020-12-03 17:28:25 +09008814func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008815 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008816 apex {
8817 name: "myapex",
8818 key: "myapex.key",
8819 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008820 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008821 }
8822
8823 apex_key {
8824 name: "myapex.key",
8825 public_key: "testkey.avbpubkey",
8826 private_key: "testkey.pem",
8827 }
8828
8829 cc_library {
8830 name: "mylib",
8831 srcs: ["mylib.cpp"],
8832 system_shared_libs: [],
8833 stl: "none",
8834 apex_available: ["myapex"],
8835 shared_libs: ["mylib2"],
8836 target: {
8837 apex: {
8838 exclude_shared_libs: ["mylib2"],
8839 },
8840 },
8841 }
8842
8843 cc_library {
8844 name: "mylib2",
8845 srcs: ["mylib.cpp"],
8846 system_shared_libs: [],
8847 stl: "none",
8848 }
8849 `)
8850
8851 // Check if mylib is linked to mylib2 for the non-apex target
8852 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8853 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8854
8855 // Make sure that the link doesn't occur for the apex target
8856 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8857 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8858
8859 // It shouldn't appear in the copy cmd as well.
8860 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8861 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8862}
8863
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008864func TestPrebuiltStubLibDep(t *testing.T) {
8865 bpBase := `
8866 apex {
8867 name: "myapex",
8868 key: "myapex.key",
8869 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008870 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008871 }
8872 apex_key {
8873 name: "myapex.key",
8874 public_key: "testkey.avbpubkey",
8875 private_key: "testkey.pem",
8876 }
8877 cc_library {
8878 name: "mylib",
8879 srcs: ["mylib.cpp"],
8880 apex_available: ["myapex"],
8881 shared_libs: ["stublib"],
8882 system_shared_libs: [],
8883 }
8884 apex {
8885 name: "otherapex",
8886 enabled: %s,
8887 key: "myapex.key",
8888 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008889 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008890 }
8891 `
8892
8893 stublibSourceBp := `
8894 cc_library {
8895 name: "stublib",
8896 srcs: ["mylib.cpp"],
8897 apex_available: ["otherapex"],
8898 system_shared_libs: [],
8899 stl: "none",
8900 stubs: {
8901 versions: ["1"],
8902 },
8903 }
8904 `
8905
8906 stublibPrebuiltBp := `
8907 cc_prebuilt_library_shared {
8908 name: "stublib",
8909 srcs: ["prebuilt.so"],
8910 apex_available: ["otherapex"],
8911 stubs: {
8912 versions: ["1"],
8913 },
8914 %s
8915 }
8916 `
8917
8918 tests := []struct {
8919 name string
8920 stublibBp string
8921 usePrebuilt bool
8922 modNames []string // Modules to collect AndroidMkEntries for
8923 otherApexEnabled []string
8924 }{
8925 {
8926 name: "only_source",
8927 stublibBp: stublibSourceBp,
8928 usePrebuilt: false,
8929 modNames: []string{"stublib"},
8930 otherApexEnabled: []string{"true", "false"},
8931 },
8932 {
8933 name: "source_preferred",
8934 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8935 usePrebuilt: false,
8936 modNames: []string{"stublib", "prebuilt_stublib"},
8937 otherApexEnabled: []string{"true", "false"},
8938 },
8939 {
8940 name: "prebuilt_preferred",
8941 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8942 usePrebuilt: true,
8943 modNames: []string{"stublib", "prebuilt_stublib"},
8944 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8945 },
8946 {
8947 name: "only_prebuilt",
8948 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8949 usePrebuilt: true,
8950 modNames: []string{"stublib"},
8951 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8952 },
8953 }
8954
8955 for _, test := range tests {
8956 t.Run(test.name, func(t *testing.T) {
8957 for _, otherApexEnabled := range test.otherApexEnabled {
8958 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008959 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008960
8961 type modAndMkEntries struct {
8962 mod *cc.Module
8963 mkEntries android.AndroidMkEntries
8964 }
8965 entries := []*modAndMkEntries{}
8966
8967 // Gather shared lib modules that are installable
8968 for _, modName := range test.modNames {
8969 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8970 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8971 continue
8972 }
8973 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008974 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008975 continue
8976 }
Colin Crossaa255532020-07-03 13:18:24 -07008977 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008978 if ent.Disabled {
8979 continue
8980 }
8981 entries = append(entries, &modAndMkEntries{
8982 mod: mod,
8983 mkEntries: ent,
8984 })
8985 }
8986 }
8987 }
8988
8989 var entry *modAndMkEntries = nil
8990 for _, ent := range entries {
8991 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8992 if entry != nil {
8993 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8994 } else {
8995 entry = ent
8996 }
8997 }
8998 }
8999
9000 if entry == nil {
9001 t.Errorf("AndroidMk entry for \"stublib\" missing")
9002 } else {
9003 isPrebuilt := entry.mod.Prebuilt() != nil
9004 if isPrebuilt != test.usePrebuilt {
9005 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9006 }
9007 if !entry.mod.IsStubs() {
9008 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9009 }
9010 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9011 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9012 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009013 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009014 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009015 if !android.InList(expected, cflags) {
9016 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9017 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009018 }
9019 })
9020 }
9021 })
9022 }
9023}
9024
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009025func TestHostApexInHostOnlyBuild(t *testing.T) {
9026 testApex(t, `
9027 apex {
9028 name: "myapex",
9029 host_supported: true,
9030 key: "myapex.key",
9031 updatable: false,
9032 payload_type: "zip",
9033 }
9034 apex_key {
9035 name: "myapex.key",
9036 public_key: "testkey.avbpubkey",
9037 private_key: "testkey.pem",
9038 }
9039 `,
9040 android.FixtureModifyConfig(func(config android.Config) {
9041 // We may not have device targets in all builds, e.g. in
9042 // prebuilts/build-tools/build-prebuilts.sh
9043 config.Targets[android.Android] = []android.Target{}
9044 }))
9045}
9046
Colin Crossc33e5212021-05-25 18:16:02 -07009047func TestApexJavaCoverage(t *testing.T) {
9048 bp := `
9049 apex {
9050 name: "myapex",
9051 key: "myapex.key",
9052 java_libs: ["mylib"],
9053 bootclasspath_fragments: ["mybootclasspathfragment"],
9054 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9055 updatable: false,
9056 }
9057
9058 apex_key {
9059 name: "myapex.key",
9060 public_key: "testkey.avbpubkey",
9061 private_key: "testkey.pem",
9062 }
9063
9064 java_library {
9065 name: "mylib",
9066 srcs: ["mylib.java"],
9067 apex_available: ["myapex"],
9068 compile_dex: true,
9069 }
9070
9071 bootclasspath_fragment {
9072 name: "mybootclasspathfragment",
9073 contents: ["mybootclasspathlib"],
9074 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009075 hidden_api: {
9076 split_packages: ["*"],
9077 },
Colin Crossc33e5212021-05-25 18:16:02 -07009078 }
9079
9080 java_library {
9081 name: "mybootclasspathlib",
9082 srcs: ["mybootclasspathlib.java"],
9083 apex_available: ["myapex"],
9084 compile_dex: true,
9085 }
9086
9087 systemserverclasspath_fragment {
9088 name: "mysystemserverclasspathfragment",
9089 contents: ["mysystemserverclasspathlib"],
9090 apex_available: ["myapex"],
9091 }
9092
9093 java_library {
9094 name: "mysystemserverclasspathlib",
9095 srcs: ["mysystemserverclasspathlib.java"],
9096 apex_available: ["myapex"],
9097 compile_dex: true,
9098 }
9099 `
9100
9101 result := android.GroupFixturePreparers(
9102 PrepareForTestWithApexBuildComponents,
9103 prepareForTestWithMyapex,
9104 java.PrepareForTestWithJavaDefaultModules,
9105 android.PrepareForTestWithAndroidBuildComponents,
9106 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009107 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9108 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009109 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009110 ).RunTest(t)
9111
9112 // Make sure jacoco ran on both mylib and mybootclasspathlib
9113 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9114 t.Errorf("Failed to find jacoco rule for mylib")
9115 }
9116 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9117 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9118 }
9119 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9120 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9121 }
9122}
9123
Jiyong Park192600a2021-08-03 07:52:17 +00009124func TestProhibitStaticExecutable(t *testing.T) {
9125 testApexError(t, `executable mybin is static`, `
9126 apex {
9127 name: "myapex",
9128 key: "myapex.key",
9129 binaries: ["mybin"],
9130 min_sdk_version: "29",
9131 }
9132
9133 apex_key {
9134 name: "myapex.key",
9135 public_key: "testkey.avbpubkey",
9136 private_key: "testkey.pem",
9137 }
9138
9139 cc_binary {
9140 name: "mybin",
9141 srcs: ["mylib.cpp"],
9142 relative_install_path: "foo/bar",
9143 static_executable: true,
9144 system_shared_libs: [],
9145 stl: "none",
9146 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009147 min_sdk_version: "29",
9148 }
9149 `)
9150
9151 testApexError(t, `executable mybin.rust is static`, `
9152 apex {
9153 name: "myapex",
9154 key: "myapex.key",
9155 binaries: ["mybin.rust"],
9156 min_sdk_version: "29",
9157 }
9158
9159 apex_key {
9160 name: "myapex.key",
9161 public_key: "testkey.avbpubkey",
9162 private_key: "testkey.pem",
9163 }
9164
9165 rust_binary {
9166 name: "mybin.rust",
9167 srcs: ["foo.rs"],
9168 static_executable: true,
9169 apex_available: ["myapex"],
9170 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009171 }
9172 `)
9173}
9174
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009175func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9176 ctx := testApex(t, `
9177 apex {
9178 name: "myapex",
9179 key: "myapex.key",
9180 updatable: false,
9181 java_libs: ["foo"],
9182 }
9183
9184 apex_key {
9185 name: "myapex.key",
9186 public_key: "testkey.avbpubkey",
9187 private_key: "testkey.pem",
9188 }
9189
9190 java_library {
9191 name: "foo",
9192 srcs: ["foo.java"],
9193 apex_available: ["myapex"],
9194 installable: true,
9195 }
9196 `,
9197 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9198 )
9199
9200 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9201 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9202 var builder strings.Builder
9203 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9204 androidMk := builder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009205 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 +00009206}
9207
9208func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9209 ctx := testApex(t, `
9210 prebuilt_apex {
9211 name: "myapex",
9212 arch: {
9213 arm64: {
9214 src: "myapex-arm64.apex",
9215 },
9216 arm: {
9217 src: "myapex-arm.apex",
9218 },
9219 },
9220 exported_java_libs: ["foo"],
9221 }
9222
9223 java_import {
9224 name: "foo",
9225 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009226 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009227 }
9228 `,
9229 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9230 )
9231
9232 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9233 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9234 mainModuleEntries := entriesList[0]
9235 android.AssertArrayString(t,
9236 "LOCAL_REQUIRED_MODULES",
9237 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9238 []string{
9239 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9240 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9241 })
9242}
9243
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009244func TestAndroidMk_RequiredModules(t *testing.T) {
9245 ctx := testApex(t, `
9246 apex {
9247 name: "myapex",
9248 key: "myapex.key",
9249 updatable: false,
9250 java_libs: ["foo"],
9251 required: ["otherapex"],
9252 }
9253
9254 apex {
9255 name: "otherapex",
9256 key: "myapex.key",
9257 updatable: false,
9258 java_libs: ["foo"],
9259 required: ["otherapex"],
9260 }
9261
9262 apex_key {
9263 name: "myapex.key",
9264 public_key: "testkey.avbpubkey",
9265 private_key: "testkey.pem",
9266 }
9267
9268 java_library {
9269 name: "foo",
9270 srcs: ["foo.java"],
9271 apex_available: ["myapex", "otherapex"],
9272 installable: true,
9273 }
9274 `)
9275
9276 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9277 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9278 var builder strings.Builder
9279 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9280 androidMk := builder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009281 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009282}
9283
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009284func TestAndroidMk_RequiredDeps(t *testing.T) {
9285 ctx := testApex(t, `
9286 apex {
9287 name: "myapex",
9288 key: "myapex.key",
9289 updatable: false,
9290 }
9291
9292 apex_key {
9293 name: "myapex.key",
9294 public_key: "testkey.avbpubkey",
9295 private_key: "testkey.pem",
9296 }
9297 `)
9298
9299 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9300 bundle.requiredDeps = append(bundle.requiredDeps, "foo")
9301 data := android.AndroidMkDataForTest(t, ctx, bundle)
9302 var builder strings.Builder
9303 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9304 androidMk := builder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009305 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009306
9307 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
9308 flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
9309 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9310 var flattenedBuilder strings.Builder
9311 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9312 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009313 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009314}
9315
Jooyung Hana6d36672022-02-24 13:58:07 +09009316func TestApexOutputFileProducer(t *testing.T) {
9317 for _, tc := range []struct {
9318 name string
9319 ref string
9320 expected_data []string
9321 }{
9322 {
9323 name: "test_using_output",
9324 ref: ":myapex",
9325 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9326 },
9327 {
9328 name: "test_using_apex",
9329 ref: ":myapex{.apex}",
9330 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9331 },
9332 } {
9333 t.Run(tc.name, func(t *testing.T) {
9334 ctx := testApex(t, `
9335 apex {
9336 name: "myapex",
9337 key: "myapex.key",
9338 compressible: true,
9339 updatable: false,
9340 }
9341
9342 apex_key {
9343 name: "myapex.key",
9344 public_key: "testkey.avbpubkey",
9345 private_key: "testkey.pem",
9346 }
9347
9348 java_test {
9349 name: "`+tc.name+`",
9350 srcs: ["a.java"],
9351 data: ["`+tc.ref+`"],
9352 }
9353 `,
9354 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9355 variables.CompressedApex = proptools.BoolPtr(true)
9356 }))
9357 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9358 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9359 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9360 })
9361 }
9362}
9363
satayev758968a2021-12-06 11:42:40 +00009364func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9365 preparer := android.GroupFixturePreparers(
9366 PrepareForTestWithApexBuildComponents,
9367 prepareForTestWithMyapex,
9368 java.PrepareForTestWithJavaSdkLibraryFiles,
9369 java.PrepareForTestWithJavaDefaultModules,
9370 android.PrepareForTestWithAndroidBuildComponents,
9371 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9372 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9373 )
9374
9375 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9376 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9377 preparer.RunTestWithBp(t, `
9378 apex {
9379 name: "myapex",
9380 key: "myapex.key",
9381 bootclasspath_fragments: ["mybootclasspathfragment"],
9382 min_sdk_version: "30",
9383 updatable: false,
9384 }
9385
9386 apex_key {
9387 name: "myapex.key",
9388 public_key: "testkey.avbpubkey",
9389 private_key: "testkey.pem",
9390 }
9391
9392 bootclasspath_fragment {
9393 name: "mybootclasspathfragment",
9394 contents: ["mybootclasspathlib"],
9395 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009396 hidden_api: {
9397 split_packages: ["*"],
9398 },
satayev758968a2021-12-06 11:42:40 +00009399 }
9400
9401 java_sdk_library {
9402 name: "mybootclasspathlib",
9403 srcs: ["mybootclasspathlib.java"],
9404 apex_available: ["myapex"],
9405 compile_dex: true,
9406 unsafe_ignore_missing_latest_api: true,
9407 min_sdk_version: "31",
9408 static_libs: ["util"],
9409 }
9410
9411 java_library {
9412 name: "util",
9413 srcs: ["a.java"],
9414 apex_available: ["myapex"],
9415 min_sdk_version: "31",
9416 static_libs: ["another_util"],
9417 }
9418
9419 java_library {
9420 name: "another_util",
9421 srcs: ["a.java"],
9422 min_sdk_version: "31",
9423 apex_available: ["myapex"],
9424 }
9425 `)
9426 })
9427
9428 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9429 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9430 preparer.RunTestWithBp(t, `
9431 apex {
9432 name: "myapex",
9433 key: "myapex.key",
9434 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9435 min_sdk_version: "30",
9436 updatable: false,
9437 }
9438
9439 apex_key {
9440 name: "myapex.key",
9441 public_key: "testkey.avbpubkey",
9442 private_key: "testkey.pem",
9443 }
9444
9445 systemserverclasspath_fragment {
9446 name: "mysystemserverclasspathfragment",
9447 contents: ["mysystemserverclasspathlib"],
9448 apex_available: ["myapex"],
9449 }
9450
9451 java_sdk_library {
9452 name: "mysystemserverclasspathlib",
9453 srcs: ["mysystemserverclasspathlib.java"],
9454 apex_available: ["myapex"],
9455 compile_dex: true,
9456 min_sdk_version: "32",
9457 unsafe_ignore_missing_latest_api: true,
9458 static_libs: ["util"],
9459 }
9460
9461 java_library {
9462 name: "util",
9463 srcs: ["a.java"],
9464 apex_available: ["myapex"],
9465 min_sdk_version: "31",
9466 static_libs: ["another_util"],
9467 }
9468
9469 java_library {
9470 name: "another_util",
9471 srcs: ["a.java"],
9472 min_sdk_version: "31",
9473 apex_available: ["myapex"],
9474 }
9475 `)
9476 })
9477
9478 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9479 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9480 RunTestWithBp(t, `
9481 apex {
9482 name: "myapex",
9483 key: "myapex.key",
9484 bootclasspath_fragments: ["mybootclasspathfragment"],
9485 min_sdk_version: "30",
9486 updatable: false,
9487 }
9488
9489 apex_key {
9490 name: "myapex.key",
9491 public_key: "testkey.avbpubkey",
9492 private_key: "testkey.pem",
9493 }
9494
9495 bootclasspath_fragment {
9496 name: "mybootclasspathfragment",
9497 contents: ["mybootclasspathlib"],
9498 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009499 hidden_api: {
9500 split_packages: ["*"],
9501 },
satayev758968a2021-12-06 11:42:40 +00009502 }
9503
9504 java_sdk_library {
9505 name: "mybootclasspathlib",
9506 srcs: ["mybootclasspathlib.java"],
9507 apex_available: ["myapex"],
9508 compile_dex: true,
9509 unsafe_ignore_missing_latest_api: true,
9510 }
9511 `)
9512 })
9513
9514 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9515 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9516 RunTestWithBp(t, `
9517 apex {
9518 name: "myapex",
9519 key: "myapex.key",
9520 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9521 min_sdk_version: "30",
9522 updatable: false,
9523 }
9524
9525 apex_key {
9526 name: "myapex.key",
9527 public_key: "testkey.avbpubkey",
9528 private_key: "testkey.pem",
9529 }
9530
9531 systemserverclasspath_fragment {
9532 name: "mysystemserverclasspathfragment",
9533 contents: ["mysystemserverclasspathlib"],
9534 apex_available: ["myapex"],
9535 }
9536
9537 java_sdk_library {
9538 name: "mysystemserverclasspathlib",
9539 srcs: ["mysystemserverclasspathlib.java"],
9540 apex_available: ["myapex"],
9541 compile_dex: true,
9542 unsafe_ignore_missing_latest_api: true,
9543 }
9544 `)
9545 })
9546}
9547
Jiakai Zhang6decef92022-01-12 17:56:19 +00009548// Verifies that the APEX depends on all the Make modules in the list.
9549func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9550 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9551 for _, dep := range deps {
9552 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9553 }
9554}
9555
9556// Verifies that the APEX does not depend on any of the Make modules in the list.
9557func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9558 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9559 for _, dep := range deps {
9560 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9561 }
9562}
9563
Spandan Das66773252022-01-15 00:23:18 +00009564func TestApexStrictUpdtabilityLint(t *testing.T) {
9565 bpTemplate := `
9566 apex {
9567 name: "myapex",
9568 key: "myapex.key",
9569 java_libs: ["myjavalib"],
9570 updatable: %v,
9571 min_sdk_version: "29",
9572 }
9573 apex_key {
9574 name: "myapex.key",
9575 }
9576 java_library {
9577 name: "myjavalib",
9578 srcs: ["MyClass.java"],
9579 apex_available: [ "myapex" ],
9580 lint: {
9581 strict_updatability_linting: %v,
9582 },
9583 sdk_version: "current",
9584 min_sdk_version: "29",
9585 }
9586 `
9587 fs := android.MockFS{
9588 "lint-baseline.xml": nil,
9589 }
9590
9591 testCases := []struct {
9592 testCaseName string
9593 apexUpdatable bool
9594 javaStrictUpdtabilityLint bool
9595 lintFileExists bool
9596 disallowedFlagExpected bool
9597 }{
9598 {
9599 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9600 apexUpdatable: true,
9601 javaStrictUpdtabilityLint: true,
9602 lintFileExists: false,
9603 disallowedFlagExpected: false,
9604 },
9605 {
9606 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9607 apexUpdatable: false,
9608 javaStrictUpdtabilityLint: false,
9609 lintFileExists: true,
9610 disallowedFlagExpected: false,
9611 },
9612 {
9613 testCaseName: "non-updatable apex respects strict updatability of javalib",
9614 apexUpdatable: false,
9615 javaStrictUpdtabilityLint: true,
9616 lintFileExists: true,
9617 disallowedFlagExpected: true,
9618 },
9619 {
9620 testCaseName: "updatable apex sets strict updatability of javalib to true",
9621 apexUpdatable: true,
9622 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9623 lintFileExists: true,
9624 disallowedFlagExpected: true,
9625 },
9626 }
9627
9628 for _, testCase := range testCases {
9629 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9630 fixtures := []android.FixturePreparer{}
9631 if testCase.lintFileExists {
9632 fixtures = append(fixtures, fs.AddToFixture())
9633 }
9634
9635 result := testApex(t, bp, fixtures...)
9636 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9637 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9638 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9639
9640 if disallowedFlagActual != testCase.disallowedFlagExpected {
9641 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9642 }
9643 }
9644}
9645
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009646func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9647 bp := `
9648 apex {
9649 name: "myapex",
9650 key: "myapex.key",
9651 java_libs: ["myjavalib"],
9652 updatable: true,
9653 min_sdk_version: "29",
9654 }
9655 apex_key {
9656 name: "myapex.key",
9657 }
9658 java_library {
9659 name: "myjavalib",
9660 srcs: ["MyClass.java"],
9661 apex_available: [ "myapex" ],
9662 sdk_version: "current",
9663 min_sdk_version: "29",
9664 }
9665 `
9666
9667 testCases := []struct {
9668 testCaseName string
9669 moduleDirectory string
9670 disallowedFlagExpected bool
9671 }{
9672 {
9673 testCaseName: "lintable module defined outside libcore",
9674 moduleDirectory: "",
9675 disallowedFlagExpected: true,
9676 },
9677 {
9678 testCaseName: "lintable module defined in libcore root directory",
9679 moduleDirectory: "libcore/",
9680 disallowedFlagExpected: false,
9681 },
9682 {
9683 testCaseName: "lintable module defined in libcore child directory",
9684 moduleDirectory: "libcore/childdir/",
9685 disallowedFlagExpected: true,
9686 },
9687 }
9688
9689 for _, testCase := range testCases {
9690 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9691 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9692 result := testApex(t, "", lintFileCreator, bpFileCreator)
9693 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9694 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9695 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9696 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9697
9698 if disallowedFlagActual != testCase.disallowedFlagExpected {
9699 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9700 }
9701 }
9702}
9703
Spandan Das66773252022-01-15 00:23:18 +00009704// checks transtive deps of an apex coming from bootclasspath_fragment
9705func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9706 bp := `
9707 apex {
9708 name: "myapex",
9709 key: "myapex.key",
9710 bootclasspath_fragments: ["mybootclasspathfragment"],
9711 updatable: true,
9712 min_sdk_version: "29",
9713 }
9714 apex_key {
9715 name: "myapex.key",
9716 }
9717 bootclasspath_fragment {
9718 name: "mybootclasspathfragment",
9719 contents: ["myjavalib"],
9720 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009721 hidden_api: {
9722 split_packages: ["*"],
9723 },
Spandan Das66773252022-01-15 00:23:18 +00009724 }
9725 java_library {
9726 name: "myjavalib",
9727 srcs: ["MyClass.java"],
9728 apex_available: [ "myapex" ],
9729 sdk_version: "current",
9730 min_sdk_version: "29",
9731 compile_dex: true,
9732 }
9733 `
9734 fs := android.MockFS{
9735 "lint-baseline.xml": nil,
9736 }
9737
9738 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9739 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9740 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9741 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9742 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9743 }
9744}
9745
Spandan Das42e89502022-05-06 22:12:55 +00009746// updatable apexes should propagate updatable=true to its apps
9747func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9748 bp := `
9749 apex {
9750 name: "myapex",
9751 key: "myapex.key",
9752 updatable: %v,
9753 apps: [
9754 "myapp",
9755 ],
9756 min_sdk_version: "30",
9757 }
9758 apex_key {
9759 name: "myapex.key",
9760 }
9761 android_app {
9762 name: "myapp",
9763 updatable: %v,
9764 apex_available: [
9765 "myapex",
9766 ],
9767 sdk_version: "current",
9768 min_sdk_version: "30",
9769 }
9770 `
9771 testCases := []struct {
9772 name string
9773 apex_is_updatable_bp bool
9774 app_is_updatable_bp bool
9775 app_is_updatable_expected bool
9776 }{
9777 {
9778 name: "Non-updatable apex respects updatable property of non-updatable app",
9779 apex_is_updatable_bp: false,
9780 app_is_updatable_bp: false,
9781 app_is_updatable_expected: false,
9782 },
9783 {
9784 name: "Non-updatable apex respects updatable property of updatable app",
9785 apex_is_updatable_bp: false,
9786 app_is_updatable_bp: true,
9787 app_is_updatable_expected: true,
9788 },
9789 {
9790 name: "Updatable apex respects updatable property of updatable app",
9791 apex_is_updatable_bp: true,
9792 app_is_updatable_bp: true,
9793 app_is_updatable_expected: true,
9794 },
9795 {
9796 name: "Updatable apex sets updatable=true on non-updatable app",
9797 apex_is_updatable_bp: true,
9798 app_is_updatable_bp: false,
9799 app_is_updatable_expected: true,
9800 },
9801 }
9802 for _, testCase := range testCases {
9803 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9804 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9805 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9806 }
9807}
9808
Kiyoung Kim487689e2022-07-26 09:48:22 +09009809func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9810 bp := `
9811 apex {
9812 name: "myapex",
9813 key: "myapex.key",
9814 native_shared_libs: ["libfoo"],
9815 min_sdk_version: "29",
9816 }
9817 apex_key {
9818 name: "myapex.key",
9819 }
9820 cc_library {
9821 name: "libfoo",
9822 shared_libs: ["libc"],
9823 apex_available: ["myapex"],
9824 min_sdk_version: "29",
9825 }
9826 cc_api_library {
9827 name: "libc",
9828 src: "libc.so",
9829 min_sdk_version: "29",
9830 recovery_available: true,
9831 }
9832 api_imports {
9833 name: "api_imports",
9834 shared_libs: [
9835 "libc",
9836 ],
9837 header_libs: [],
9838 }
9839 `
9840 result := testApex(t, bp)
9841
9842 hasDep := func(m android.Module, wantDep android.Module) bool {
9843 t.Helper()
9844 var found bool
9845 result.VisitDirectDeps(m, func(dep blueprint.Module) {
9846 if dep == wantDep {
9847 found = true
9848 }
9849 })
9850 return found
9851 }
9852
9853 libfooApexVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex29").Module()
9854 libcApexVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared_apex29").Module()
9855
9856 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(libfooApexVariant, libcApexVariant))
9857
9858 // libfoo core variant should be buildable in the same inner tree since
9859 // certain mcombo files might build system and apexes in the same inner tree
9860 // libfoo core variant should link against source libc
9861 libfooCoreVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module()
9862 libcCoreVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared").Module()
9863 android.AssertBoolEquals(t, "core variant should link against source libc", true, hasDep(libfooCoreVariant, libcCoreVariant))
9864}