blob: 33fce7c8b75530b36e3f9da25caf5ce441abf287 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Kiyoung Kim487689e2022-07-26 09:48:22 +090028 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090029 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090036 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090037 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070038 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090039)
40
Jooyung Hand3639552019-08-09 12:57:43 +090041// names returns name list from white space separated string
42func names(s string) (ns []string) {
43 for _, n := range strings.Split(s, " ") {
44 if len(n) > 0 {
45 ns = append(ns, n)
46 }
47 }
48 return
49}
50
Paul Duffin40b62572021-03-20 11:39:01 +000051func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090052 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010053 android.GroupFixturePreparers(
54 prepareForApexTest,
55 android.GroupFixturePreparers(preparers...),
56 ).
Paul Duffine05480a2021-03-08 15:07:14 +000057 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000058 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090059}
60
Paul Duffin40b62572021-03-20 11:39:01 +000061func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090062 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010063
64 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000065 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010066 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000067 }
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 result := android.GroupFixturePreparers(
70 prepareForApexTest,
71 android.GroupFixturePreparers(preparers...),
72 optionalBpPreparer,
73 ).RunTest(t)
74
Paul Duffine05480a2021-03-08 15:07:14 +000075 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090076}
77
Paul Duffin810f33d2021-03-09 14:12:32 +000078func withFiles(files android.MockFS) android.FixturePreparer {
79 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090080}
81
Paul Duffin810f33d2021-03-09 14:12:32 +000082func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
83 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090084 for k, v := range targets {
85 config.Targets[k] = v
86 }
Paul Duffin810f33d2021-03-09 14:12:32 +000087 })
Jooyung Han344d5432019-08-23 11:17:39 +090088}
89
Jooyung Han35155c42020-02-06 17:33:20 +090090// withNativeBridgeTargets sets configuration with targets including:
91// - X86_64 (primary)
92// - X86 (secondary)
93// - Arm64 on X86_64 (native bridge)
94// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000095var withNativeBridgeEnabled = android.FixtureModifyConfig(
96 func(config android.Config) {
97 config.Targets[android.Android] = []android.Target{
98 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
99 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
100 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
101 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
102 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
103 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
104 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
105 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
106 }
107 },
108)
109
110func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
111 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
112 variables.ManifestPackageNameOverrides = specs
113 })
Jooyung Han35155c42020-02-06 17:33:20 +0900114}
115
Albert Martineefabcf2022-03-21 20:11:16 +0000116func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
117 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
118 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
119 })
120}
121
Paul Duffin810f33d2021-03-09 14:12:32 +0000122var withBinder32bit = android.FixtureModifyProductVariables(
123 func(variables android.FixtureProductVariables) {
124 variables.Binder32bit = proptools.BoolPtr(true)
125 },
126)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900127
Paul Duffin810f33d2021-03-09 14:12:32 +0000128var withUnbundledBuild = android.FixtureModifyProductVariables(
129 func(variables android.FixtureProductVariables) {
130 variables.Unbundled_build = proptools.BoolPtr(true)
131 },
132)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900133
Paul Duffin284165a2021-03-29 01:50:31 +0100134// Legacy preparer used for running tests within the apex package.
135//
136// This includes everything that was needed to run any test in the apex package prior to the
137// introduction of the test fixtures. Tests that are being converted to use fixtures directly
138// rather than through the testApex...() methods should avoid using this and instead use the
139// various preparers directly, using android.GroupFixturePreparers(...) to group them when
140// necessary.
141//
142// deprecated
143var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000144 // General preparers in alphabetical order as test infrastructure will enforce correct
145 // registration order.
146 android.PrepareForTestWithAndroidBuildComponents,
147 bpf.PrepareForTestWithBpf,
148 cc.PrepareForTestWithCcBuildComponents,
149 java.PrepareForTestWithJavaDefaultModules,
150 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
151 rust.PrepareForTestWithRustDefaultModules,
152 sh.PrepareForTestWithShBuildComponents,
153
154 PrepareForTestWithApexBuildComponents,
155
156 // Additional apex test specific preparers.
157 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
158 filegroup {
159 name: "myapex-file_contexts",
160 srcs: [
161 "apex/myapex-file_contexts",
162 ],
163 }
164 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000165 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000166 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000167 "a.java": nil,
168 "PrebuiltAppFoo.apk": nil,
169 "PrebuiltAppFooPriv.apk": nil,
170 "apex_manifest.json": nil,
171 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000172 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
173 "system/sepolicy/apex/myapex2-file_contexts": nil,
174 "system/sepolicy/apex/otherapex-file_contexts": nil,
175 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
176 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700177 "mylib.cpp": nil,
178 "mytest.cpp": nil,
179 "mytest1.cpp": nil,
180 "mytest2.cpp": nil,
181 "mytest3.cpp": nil,
182 "myprebuilt": nil,
183 "my_include": nil,
184 "foo/bar/MyClass.java": nil,
185 "prebuilt.jar": nil,
186 "prebuilt.so": nil,
187 "vendor/foo/devkeys/test.x509.pem": nil,
188 "vendor/foo/devkeys/test.pk8": nil,
189 "testkey.x509.pem": nil,
190 "testkey.pk8": nil,
191 "testkey.override.x509.pem": nil,
192 "testkey.override.pk8": nil,
193 "vendor/foo/devkeys/testkey.avbpubkey": nil,
194 "vendor/foo/devkeys/testkey.pem": nil,
195 "NOTICE": nil,
196 "custom_notice": nil,
197 "custom_notice_for_static_lib": nil,
198 "testkey2.avbpubkey": nil,
199 "testkey2.pem": nil,
200 "myapex-arm64.apex": nil,
201 "myapex-arm.apex": nil,
202 "myapex.apks": nil,
203 "frameworks/base/api/current.txt": nil,
204 "framework/aidl/a.aidl": nil,
205 "dummy.txt": nil,
206 "baz": nil,
207 "bar/baz": nil,
208 "testdata/baz": nil,
209 "AppSet.apks": nil,
210 "foo.rs": nil,
211 "libfoo.jar": nil,
212 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000213 },
214 ),
215
216 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
217 variables.DeviceVndkVersion = proptools.StringPtr("current")
218 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
219 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
220 variables.Platform_sdk_codename = proptools.StringPtr("Q")
221 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000222 // "Tiramisu" needs to be in the next line for compatibility with soong code,
223 // not because of these tests specifically (it's not used by the tests)
224 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900225 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000226 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000227 }),
228)
229
Paul Duffin52bfaa42021-03-23 23:40:12 +0000230var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
231 "system/sepolicy/apex/myapex-file_contexts": nil,
232})
233
Jooyung Han643adc42020-02-27 13:50:06 +0900234// ensure that 'result' equals 'expected'
235func ensureEquals(t *testing.T, result string, expected string) {
236 t.Helper()
237 if result != expected {
238 t.Errorf("%q != %q", expected, result)
239 }
240}
241
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242// ensure that 'result' contains 'expected'
243func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900244 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900245 if !strings.Contains(result, expected) {
246 t.Errorf("%q is not found in %q", expected, result)
247 }
248}
249
Liz Kammer5bd365f2020-05-27 15:15:11 -0700250// ensure that 'result' contains 'expected' exactly one time
251func ensureContainsOnce(t *testing.T, result string, expected string) {
252 t.Helper()
253 count := strings.Count(result, expected)
254 if count != 1 {
255 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
256 }
257}
258
Jiyong Park25fc6a92018-11-18 18:02:45 +0900259// ensures that 'result' does not contain 'notExpected'
260func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900261 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900262 if strings.Contains(result, notExpected) {
263 t.Errorf("%q is found in %q", notExpected, result)
264 }
265}
266
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700267func ensureMatches(t *testing.T, result string, expectedRex string) {
268 ok, err := regexp.MatchString(expectedRex, result)
269 if err != nil {
270 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
271 return
272 }
273 if !ok {
274 t.Errorf("%s does not match regular expession %s", result, expectedRex)
275 }
276}
277
Jiyong Park25fc6a92018-11-18 18:02:45 +0900278func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900279 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900280 if !android.InList(expected, result) {
281 t.Errorf("%q is not found in %v", expected, result)
282 }
283}
284
285func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900286 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900287 if android.InList(notExpected, result) {
288 t.Errorf("%q is found in %v", notExpected, result)
289 }
290}
291
Jooyung Hane1633032019-08-01 17:41:43 +0900292func ensureListEmpty(t *testing.T, result []string) {
293 t.Helper()
294 if len(result) > 0 {
295 t.Errorf("%q is expected to be empty", result)
296 }
297}
298
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000299func ensureListNotEmpty(t *testing.T, result []string) {
300 t.Helper()
301 if len(result) == 0 {
302 t.Errorf("%q is expected to be not empty", result)
303 }
304}
305
Jiyong Park25fc6a92018-11-18 18:02:45 +0900306// Minimal test
307func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800308 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900309 apex_defaults {
310 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900311 manifest: ":myapex.manifest",
312 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900313 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900314 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900315 native_shared_libs: [
316 "mylib",
317 "libfoo.ffi",
318 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900319 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800320 multilib: {
321 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900322 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800323 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900324 },
Jiyong Park77acec62020-06-01 21:39:15 +0900325 java_libs: [
326 "myjar",
327 "myjar_dex",
328 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000329 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900330 }
331
Jiyong Park30ca9372019-02-07 16:27:23 +0900332 apex {
333 name: "myapex",
334 defaults: ["myapex-defaults"],
335 }
336
Jiyong Park25fc6a92018-11-18 18:02:45 +0900337 apex_key {
338 name: "myapex.key",
339 public_key: "testkey.avbpubkey",
340 private_key: "testkey.pem",
341 }
342
Jiyong Park809bb722019-02-13 21:33:49 +0900343 filegroup {
344 name: "myapex.manifest",
345 srcs: ["apex_manifest.json"],
346 }
347
348 filegroup {
349 name: "myapex.androidmanifest",
350 srcs: ["AndroidManifest.xml"],
351 }
352
Jiyong Park25fc6a92018-11-18 18:02:45 +0900353 cc_library {
354 name: "mylib",
355 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900356 shared_libs: [
357 "mylib2",
358 "libbar.ffi",
359 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900360 system_shared_libs: [],
361 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000362 // TODO: remove //apex_available:platform
363 apex_available: [
364 "//apex_available:platform",
365 "myapex",
366 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900367 }
368
Alex Light3d673592019-01-18 14:37:31 -0800369 cc_binary {
370 name: "foo",
371 srcs: ["mylib.cpp"],
372 compile_multilib: "both",
373 multilib: {
374 lib32: {
375 suffix: "32",
376 },
377 lib64: {
378 suffix: "64",
379 },
380 },
381 symlinks: ["foo_link_"],
382 symlink_preferred_arch: true,
383 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800384 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700385 apex_available: [ "myapex", "com.android.gki.*" ],
386 }
387
Jiyong Park99644e92020-11-17 22:21:02 +0900388 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000389 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900390 srcs: ["foo.rs"],
391 rlibs: ["libfoo.rlib.rust"],
392 dylibs: ["libfoo.dylib.rust"],
393 apex_available: ["myapex"],
394 }
395
396 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000397 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900398 srcs: ["foo.rs"],
399 crate_name: "foo",
400 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900401 shared_libs: ["libfoo.shared_from_rust"],
402 }
403
404 cc_library_shared {
405 name: "libfoo.shared_from_rust",
406 srcs: ["mylib.cpp"],
407 system_shared_libs: [],
408 stl: "none",
409 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900410 }
411
412 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000413 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900414 srcs: ["foo.rs"],
415 crate_name: "foo",
416 apex_available: ["myapex"],
417 }
418
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900419 rust_ffi_shared {
420 name: "libfoo.ffi",
421 srcs: ["foo.rs"],
422 crate_name: "foo",
423 apex_available: ["myapex"],
424 }
425
426 rust_ffi_shared {
427 name: "libbar.ffi",
428 srcs: ["foo.rs"],
429 crate_name: "bar",
430 apex_available: ["myapex"],
431 }
432
Yifan Hongd22a84a2020-07-28 17:37:46 -0700433 apex {
434 name: "com.android.gki.fake",
435 binaries: ["foo"],
436 key: "myapex.key",
437 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000438 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800439 }
440
Paul Duffindddd5462020-04-07 15:25:44 +0100441 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900442 name: "mylib2",
443 srcs: ["mylib.cpp"],
444 system_shared_libs: [],
445 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900446 static_libs: ["libstatic"],
447 // TODO: remove //apex_available:platform
448 apex_available: [
449 "//apex_available:platform",
450 "myapex",
451 ],
452 }
453
Paul Duffindddd5462020-04-07 15:25:44 +0100454 cc_prebuilt_library_shared {
455 name: "mylib2",
456 srcs: ["prebuilt.so"],
457 // TODO: remove //apex_available:platform
458 apex_available: [
459 "//apex_available:platform",
460 "myapex",
461 ],
462 }
463
Jiyong Park9918e1a2020-03-17 19:16:40 +0900464 cc_library_static {
465 name: "libstatic",
466 srcs: ["mylib.cpp"],
467 system_shared_libs: [],
468 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000469 // TODO: remove //apex_available:platform
470 apex_available: [
471 "//apex_available:platform",
472 "myapex",
473 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900474 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900475
476 java_library {
477 name: "myjar",
478 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900479 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900480 sdk_version: "none",
481 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900482 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900483 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000484 // TODO: remove //apex_available:platform
485 apex_available: [
486 "//apex_available:platform",
487 "myapex",
488 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900489 }
490
Jiyong Park77acec62020-06-01 21:39:15 +0900491 dex_import {
492 name: "myjar_dex",
493 jars: ["prebuilt.jar"],
494 apex_available: [
495 "//apex_available:platform",
496 "myapex",
497 ],
498 }
499
Jiyong Park7f7766d2019-07-25 22:02:35 +0900500 java_library {
501 name: "myotherjar",
502 srcs: ["foo/bar/MyClass.java"],
503 sdk_version: "none",
504 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900505 // TODO: remove //apex_available:platform
506 apex_available: [
507 "//apex_available:platform",
508 "myapex",
509 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900510 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900511
512 java_library {
513 name: "mysharedjar",
514 srcs: ["foo/bar/MyClass.java"],
515 sdk_version: "none",
516 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900517 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900518 `)
519
Paul Duffina71a67a2021-03-29 00:42:57 +0100520 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900521
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900522 // Make sure that Android.mk is created
523 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700524 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900525 var builder strings.Builder
526 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
527
528 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000529 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900530 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
531
Jiyong Park42cca6c2019-04-01 11:15:50 +0900532 optFlags := apexRule.Args["opt_flags"]
533 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700534 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100535 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900536
Jiyong Park25fc6a92018-11-18 18:02:45 +0900537 copyCmds := apexRule.Args["copy_commands"]
538
539 // Ensure that main rule creates an output
540 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
541
542 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700543 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
544 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900546 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900547 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900548
549 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700550 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
551 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900552 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
553 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900554 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900556
557 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800558 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
559 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900560 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900561 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900562 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900563 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
564 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900565 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900566 // .. but not for java libs
567 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900568 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800569
Colin Cross7113d202019-11-20 16:39:12 -0800570 // Ensure that the platform variant ends with _shared or _common
571 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
572 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900573 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
574 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900575 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
576
577 // Ensure that dynamic dependency to java libs are not included
578 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800579
580 // Ensure that all symlinks are present.
581 found_foo_link_64 := false
582 found_foo := false
583 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900584 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800585 if strings.HasSuffix(cmd, "bin/foo") {
586 found_foo = true
587 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
588 found_foo_link_64 = true
589 }
590 }
591 }
592 good := found_foo && found_foo_link_64
593 if !good {
594 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
595 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900596
Artur Satayeva8bd1132020-04-27 18:07:06 +0100597 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100598 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
600 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
601 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100602
603 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100604 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
606 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
607 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800608}
609
Jooyung Hanf21c7972019-12-16 22:32:06 +0900610func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800611 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900612 apex_defaults {
613 name: "myapex-defaults",
614 key: "myapex.key",
615 prebuilts: ["myetc"],
616 native_shared_libs: ["mylib"],
617 java_libs: ["myjar"],
618 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900619 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800620 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000621 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900622 }
623
624 prebuilt_etc {
625 name: "myetc",
626 src: "myprebuilt",
627 }
628
629 apex {
630 name: "myapex",
631 defaults: ["myapex-defaults"],
632 }
633
634 apex_key {
635 name: "myapex.key",
636 public_key: "testkey.avbpubkey",
637 private_key: "testkey.pem",
638 }
639
640 cc_library {
641 name: "mylib",
642 system_shared_libs: [],
643 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000644 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900645 }
646
647 java_library {
648 name: "myjar",
649 srcs: ["foo/bar/MyClass.java"],
650 sdk_version: "none",
651 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000652 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900653 }
654
655 android_app {
656 name: "AppFoo",
657 srcs: ["foo/bar/MyClass.java"],
658 sdk_version: "none",
659 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000660 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900661 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900662
663 runtime_resource_overlay {
664 name: "rro",
665 theme: "blue",
666 }
667
markchien2f59ec92020-09-02 16:23:38 +0800668 bpf {
669 name: "bpf",
670 srcs: ["bpf.c", "bpf2.c"],
671 }
672
Ken Chenfad7f9d2021-11-10 22:02:57 +0800673 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800674 name: "netdTest",
675 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800676 sub_dir: "netd",
677 }
678
Jooyung Hanf21c7972019-12-16 22:32:06 +0900679 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000680 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900681 "etc/myetc",
682 "javalib/myjar.jar",
683 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000684 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900685 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800686 "etc/bpf/bpf.o",
687 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800688 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900689 })
690}
691
Jooyung Han01a3ee22019-11-02 02:52:25 +0900692func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800693 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900694 apex {
695 name: "myapex",
696 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000697 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900698 }
699
700 apex_key {
701 name: "myapex.key",
702 public_key: "testkey.avbpubkey",
703 private_key: "testkey.pem",
704 }
705 `)
706
707 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900708 args := module.Rule("apexRule").Args
709 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
710 t.Error("manifest should be apex_manifest.pb, but " + manifest)
711 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900712}
713
Liz Kammer4854a7d2021-05-27 14:28:27 -0400714func TestApexManifestMinSdkVersion(t *testing.T) {
715 ctx := testApex(t, `
716 apex_defaults {
717 name: "my_defaults",
718 key: "myapex.key",
719 product_specific: true,
720 file_contexts: ":my-file-contexts",
721 updatable: false,
722 }
723 apex {
724 name: "myapex_30",
725 min_sdk_version: "30",
726 defaults: ["my_defaults"],
727 }
728
729 apex {
730 name: "myapex_current",
731 min_sdk_version: "current",
732 defaults: ["my_defaults"],
733 }
734
735 apex {
736 name: "myapex_none",
737 defaults: ["my_defaults"],
738 }
739
740 apex_key {
741 name: "myapex.key",
742 public_key: "testkey.avbpubkey",
743 private_key: "testkey.pem",
744 }
745
746 filegroup {
747 name: "my-file-contexts",
748 srcs: ["product_specific_file_contexts"],
749 }
750 `, withFiles(map[string][]byte{
751 "product_specific_file_contexts": nil,
752 }), android.FixtureModifyProductVariables(
753 func(variables android.FixtureProductVariables) {
754 variables.Unbundled_build = proptools.BoolPtr(true)
755 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
756 }), android.FixtureMergeEnv(map[string]string{
757 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
758 }))
759
760 testCases := []struct {
761 module string
762 minSdkVersion string
763 }{
764 {
765 module: "myapex_30",
766 minSdkVersion: "30",
767 },
768 {
769 module: "myapex_current",
770 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
771 },
772 {
773 module: "myapex_none",
774 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
775 },
776 }
777 for _, tc := range testCases {
778 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
779 args := module.Rule("apexRule").Args
780 optFlags := args["opt_flags"]
781 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
782 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
783 }
784 }
785}
786
Alex Light5098a612018-11-29 17:12:15 -0800787func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800788 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800789 apex {
790 name: "myapex",
791 key: "myapex.key",
792 payload_type: "zip",
793 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000794 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800795 }
796
797 apex_key {
798 name: "myapex.key",
799 public_key: "testkey.avbpubkey",
800 private_key: "testkey.pem",
801 }
802
803 cc_library {
804 name: "mylib",
805 srcs: ["mylib.cpp"],
806 shared_libs: ["mylib2"],
807 system_shared_libs: [],
808 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000809 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800810 }
811
812 cc_library {
813 name: "mylib2",
814 srcs: ["mylib.cpp"],
815 system_shared_libs: [],
816 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000817 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800818 }
819 `)
820
Sundong Ahnabb64432019-10-22 13:58:29 +0900821 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800822 copyCmds := zipApexRule.Args["copy_commands"]
823
824 // Ensure that main rule creates an output
825 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
826
827 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700828 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800829
830 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700831 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800832
833 // Ensure that both direct and indirect deps are copied into apex
834 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
835 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900836}
837
838func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800839 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900840 apex {
841 name: "myapex",
842 key: "myapex.key",
843 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900844 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000845 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900846 }
847
848 apex_key {
849 name: "myapex.key",
850 public_key: "testkey.avbpubkey",
851 private_key: "testkey.pem",
852 }
853
854 cc_library {
855 name: "mylib",
856 srcs: ["mylib.cpp"],
857 shared_libs: ["mylib2", "mylib3"],
858 system_shared_libs: [],
859 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000860 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900861 }
862
863 cc_library {
864 name: "mylib2",
865 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900866 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900867 system_shared_libs: [],
868 stl: "none",
869 stubs: {
870 versions: ["1", "2", "3"],
871 },
872 }
873
874 cc_library {
875 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900876 srcs: ["mylib.cpp"],
877 shared_libs: ["mylib4"],
878 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900879 stl: "none",
880 stubs: {
881 versions: ["10", "11", "12"],
882 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000883 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900884 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900885
886 cc_library {
887 name: "mylib4",
888 srcs: ["mylib.cpp"],
889 system_shared_libs: [],
890 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000891 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900892 }
Jiyong Park105dc322021-06-11 17:22:09 +0900893
894 rust_binary {
895 name: "foo.rust",
896 srcs: ["foo.rs"],
897 shared_libs: ["libfoo.shared_from_rust"],
898 prefer_rlib: true,
899 apex_available: ["myapex"],
900 }
901
902 cc_library_shared {
903 name: "libfoo.shared_from_rust",
904 srcs: ["mylib.cpp"],
905 system_shared_libs: [],
906 stl: "none",
907 stubs: {
908 versions: ["10", "11", "12"],
909 },
910 }
911
Jiyong Park25fc6a92018-11-18 18:02:45 +0900912 `)
913
Sundong Ahnabb64432019-10-22 13:58:29 +0900914 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900915 copyCmds := apexRule.Args["copy_commands"]
916
917 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800918 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919
920 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800921 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900922
923 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800924 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900925
Colin Crossaede88c2020-08-11 12:17:01 -0700926 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900927
928 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900929 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900930 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900931 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900932
933 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700934 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900935 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700936 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900937
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700938 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
939 // is replaced by sharing of "cFlags" in cc/builder.go.
940 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
941 // module variable representing "cflags". So it was not detected by ensureNotContains.
942 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
943 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
944 // including the original cflags's "-include mylib.h".
945 //
Jiyong Park64379952018-12-13 18:37:29 +0900946 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700947 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
948 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900949
Jiyong Park85cc35a2022-07-17 11:30:47 +0900950 // Ensure that genstub for platform-provided lib is invoked with --systemapi
951 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
952 // Ensure that genstub for apex-provided lib is invoked with --apex
953 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900954
Jooyung Hana57af4a2020-01-23 05:36:59 +0000955 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900956 "lib64/mylib.so",
957 "lib64/mylib3.so",
958 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900959 "bin/foo.rust",
960 "lib64/libc++.so", // by the implicit dependency from foo.rust
961 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900962 })
Jiyong Park105dc322021-06-11 17:22:09 +0900963
964 // Ensure that stub dependency from a rust module is not included
965 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
966 // The rust module is linked to the stub cc library
967 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
968 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
969 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900970
971 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
972 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900973}
974
Jiyong Park1bc84122021-06-22 20:23:05 +0900975func TestApexCanUsePrivateApis(t *testing.T) {
976 ctx := testApex(t, `
977 apex {
978 name: "myapex",
979 key: "myapex.key",
980 native_shared_libs: ["mylib"],
981 binaries: ["foo.rust"],
982 updatable: false,
983 platform_apis: true,
984 }
985
986 apex_key {
987 name: "myapex.key",
988 public_key: "testkey.avbpubkey",
989 private_key: "testkey.pem",
990 }
991
992 cc_library {
993 name: "mylib",
994 srcs: ["mylib.cpp"],
995 shared_libs: ["mylib2"],
996 system_shared_libs: [],
997 stl: "none",
998 apex_available: [ "myapex" ],
999 }
1000
1001 cc_library {
1002 name: "mylib2",
1003 srcs: ["mylib.cpp"],
1004 cflags: ["-include mylib.h"],
1005 system_shared_libs: [],
1006 stl: "none",
1007 stubs: {
1008 versions: ["1", "2", "3"],
1009 },
1010 }
1011
1012 rust_binary {
1013 name: "foo.rust",
1014 srcs: ["foo.rs"],
1015 shared_libs: ["libfoo.shared_from_rust"],
1016 prefer_rlib: true,
1017 apex_available: ["myapex"],
1018 }
1019
1020 cc_library_shared {
1021 name: "libfoo.shared_from_rust",
1022 srcs: ["mylib.cpp"],
1023 system_shared_libs: [],
1024 stl: "none",
1025 stubs: {
1026 versions: ["10", "11", "12"],
1027 },
1028 }
1029 `)
1030
1031 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1032 copyCmds := apexRule.Args["copy_commands"]
1033
1034 // Ensure that indirect stubs dep is not included
1035 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1036 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1037
1038 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1039 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001040 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001041 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1042 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Parkd4a00632022-04-12 12:23:20 +09001043 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001044 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1045 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1046}
1047
Colin Cross7812fd32020-09-25 12:35:10 -07001048func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1049 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001050 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001051 apex {
1052 name: "myapex",
1053 key: "myapex.key",
1054 native_shared_libs: ["mylib", "mylib3"],
1055 min_sdk_version: "29",
1056 }
1057
1058 apex_key {
1059 name: "myapex.key",
1060 public_key: "testkey.avbpubkey",
1061 private_key: "testkey.pem",
1062 }
1063
1064 cc_library {
1065 name: "mylib",
1066 srcs: ["mylib.cpp"],
1067 shared_libs: ["mylib2", "mylib3"],
1068 system_shared_libs: [],
1069 stl: "none",
1070 apex_available: [ "myapex" ],
1071 min_sdk_version: "28",
1072 }
1073
1074 cc_library {
1075 name: "mylib2",
1076 srcs: ["mylib.cpp"],
1077 cflags: ["-include mylib.h"],
1078 system_shared_libs: [],
1079 stl: "none",
1080 stubs: {
1081 versions: ["28", "29", "30", "current"],
1082 },
1083 min_sdk_version: "28",
1084 }
1085
1086 cc_library {
1087 name: "mylib3",
1088 srcs: ["mylib.cpp"],
1089 shared_libs: ["mylib4"],
1090 system_shared_libs: [],
1091 stl: "none",
1092 stubs: {
1093 versions: ["28", "29", "30", "current"],
1094 },
1095 apex_available: [ "myapex" ],
1096 min_sdk_version: "28",
1097 }
1098
1099 cc_library {
1100 name: "mylib4",
1101 srcs: ["mylib.cpp"],
1102 system_shared_libs: [],
1103 stl: "none",
1104 apex_available: [ "myapex" ],
1105 min_sdk_version: "28",
1106 }
1107 `)
1108
1109 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1110 copyCmds := apexRule.Args["copy_commands"]
1111
1112 // Ensure that direct non-stubs dep is always included
1113 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1114
1115 // Ensure that indirect stubs dep is not included
1116 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1117
1118 // Ensure that direct stubs dep is included
1119 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1120
1121 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1122
Jiyong Park55549df2021-02-26 23:57:23 +09001123 // Ensure that mylib is linking with the latest version of stub for mylib2
1124 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001125 // ... and not linking to the non-stub (impl) variant of mylib2
1126 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1127
1128 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1129 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1130 // .. and not linking to the stubs variant of mylib3
1131 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1132
1133 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001134 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001135 ensureNotContains(t, mylib2Cflags, "-include ")
1136
Jiyong Park85cc35a2022-07-17 11:30:47 +09001137 // Ensure that genstub is invoked with --systemapi
1138 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001139
1140 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1141 "lib64/mylib.so",
1142 "lib64/mylib3.so",
1143 "lib64/mylib4.so",
1144 })
1145}
1146
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001147func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1148 t.Parallel()
1149 // myapex (Z)
1150 // mylib -----------------.
1151 // |
1152 // otherapex (29) |
1153 // libstub's versions: 29 Z current
1154 // |
1155 // <platform> |
1156 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001157 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001158 apex {
1159 name: "myapex",
1160 key: "myapex.key",
1161 native_shared_libs: ["mylib"],
1162 min_sdk_version: "Z", // non-final
1163 }
1164
1165 cc_library {
1166 name: "mylib",
1167 srcs: ["mylib.cpp"],
1168 shared_libs: ["libstub"],
1169 apex_available: ["myapex"],
1170 min_sdk_version: "Z",
1171 }
1172
1173 apex_key {
1174 name: "myapex.key",
1175 public_key: "testkey.avbpubkey",
1176 private_key: "testkey.pem",
1177 }
1178
1179 apex {
1180 name: "otherapex",
1181 key: "myapex.key",
1182 native_shared_libs: ["libstub"],
1183 min_sdk_version: "29",
1184 }
1185
1186 cc_library {
1187 name: "libstub",
1188 srcs: ["mylib.cpp"],
1189 stubs: {
1190 versions: ["29", "Z", "current"],
1191 },
1192 apex_available: ["otherapex"],
1193 min_sdk_version: "29",
1194 }
1195
1196 // platform module depending on libstub from otherapex should use the latest stub("current")
1197 cc_library {
1198 name: "libplatform",
1199 srcs: ["mylib.cpp"],
1200 shared_libs: ["libstub"],
1201 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001202 `,
1203 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1204 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1205 variables.Platform_sdk_final = proptools.BoolPtr(false)
1206 variables.Platform_version_active_codenames = []string{"Z"}
1207 }),
1208 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001209
Jiyong Park55549df2021-02-26 23:57:23 +09001210 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001211 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001212 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001213 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001214 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001215
1216 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1217 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1218 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1219 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1220 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1221}
1222
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001223func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001224 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001225 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001226 name: "myapex2",
1227 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001228 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001229 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001230 }
1231
1232 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001233 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001234 public_key: "testkey.avbpubkey",
1235 private_key: "testkey.pem",
1236 }
1237
1238 cc_library {
1239 name: "mylib",
1240 srcs: ["mylib.cpp"],
1241 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001242 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001243 system_shared_libs: [],
1244 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001245 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001246 }
1247
1248 cc_library {
1249 name: "libfoo",
1250 srcs: ["mylib.cpp"],
1251 shared_libs: ["libbar"],
1252 system_shared_libs: [],
1253 stl: "none",
1254 stubs: {
1255 versions: ["10", "20", "30"],
1256 },
1257 }
1258
1259 cc_library {
1260 name: "libbar",
1261 srcs: ["mylib.cpp"],
1262 system_shared_libs: [],
1263 stl: "none",
1264 }
1265
Jiyong Park678c8812020-02-07 17:25:49 +09001266 cc_library_static {
1267 name: "libbaz",
1268 srcs: ["mylib.cpp"],
1269 system_shared_libs: [],
1270 stl: "none",
1271 apex_available: [ "myapex2" ],
1272 }
1273
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001274 `)
1275
Jiyong Park83dc74b2020-01-14 18:38:44 +09001276 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001277 copyCmds := apexRule.Args["copy_commands"]
1278
1279 // Ensure that direct non-stubs dep is always included
1280 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1281
1282 // Ensure that indirect stubs dep is not included
1283 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1284
1285 // Ensure that dependency of stubs is not included
1286 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1287
Colin Crossaede88c2020-08-11 12:17:01 -07001288 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001289
1290 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001291 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001292 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001293 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001294
Jiyong Park3ff16992019-12-27 14:11:47 +09001295 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001296
1297 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1298 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001299
Artur Satayeva8bd1132020-04-27 18:07:06 +01001300 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001301 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001302
Artur Satayeva8bd1132020-04-27 18:07:06 +01001303 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001304 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001305}
1306
Jooyung Hand3639552019-08-09 12:57:43 +09001307func TestApexWithRuntimeLibsDependency(t *testing.T) {
1308 /*
1309 myapex
1310 |
1311 v (runtime_libs)
1312 mylib ------+------> libfoo [provides stub]
1313 |
1314 `------> libbar
1315 */
Colin Cross1c460562021-02-16 17:55:47 -08001316 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001317 apex {
1318 name: "myapex",
1319 key: "myapex.key",
1320 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001321 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001322 }
1323
1324 apex_key {
1325 name: "myapex.key",
1326 public_key: "testkey.avbpubkey",
1327 private_key: "testkey.pem",
1328 }
1329
1330 cc_library {
1331 name: "mylib",
1332 srcs: ["mylib.cpp"],
1333 runtime_libs: ["libfoo", "libbar"],
1334 system_shared_libs: [],
1335 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001336 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001337 }
1338
1339 cc_library {
1340 name: "libfoo",
1341 srcs: ["mylib.cpp"],
1342 system_shared_libs: [],
1343 stl: "none",
1344 stubs: {
1345 versions: ["10", "20", "30"],
1346 },
1347 }
1348
1349 cc_library {
1350 name: "libbar",
1351 srcs: ["mylib.cpp"],
1352 system_shared_libs: [],
1353 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001354 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001355 }
1356
1357 `)
1358
Sundong Ahnabb64432019-10-22 13:58:29 +09001359 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001360 copyCmds := apexRule.Args["copy_commands"]
1361
1362 // Ensure that direct non-stubs dep is always included
1363 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1364
1365 // Ensure that indirect stubs dep is not included
1366 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1367
1368 // Ensure that runtime_libs dep in included
1369 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1370
Sundong Ahnabb64432019-10-22 13:58:29 +09001371 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001372 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1373 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001374
1375}
1376
Paul Duffina02cae32021-03-09 01:44:06 +00001377var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1378 cc.PrepareForTestWithCcBuildComponents,
1379 PrepareForTestWithApexBuildComponents,
1380 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001381 apex {
1382 name: "com.android.runtime",
1383 key: "com.android.runtime.key",
1384 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001385 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001386 }
1387
1388 apex_key {
1389 name: "com.android.runtime.key",
1390 public_key: "testkey.avbpubkey",
1391 private_key: "testkey.pem",
1392 }
Paul Duffina02cae32021-03-09 01:44:06 +00001393 `),
1394 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1395)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001396
Paul Duffina02cae32021-03-09 01:44:06 +00001397func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001398 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001399 cc_library {
1400 name: "libc",
1401 no_libcrt: true,
1402 nocrt: true,
1403 stl: "none",
1404 system_shared_libs: [],
1405 stubs: { versions: ["1"] },
1406 apex_available: ["com.android.runtime"],
1407
1408 sanitize: {
1409 hwaddress: true,
1410 }
1411 }
1412
1413 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001414 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001415 no_libcrt: true,
1416 nocrt: true,
1417 stl: "none",
1418 system_shared_libs: [],
1419 srcs: [""],
1420 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001421 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001422
1423 sanitize: {
1424 never: true,
1425 },
Paul Duffina02cae32021-03-09 01:44:06 +00001426 } `)
1427 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001428
1429 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1430 "lib64/bionic/libc.so",
1431 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1432 })
1433
Colin Cross4c4c1be2022-02-10 11:41:18 -08001434 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001435
1436 installed := hwasan.Description("install libclang_rt.hwasan")
1437 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1438
1439 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1440 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1441 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1442}
1443
1444func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001445 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001446 prepareForTestOfRuntimeApexWithHwasan,
1447 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1448 variables.SanitizeDevice = []string{"hwaddress"}
1449 }),
1450 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001451 cc_library {
1452 name: "libc",
1453 no_libcrt: true,
1454 nocrt: true,
1455 stl: "none",
1456 system_shared_libs: [],
1457 stubs: { versions: ["1"] },
1458 apex_available: ["com.android.runtime"],
1459 }
1460
1461 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001462 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001463 no_libcrt: true,
1464 nocrt: true,
1465 stl: "none",
1466 system_shared_libs: [],
1467 srcs: [""],
1468 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001469 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001470
1471 sanitize: {
1472 never: true,
1473 },
1474 }
Paul Duffina02cae32021-03-09 01:44:06 +00001475 `)
1476 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001477
1478 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1479 "lib64/bionic/libc.so",
1480 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1481 })
1482
Colin Cross4c4c1be2022-02-10 11:41:18 -08001483 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001484
1485 installed := hwasan.Description("install libclang_rt.hwasan")
1486 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1487
1488 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1489 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1490 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1491}
1492
Jooyung Han61b66e92020-03-21 14:21:46 +00001493func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1494 testcases := []struct {
1495 name string
1496 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001497 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001498 shouldLink string
1499 shouldNotLink []string
1500 }{
1501 {
Jiyong Park55549df2021-02-26 23:57:23 +09001502 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001503 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001504 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001505 shouldLink: "current",
1506 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001507 },
1508 {
Jiyong Park55549df2021-02-26 23:57:23 +09001509 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001510 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001511 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001512 shouldLink: "current",
1513 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001514 },
1515 }
1516 for _, tc := range testcases {
1517 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001518 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001519 apex {
1520 name: "myapex",
1521 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001522 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001523 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001524 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001525 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001526
Jooyung Han61b66e92020-03-21 14:21:46 +00001527 apex_key {
1528 name: "myapex.key",
1529 public_key: "testkey.avbpubkey",
1530 private_key: "testkey.pem",
1531 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001532
Jooyung Han61b66e92020-03-21 14:21:46 +00001533 cc_library {
1534 name: "mylib",
1535 srcs: ["mylib.cpp"],
1536 vendor_available: true,
1537 shared_libs: ["libbar"],
1538 system_shared_libs: [],
1539 stl: "none",
1540 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001541 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001542 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001543
Jooyung Han61b66e92020-03-21 14:21:46 +00001544 cc_library {
1545 name: "libbar",
1546 srcs: ["mylib.cpp"],
1547 system_shared_libs: [],
1548 stl: "none",
1549 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001550 llndk: {
1551 symbol_file: "libbar.map.txt",
1552 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001553 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001554 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001555 withUnbundledBuild,
1556 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001557
Jooyung Han61b66e92020-03-21 14:21:46 +00001558 // Ensure that LLNDK dep is not included
1559 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1560 "lib64/mylib.so",
1561 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001562
Jooyung Han61b66e92020-03-21 14:21:46 +00001563 // Ensure that LLNDK dep is required
1564 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1565 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1566 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001567
Steven Moreland2c4000c2021-04-27 02:08:49 +00001568 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1569 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001570 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001571 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001572 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001573
Steven Moreland2c4000c2021-04-27 02:08:49 +00001574 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001575 ver := tc.shouldLink
1576 if tc.shouldLink == "current" {
1577 ver = strconv.Itoa(android.FutureApiLevelInt)
1578 }
1579 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001580 })
1581 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001582}
1583
Jiyong Park25fc6a92018-11-18 18:02:45 +09001584func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001585 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001586 apex {
1587 name: "myapex",
1588 key: "myapex.key",
1589 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001590 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001591 }
1592
1593 apex_key {
1594 name: "myapex.key",
1595 public_key: "testkey.avbpubkey",
1596 private_key: "testkey.pem",
1597 }
1598
1599 cc_library {
1600 name: "mylib",
1601 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001602 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001603 shared_libs: ["libdl#27"],
1604 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001605 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001606 }
1607
1608 cc_library_shared {
1609 name: "mylib_shared",
1610 srcs: ["mylib.cpp"],
1611 shared_libs: ["libdl#27"],
1612 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001613 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001614 }
1615
1616 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001617 name: "libBootstrap",
1618 srcs: ["mylib.cpp"],
1619 stl: "none",
1620 bootstrap: true,
1621 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001622 `)
1623
Sundong Ahnabb64432019-10-22 13:58:29 +09001624 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001625 copyCmds := apexRule.Args["copy_commands"]
1626
1627 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001628 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001629 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1630 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001631
1632 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001633 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001634
Colin Crossaede88c2020-08-11 12:17:01 -07001635 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1636 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1637 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001638
1639 // For dependency to libc
1640 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001641 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001642 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001643 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001644 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001645 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1646 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001647
1648 // For dependency to libm
1649 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001650 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001651 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001652 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001653 // ... and is not compiling with the stub
1654 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1655 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1656
1657 // For dependency to libdl
1658 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001659 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001660 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001661 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1662 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001663 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001664 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001665 // ... Cflags from stub is correctly exported to mylib
1666 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1667 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001668
1669 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001670 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1671 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1672 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1673 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001674}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001675
Jooyung Han749dc692020-04-15 11:03:39 +09001676func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001677 // there are three links between liba --> libz.
1678 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001679 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001680 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001681 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001682 apex {
1683 name: "myapex",
1684 key: "myapex.key",
1685 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001686 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001687 }
1688
1689 apex {
1690 name: "otherapex",
1691 key: "myapex.key",
1692 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001693 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001694 }
1695
1696 apex_key {
1697 name: "myapex.key",
1698 public_key: "testkey.avbpubkey",
1699 private_key: "testkey.pem",
1700 }
1701
1702 cc_library {
1703 name: "libx",
1704 shared_libs: ["liba"],
1705 system_shared_libs: [],
1706 stl: "none",
1707 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001708 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001709 }
1710
1711 cc_library {
1712 name: "liby",
1713 shared_libs: ["liba"],
1714 system_shared_libs: [],
1715 stl: "none",
1716 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001717 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001718 }
1719
1720 cc_library {
1721 name: "liba",
1722 shared_libs: ["libz"],
1723 system_shared_libs: [],
1724 stl: "none",
1725 apex_available: [
1726 "//apex_available:anyapex",
1727 "//apex_available:platform",
1728 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001729 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001730 }
1731
1732 cc_library {
1733 name: "libz",
1734 system_shared_libs: [],
1735 stl: "none",
1736 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001737 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001738 },
1739 }
Jooyung Han749dc692020-04-15 11:03:39 +09001740 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001741
1742 expectLink := func(from, from_variant, to, to_variant string) {
1743 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1744 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1745 }
1746 expectNoLink := func(from, from_variant, to, to_variant string) {
1747 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1748 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1749 }
1750 // platform liba is linked to non-stub version
1751 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001752 // liba in myapex is linked to current
1753 expectLink("liba", "shared_apex29", "libz", "shared_current")
1754 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001755 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001756 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001757 // liba in otherapex is linked to current
1758 expectLink("liba", "shared_apex30", "libz", "shared_current")
1759 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001760 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1761 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001762}
1763
Jooyung Hanaed150d2020-04-02 01:41:41 +09001764func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001765 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001766 apex {
1767 name: "myapex",
1768 key: "myapex.key",
1769 native_shared_libs: ["libx"],
1770 min_sdk_version: "R",
1771 }
1772
1773 apex_key {
1774 name: "myapex.key",
1775 public_key: "testkey.avbpubkey",
1776 private_key: "testkey.pem",
1777 }
1778
1779 cc_library {
1780 name: "libx",
1781 shared_libs: ["libz"],
1782 system_shared_libs: [],
1783 stl: "none",
1784 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001785 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001786 }
1787
1788 cc_library {
1789 name: "libz",
1790 system_shared_libs: [],
1791 stl: "none",
1792 stubs: {
1793 versions: ["29", "R"],
1794 },
1795 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001796 `,
1797 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1798 variables.Platform_version_active_codenames = []string{"R"}
1799 }),
1800 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001801
1802 expectLink := func(from, from_variant, to, to_variant string) {
1803 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1804 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1805 }
1806 expectNoLink := func(from, from_variant, to, to_variant string) {
1807 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1808 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1809 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001810 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1811 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001812 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1813 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001814}
1815
Jooyung Han4c4da062021-06-23 10:23:16 +09001816func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1817 testApex(t, `
1818 apex {
1819 name: "myapex",
1820 key: "myapex.key",
1821 java_libs: ["libx"],
1822 min_sdk_version: "S",
1823 }
1824
1825 apex_key {
1826 name: "myapex.key",
1827 public_key: "testkey.avbpubkey",
1828 private_key: "testkey.pem",
1829 }
1830
1831 java_library {
1832 name: "libx",
1833 srcs: ["a.java"],
1834 apex_available: [ "myapex" ],
1835 sdk_version: "current",
1836 min_sdk_version: "S", // should be okay
1837 }
1838 `,
1839 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1840 variables.Platform_version_active_codenames = []string{"S"}
1841 variables.Platform_sdk_codename = proptools.StringPtr("S")
1842 }),
1843 )
1844}
1845
Jooyung Han749dc692020-04-15 11:03:39 +09001846func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001847 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001848 apex {
1849 name: "myapex",
1850 key: "myapex.key",
1851 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001852 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001853 }
1854
1855 apex_key {
1856 name: "myapex.key",
1857 public_key: "testkey.avbpubkey",
1858 private_key: "testkey.pem",
1859 }
1860
1861 cc_library {
1862 name: "libx",
1863 shared_libs: ["libz"],
1864 system_shared_libs: [],
1865 stl: "none",
1866 apex_available: [ "myapex" ],
1867 }
1868
1869 cc_library {
1870 name: "libz",
1871 system_shared_libs: [],
1872 stl: "none",
1873 stubs: {
1874 versions: ["1", "2"],
1875 },
1876 }
1877 `)
1878
1879 expectLink := func(from, from_variant, to, to_variant string) {
1880 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1881 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1882 }
1883 expectNoLink := func(from, from_variant, to, to_variant string) {
1884 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1885 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1886 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001887 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001888 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001889 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001890 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001891}
1892
Jiyong Park5df7bd32021-08-25 16:18:46 +09001893func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1894 ctx := testApex(t, `
1895 apex {
1896 name: "myapex",
1897 key: "myapex.key",
1898 native_shared_libs: ["mylib"],
1899 updatable: false,
1900 vendor: true,
1901 min_sdk_version: "29",
1902 }
1903
1904 apex_key {
1905 name: "myapex.key",
1906 public_key: "testkey.avbpubkey",
1907 private_key: "testkey.pem",
1908 }
1909
1910 cc_library {
1911 name: "mylib",
1912 vendor_available: true,
1913 system_shared_libs: [],
1914 stl: "none",
1915 apex_available: [ "myapex" ],
1916 min_sdk_version: "29",
1917 }
1918 `)
1919
1920 vendorVariant := "android_vendor.29_arm64_armv8-a"
1921
1922 // First check that the correct variant of crtbegin_so is used.
1923 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1924 crtBegin := names(ldRule.Args["crtBegin"])
1925 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1926
1927 // Ensure that the crtbegin_so used by the APEX is targeting 29
1928 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1929 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1930}
1931
Jooyung Han03b51852020-02-26 22:45:42 +09001932func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001933 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001934 apex {
1935 name: "myapex",
1936 key: "myapex.key",
1937 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001938 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001939 }
1940
1941 apex_key {
1942 name: "myapex.key",
1943 public_key: "testkey.avbpubkey",
1944 private_key: "testkey.pem",
1945 }
1946
1947 cc_library {
1948 name: "libx",
1949 system_shared_libs: [],
1950 stl: "none",
1951 apex_available: [ "myapex" ],
1952 stubs: {
1953 versions: ["1", "2"],
1954 },
1955 }
1956
1957 cc_library {
1958 name: "libz",
1959 shared_libs: ["libx"],
1960 system_shared_libs: [],
1961 stl: "none",
1962 }
1963 `)
1964
1965 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001966 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001967 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1968 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1969 }
1970 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001971 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001972 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1973 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1974 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001975 expectLink("libz", "shared", "libx", "shared_current")
1976 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001977 expectNoLink("libz", "shared", "libz", "shared_1")
1978 expectNoLink("libz", "shared", "libz", "shared")
1979}
1980
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001981var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1982 func(variables android.FixtureProductVariables) {
1983 variables.SanitizeDevice = []string{"hwaddress"}
1984 },
1985)
1986
Jooyung Han75568392020-03-20 04:29:24 +09001987func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001988 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001989 apex {
1990 name: "myapex",
1991 key: "myapex.key",
1992 native_shared_libs: ["libx"],
1993 min_sdk_version: "29",
1994 }
1995
1996 apex_key {
1997 name: "myapex.key",
1998 public_key: "testkey.avbpubkey",
1999 private_key: "testkey.pem",
2000 }
2001
2002 cc_library {
2003 name: "libx",
2004 shared_libs: ["libbar"],
2005 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002006 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002007 }
2008
2009 cc_library {
2010 name: "libbar",
2011 stubs: {
2012 versions: ["29", "30"],
2013 },
2014 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002015 `,
2016 prepareForTestWithSantitizeHwaddress,
2017 )
Jooyung Han03b51852020-02-26 22:45:42 +09002018 expectLink := func(from, from_variant, to, to_variant string) {
2019 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2020 libFlags := ld.Args["libFlags"]
2021 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2022 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002023 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002024}
2025
Jooyung Han75568392020-03-20 04:29:24 +09002026func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002027 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002028 apex {
2029 name: "myapex",
2030 key: "myapex.key",
2031 native_shared_libs: ["libx"],
2032 min_sdk_version: "29",
2033 }
2034
2035 apex_key {
2036 name: "myapex.key",
2037 public_key: "testkey.avbpubkey",
2038 private_key: "testkey.pem",
2039 }
2040
2041 cc_library {
2042 name: "libx",
2043 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002044 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002045 }
Jooyung Han75568392020-03-20 04:29:24 +09002046 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002047
2048 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002049 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002050 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002051 // note that platform variant is not.
2052 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002053 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002054}
2055
Jooyung Han749dc692020-04-15 11:03:39 +09002056func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2057 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002058 apex {
2059 name: "myapex",
2060 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002061 native_shared_libs: ["mylib"],
2062 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002063 }
2064
2065 apex_key {
2066 name: "myapex.key",
2067 public_key: "testkey.avbpubkey",
2068 private_key: "testkey.pem",
2069 }
Jooyung Han749dc692020-04-15 11:03:39 +09002070
2071 cc_library {
2072 name: "mylib",
2073 srcs: ["mylib.cpp"],
2074 system_shared_libs: [],
2075 stl: "none",
2076 apex_available: [
2077 "myapex",
2078 ],
2079 min_sdk_version: "30",
2080 }
2081 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002082
2083 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2084 apex {
2085 name: "myapex",
2086 key: "myapex.key",
2087 native_shared_libs: ["libfoo.ffi"],
2088 min_sdk_version: "29",
2089 }
2090
2091 apex_key {
2092 name: "myapex.key",
2093 public_key: "testkey.avbpubkey",
2094 private_key: "testkey.pem",
2095 }
2096
2097 rust_ffi_shared {
2098 name: "libfoo.ffi",
2099 srcs: ["foo.rs"],
2100 crate_name: "foo",
2101 apex_available: [
2102 "myapex",
2103 ],
2104 min_sdk_version: "30",
2105 }
2106 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002107
2108 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2109 apex {
2110 name: "myapex",
2111 key: "myapex.key",
2112 java_libs: ["libfoo"],
2113 min_sdk_version: "29",
2114 }
2115
2116 apex_key {
2117 name: "myapex.key",
2118 public_key: "testkey.avbpubkey",
2119 private_key: "testkey.pem",
2120 }
2121
2122 java_import {
2123 name: "libfoo",
2124 jars: ["libfoo.jar"],
2125 apex_available: [
2126 "myapex",
2127 ],
2128 min_sdk_version: "30",
2129 }
2130 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002131}
2132
2133func TestApexMinSdkVersion_Okay(t *testing.T) {
2134 testApex(t, `
2135 apex {
2136 name: "myapex",
2137 key: "myapex.key",
2138 native_shared_libs: ["libfoo"],
2139 java_libs: ["libbar"],
2140 min_sdk_version: "29",
2141 }
2142
2143 apex_key {
2144 name: "myapex.key",
2145 public_key: "testkey.avbpubkey",
2146 private_key: "testkey.pem",
2147 }
2148
2149 cc_library {
2150 name: "libfoo",
2151 srcs: ["mylib.cpp"],
2152 shared_libs: ["libfoo_dep"],
2153 apex_available: ["myapex"],
2154 min_sdk_version: "29",
2155 }
2156
2157 cc_library {
2158 name: "libfoo_dep",
2159 srcs: ["mylib.cpp"],
2160 apex_available: ["myapex"],
2161 min_sdk_version: "29",
2162 }
2163
2164 java_library {
2165 name: "libbar",
2166 sdk_version: "current",
2167 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002168 static_libs: [
2169 "libbar_dep",
2170 "libbar_import_dep",
2171 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002172 apex_available: ["myapex"],
2173 min_sdk_version: "29",
2174 }
2175
2176 java_library {
2177 name: "libbar_dep",
2178 sdk_version: "current",
2179 srcs: ["a.java"],
2180 apex_available: ["myapex"],
2181 min_sdk_version: "29",
2182 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002183
2184 java_import {
2185 name: "libbar_import_dep",
2186 jars: ["libbar.jar"],
2187 apex_available: ["myapex"],
2188 min_sdk_version: "29",
2189 }
Jooyung Han03b51852020-02-26 22:45:42 +09002190 `)
2191}
2192
Colin Cross8ca61c12022-10-06 21:00:14 -07002193func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2194 // Tests that an apex dependency with min_sdk_version higher than the
2195 // min_sdk_version of the apex is allowed as long as the dependency's
2196 // min_sdk_version is less than or equal to the api level that the
2197 // architecture was introduced in. In this case, arm64 didn't exist
2198 // until api level 21, so the arm64 code will never need to run on
2199 // an api level 20 device, even if other architectures of the apex
2200 // will.
2201 testApex(t, `
2202 apex {
2203 name: "myapex",
2204 key: "myapex.key",
2205 native_shared_libs: ["libfoo"],
2206 min_sdk_version: "20",
2207 }
2208
2209 apex_key {
2210 name: "myapex.key",
2211 public_key: "testkey.avbpubkey",
2212 private_key: "testkey.pem",
2213 }
2214
2215 cc_library {
2216 name: "libfoo",
2217 srcs: ["mylib.cpp"],
2218 apex_available: ["myapex"],
2219 min_sdk_version: "21",
2220 stl: "none",
2221 }
2222 `)
2223}
2224
Artur Satayev8cf899a2020-04-15 17:29:42 +01002225func TestJavaStableSdkVersion(t *testing.T) {
2226 testCases := []struct {
2227 name string
2228 expectedError string
2229 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002230 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002231 }{
2232 {
2233 name: "Non-updatable apex with non-stable dep",
2234 bp: `
2235 apex {
2236 name: "myapex",
2237 java_libs: ["myjar"],
2238 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002239 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002240 }
2241 apex_key {
2242 name: "myapex.key",
2243 public_key: "testkey.avbpubkey",
2244 private_key: "testkey.pem",
2245 }
2246 java_library {
2247 name: "myjar",
2248 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002249 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002250 apex_available: ["myapex"],
2251 }
2252 `,
2253 },
2254 {
2255 name: "Updatable apex with stable dep",
2256 bp: `
2257 apex {
2258 name: "myapex",
2259 java_libs: ["myjar"],
2260 key: "myapex.key",
2261 updatable: true,
2262 min_sdk_version: "29",
2263 }
2264 apex_key {
2265 name: "myapex.key",
2266 public_key: "testkey.avbpubkey",
2267 private_key: "testkey.pem",
2268 }
2269 java_library {
2270 name: "myjar",
2271 srcs: ["foo/bar/MyClass.java"],
2272 sdk_version: "current",
2273 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002274 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002275 }
2276 `,
2277 },
2278 {
2279 name: "Updatable apex with non-stable dep",
2280 expectedError: "cannot depend on \"myjar\"",
2281 bp: `
2282 apex {
2283 name: "myapex",
2284 java_libs: ["myjar"],
2285 key: "myapex.key",
2286 updatable: true,
2287 }
2288 apex_key {
2289 name: "myapex.key",
2290 public_key: "testkey.avbpubkey",
2291 private_key: "testkey.pem",
2292 }
2293 java_library {
2294 name: "myjar",
2295 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002296 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002297 apex_available: ["myapex"],
2298 }
2299 `,
2300 },
2301 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002302 name: "Updatable apex with non-stable legacy core platform dep",
2303 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2304 bp: `
2305 apex {
2306 name: "myapex",
2307 java_libs: ["myjar-uses-legacy"],
2308 key: "myapex.key",
2309 updatable: true,
2310 }
2311 apex_key {
2312 name: "myapex.key",
2313 public_key: "testkey.avbpubkey",
2314 private_key: "testkey.pem",
2315 }
2316 java_library {
2317 name: "myjar-uses-legacy",
2318 srcs: ["foo/bar/MyClass.java"],
2319 sdk_version: "core_platform",
2320 apex_available: ["myapex"],
2321 }
2322 `,
2323 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2324 },
2325 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002326 name: "Updatable apex with non-stable transitive dep",
2327 // This is not actually detecting that the transitive dependency is unstable, rather it is
2328 // detecting that the transitive dependency is building against a wider API surface than the
2329 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002330 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002331 bp: `
2332 apex {
2333 name: "myapex",
2334 java_libs: ["myjar"],
2335 key: "myapex.key",
2336 updatable: true,
2337 }
2338 apex_key {
2339 name: "myapex.key",
2340 public_key: "testkey.avbpubkey",
2341 private_key: "testkey.pem",
2342 }
2343 java_library {
2344 name: "myjar",
2345 srcs: ["foo/bar/MyClass.java"],
2346 sdk_version: "current",
2347 apex_available: ["myapex"],
2348 static_libs: ["transitive-jar"],
2349 }
2350 java_library {
2351 name: "transitive-jar",
2352 srcs: ["foo/bar/MyClass.java"],
2353 sdk_version: "core_platform",
2354 apex_available: ["myapex"],
2355 }
2356 `,
2357 },
2358 }
2359
2360 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002361 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2362 continue
2363 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002364 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002365 errorHandler := android.FixtureExpectsNoErrors
2366 if test.expectedError != "" {
2367 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002368 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002369 android.GroupFixturePreparers(
2370 java.PrepareForTestWithJavaDefaultModules,
2371 PrepareForTestWithApexBuildComponents,
2372 prepareForTestWithMyapex,
2373 android.OptionalFixturePreparer(test.preparer),
2374 ).
2375 ExtendWithErrorHandler(errorHandler).
2376 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002377 })
2378 }
2379}
2380
Jooyung Han749dc692020-04-15 11:03:39 +09002381func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2382 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2383 apex {
2384 name: "myapex",
2385 key: "myapex.key",
2386 native_shared_libs: ["mylib"],
2387 min_sdk_version: "29",
2388 }
2389
2390 apex_key {
2391 name: "myapex.key",
2392 public_key: "testkey.avbpubkey",
2393 private_key: "testkey.pem",
2394 }
2395
2396 cc_library {
2397 name: "mylib",
2398 srcs: ["mylib.cpp"],
2399 shared_libs: ["mylib2"],
2400 system_shared_libs: [],
2401 stl: "none",
2402 apex_available: [
2403 "myapex",
2404 ],
2405 min_sdk_version: "29",
2406 }
2407
2408 // indirect part of the apex
2409 cc_library {
2410 name: "mylib2",
2411 srcs: ["mylib.cpp"],
2412 system_shared_libs: [],
2413 stl: "none",
2414 apex_available: [
2415 "myapex",
2416 ],
2417 min_sdk_version: "30",
2418 }
2419 `)
2420}
2421
2422func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2423 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2424 apex {
2425 name: "myapex",
2426 key: "myapex.key",
2427 apps: ["AppFoo"],
2428 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002429 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002430 }
2431
2432 apex_key {
2433 name: "myapex.key",
2434 public_key: "testkey.avbpubkey",
2435 private_key: "testkey.pem",
2436 }
2437
2438 android_app {
2439 name: "AppFoo",
2440 srcs: ["foo/bar/MyClass.java"],
2441 sdk_version: "current",
2442 min_sdk_version: "29",
2443 system_modules: "none",
2444 stl: "none",
2445 static_libs: ["bar"],
2446 apex_available: [ "myapex" ],
2447 }
2448
2449 java_library {
2450 name: "bar",
2451 sdk_version: "current",
2452 srcs: ["a.java"],
2453 apex_available: [ "myapex" ],
2454 }
2455 `)
2456}
2457
2458func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002459 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002460 apex {
2461 name: "myapex",
2462 key: "myapex.key",
2463 native_shared_libs: ["mylib"],
2464 min_sdk_version: "29",
2465 }
2466
2467 apex_key {
2468 name: "myapex.key",
2469 public_key: "testkey.avbpubkey",
2470 private_key: "testkey.pem",
2471 }
2472
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002473 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002474 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2475 cc_library {
2476 name: "mylib",
2477 srcs: ["mylib.cpp"],
2478 shared_libs: ["mylib2"],
2479 system_shared_libs: [],
2480 stl: "none",
2481 apex_available: ["myapex", "otherapex"],
2482 min_sdk_version: "29",
2483 }
2484
2485 cc_library {
2486 name: "mylib2",
2487 srcs: ["mylib.cpp"],
2488 system_shared_libs: [],
2489 stl: "none",
2490 apex_available: ["otherapex"],
2491 stubs: { versions: ["29", "30"] },
2492 min_sdk_version: "30",
2493 }
2494
2495 apex {
2496 name: "otherapex",
2497 key: "myapex.key",
2498 native_shared_libs: ["mylib", "mylib2"],
2499 min_sdk_version: "30",
2500 }
2501 `)
2502 expectLink := func(from, from_variant, to, to_variant string) {
2503 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2504 libFlags := ld.Args["libFlags"]
2505 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2506 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002507 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002508 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002509}
2510
Jooyung Haned124c32021-01-26 11:43:46 +09002511func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002512 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2513 func(variables android.FixtureProductVariables) {
2514 variables.Platform_sdk_codename = proptools.StringPtr("S")
2515 variables.Platform_version_active_codenames = []string{"S"}
2516 },
2517 )
Jooyung Haned124c32021-01-26 11:43:46 +09002518 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2519 apex {
2520 name: "myapex",
2521 key: "myapex.key",
2522 native_shared_libs: ["libfoo"],
2523 min_sdk_version: "S",
2524 }
2525 apex_key {
2526 name: "myapex.key",
2527 public_key: "testkey.avbpubkey",
2528 private_key: "testkey.pem",
2529 }
2530 cc_library {
2531 name: "libfoo",
2532 shared_libs: ["libbar"],
2533 apex_available: ["myapex"],
2534 min_sdk_version: "29",
2535 }
2536 cc_library {
2537 name: "libbar",
2538 apex_available: ["myapex"],
2539 }
2540 `, withSAsActiveCodeNames)
2541}
2542
2543func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002544 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2545 variables.Platform_sdk_codename = proptools.StringPtr("S")
2546 variables.Platform_version_active_codenames = []string{"S", "T"}
2547 })
Colin Cross1c460562021-02-16 17:55:47 -08002548 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002549 apex {
2550 name: "myapex",
2551 key: "myapex.key",
2552 native_shared_libs: ["libfoo"],
2553 min_sdk_version: "S",
2554 }
2555 apex_key {
2556 name: "myapex.key",
2557 public_key: "testkey.avbpubkey",
2558 private_key: "testkey.pem",
2559 }
2560 cc_library {
2561 name: "libfoo",
2562 shared_libs: ["libbar"],
2563 apex_available: ["myapex"],
2564 min_sdk_version: "S",
2565 }
2566 cc_library {
2567 name: "libbar",
2568 stubs: {
2569 symbol_file: "libbar.map.txt",
2570 versions: ["30", "S", "T"],
2571 },
2572 }
2573 `, withSAsActiveCodeNames)
2574
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002575 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002576 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2577 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002578 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002579}
2580
Jiyong Park7c2ee712018-12-07 00:42:25 +09002581func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002582 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002583 apex {
2584 name: "myapex",
2585 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002586 native_shared_libs: ["mylib"],
2587 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002588 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002589 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002590 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002591 }
2592
2593 apex_key {
2594 name: "myapex.key",
2595 public_key: "testkey.avbpubkey",
2596 private_key: "testkey.pem",
2597 }
2598
2599 prebuilt_etc {
2600 name: "myetc",
2601 src: "myprebuilt",
2602 sub_dir: "foo/bar",
2603 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002604
2605 cc_library {
2606 name: "mylib",
2607 srcs: ["mylib.cpp"],
2608 relative_install_path: "foo/bar",
2609 system_shared_libs: [],
2610 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002611 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002612 }
2613
2614 cc_binary {
2615 name: "mybin",
2616 srcs: ["mylib.cpp"],
2617 relative_install_path: "foo/bar",
2618 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002619 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002620 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002621 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002622 `)
2623
Sundong Ahnabb64432019-10-22 13:58:29 +09002624 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002625 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002626
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002627 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002628 ensureContains(t, cmd, "/etc ")
2629 ensureContains(t, cmd, "/etc/foo ")
2630 ensureContains(t, cmd, "/etc/foo/bar ")
2631 ensureContains(t, cmd, "/lib64 ")
2632 ensureContains(t, cmd, "/lib64/foo ")
2633 ensureContains(t, cmd, "/lib64/foo/bar ")
2634 ensureContains(t, cmd, "/lib ")
2635 ensureContains(t, cmd, "/lib/foo ")
2636 ensureContains(t, cmd, "/lib/foo/bar ")
2637 ensureContains(t, cmd, "/bin ")
2638 ensureContains(t, cmd, "/bin/foo ")
2639 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002640}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002641
Jooyung Han35155c42020-02-06 17:33:20 +09002642func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002643 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002644 apex {
2645 name: "myapex",
2646 key: "myapex.key",
2647 multilib: {
2648 both: {
2649 native_shared_libs: ["mylib"],
2650 binaries: ["mybin"],
2651 },
2652 },
2653 compile_multilib: "both",
2654 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002655 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002656 }
2657
2658 apex_key {
2659 name: "myapex.key",
2660 public_key: "testkey.avbpubkey",
2661 private_key: "testkey.pem",
2662 }
2663
2664 cc_library {
2665 name: "mylib",
2666 relative_install_path: "foo/bar",
2667 system_shared_libs: [],
2668 stl: "none",
2669 apex_available: [ "myapex" ],
2670 native_bridge_supported: true,
2671 }
2672
2673 cc_binary {
2674 name: "mybin",
2675 relative_install_path: "foo/bar",
2676 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002677 stl: "none",
2678 apex_available: [ "myapex" ],
2679 native_bridge_supported: true,
2680 compile_multilib: "both", // default is "first" for binary
2681 multilib: {
2682 lib64: {
2683 suffix: "64",
2684 },
2685 },
2686 }
2687 `, withNativeBridgeEnabled)
2688 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2689 "bin/foo/bar/mybin",
2690 "bin/foo/bar/mybin64",
2691 "bin/arm/foo/bar/mybin",
2692 "bin/arm64/foo/bar/mybin64",
2693 "lib/foo/bar/mylib.so",
2694 "lib/arm/foo/bar/mylib.so",
2695 "lib64/foo/bar/mylib.so",
2696 "lib64/arm64/foo/bar/mylib.so",
2697 })
2698}
2699
Jooyung Han85d61762020-06-24 23:50:26 +09002700func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002701 result := android.GroupFixturePreparers(
2702 prepareForApexTest,
2703 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2704 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002705 apex {
2706 name: "myapex",
2707 key: "myapex.key",
2708 binaries: ["mybin"],
2709 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002710 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002711 }
2712 apex_key {
2713 name: "myapex.key",
2714 public_key: "testkey.avbpubkey",
2715 private_key: "testkey.pem",
2716 }
2717 cc_binary {
2718 name: "mybin",
2719 vendor: true,
2720 shared_libs: ["libfoo"],
2721 }
2722 cc_library {
2723 name: "libfoo",
2724 proprietary: true,
2725 }
2726 `)
2727
Colin Crossc68db4b2021-11-11 18:59:15 -08002728 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002729 "bin/mybin",
2730 "lib64/libfoo.so",
2731 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2732 "lib64/libc++.so",
2733 })
2734
Colin Crossc68db4b2021-11-11 18:59:15 -08002735 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2736 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002737 name := apexBundle.BaseModuleName()
2738 prefix := "TARGET_"
2739 var builder strings.Builder
2740 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002741 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002742 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002743 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002744
Colin Crossc68db4b2021-11-11 18:59:15 -08002745 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002746 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2747 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002748}
2749
Jooyung Hanc5a96762022-02-04 11:54:50 +09002750func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2751 testApexError(t, `Trying to include a VNDK library`, `
2752 apex {
2753 name: "myapex",
2754 key: "myapex.key",
2755 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2756 vendor: true,
2757 use_vndk_as_stable: true,
2758 updatable: false,
2759 }
2760 apex_key {
2761 name: "myapex.key",
2762 public_key: "testkey.avbpubkey",
2763 private_key: "testkey.pem",
2764 }`)
2765}
2766
Jooyung Handf78e212020-07-22 15:54:47 +09002767func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002768 // myapex myapex2
2769 // | |
2770 // mybin ------. mybin2
2771 // \ \ / |
2772 // (stable) .---\--------` |
2773 // \ / \ |
2774 // \ / \ /
2775 // libvndk libvendor
2776 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002777 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002778 apex {
2779 name: "myapex",
2780 key: "myapex.key",
2781 binaries: ["mybin"],
2782 vendor: true,
2783 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002784 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002785 }
2786 apex_key {
2787 name: "myapex.key",
2788 public_key: "testkey.avbpubkey",
2789 private_key: "testkey.pem",
2790 }
2791 cc_binary {
2792 name: "mybin",
2793 vendor: true,
2794 shared_libs: ["libvndk", "libvendor"],
2795 }
2796 cc_library {
2797 name: "libvndk",
2798 vndk: {
2799 enabled: true,
2800 },
2801 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002802 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002803 }
2804 cc_library {
2805 name: "libvendor",
2806 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002807 stl: "none",
2808 }
2809 apex {
2810 name: "myapex2",
2811 key: "myapex.key",
2812 binaries: ["mybin2"],
2813 vendor: true,
2814 use_vndk_as_stable: false,
2815 updatable: false,
2816 }
2817 cc_binary {
2818 name: "mybin2",
2819 vendor: true,
2820 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002821 }
2822 `)
2823
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002824 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002825
Jooyung Han91f92032022-02-04 12:36:33 +09002826 for _, tc := range []struct {
2827 name string
2828 apexName string
2829 moduleName string
2830 moduleVariant string
2831 libs []string
2832 contents []string
2833 requireVndkNamespace bool
2834 }{
2835 {
2836 name: "use_vndk_as_stable",
2837 apexName: "myapex",
2838 moduleName: "mybin",
2839 moduleVariant: vendorVariant + "_apex10000",
2840 libs: []string{
2841 // should link with vendor variants of VNDK libs(libvndk/libc++)
2842 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2843 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2844 // unstable Vendor libs as APEX variant
2845 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2846 },
2847 contents: []string{
2848 "bin/mybin",
2849 "lib64/libvendor.so",
2850 // VNDK libs (libvndk/libc++) are not included
2851 },
2852 requireVndkNamespace: true,
2853 },
2854 {
2855 name: "!use_vndk_as_stable",
2856 apexName: "myapex2",
2857 moduleName: "mybin2",
2858 moduleVariant: vendorVariant + "_myapex2",
2859 libs: []string{
2860 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2861 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2862 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2863 // unstable vendor libs have "merged" APEX variants
2864 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2865 },
2866 contents: []string{
2867 "bin/mybin2",
2868 "lib64/libvendor.so",
2869 // VNDK libs are included as well
2870 "lib64/libvndk.so",
2871 "lib64/libc++.so",
2872 },
2873 requireVndkNamespace: false,
2874 },
2875 } {
2876 t.Run(tc.name, func(t *testing.T) {
2877 // Check linked libs
2878 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2879 libs := names(ldRule.Args["libFlags"])
2880 for _, lib := range tc.libs {
2881 ensureListContains(t, libs, lib)
2882 }
2883 // Check apex contents
2884 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002885
Jooyung Han91f92032022-02-04 12:36:33 +09002886 // Check "requireNativeLibs"
2887 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2888 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2889 if tc.requireVndkNamespace {
2890 ensureListContains(t, requireNativeLibs, ":vndk")
2891 } else {
2892 ensureListNotContains(t, requireNativeLibs, ":vndk")
2893 }
2894 })
2895 }
Jooyung Handf78e212020-07-22 15:54:47 +09002896}
2897
Justin Yun13decfb2021-03-08 19:25:55 +09002898func TestProductVariant(t *testing.T) {
2899 ctx := testApex(t, `
2900 apex {
2901 name: "myapex",
2902 key: "myapex.key",
2903 updatable: false,
2904 product_specific: true,
2905 binaries: ["foo"],
2906 }
2907
2908 apex_key {
2909 name: "myapex.key",
2910 public_key: "testkey.avbpubkey",
2911 private_key: "testkey.pem",
2912 }
2913
2914 cc_binary {
2915 name: "foo",
2916 product_available: true,
2917 apex_available: ["myapex"],
2918 srcs: ["foo.cpp"],
2919 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002920 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2921 variables.ProductVndkVersion = proptools.StringPtr("current")
2922 }),
2923 )
Justin Yun13decfb2021-03-08 19:25:55 +09002924
2925 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002926 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002927 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2928 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2929 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2930 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2931}
2932
Jooyung Han8e5685d2020-09-21 11:02:57 +09002933func TestApex_withPrebuiltFirmware(t *testing.T) {
2934 testCases := []struct {
2935 name string
2936 additionalProp string
2937 }{
2938 {"system apex with prebuilt_firmware", ""},
2939 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2940 }
2941 for _, tc := range testCases {
2942 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002943 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002944 apex {
2945 name: "myapex",
2946 key: "myapex.key",
2947 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002948 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002949 `+tc.additionalProp+`
2950 }
2951 apex_key {
2952 name: "myapex.key",
2953 public_key: "testkey.avbpubkey",
2954 private_key: "testkey.pem",
2955 }
2956 prebuilt_firmware {
2957 name: "myfirmware",
2958 src: "myfirmware.bin",
2959 filename_from_src: true,
2960 `+tc.additionalProp+`
2961 }
2962 `)
2963 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2964 "etc/firmware/myfirmware.bin",
2965 })
2966 })
2967 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002968}
2969
Jooyung Hanefb184e2020-06-25 17:14:25 +09002970func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002971 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002972 apex {
2973 name: "myapex",
2974 key: "myapex.key",
2975 vendor: true,
2976 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002977 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002978 }
2979
2980 apex_key {
2981 name: "myapex.key",
2982 public_key: "testkey.avbpubkey",
2983 private_key: "testkey.pem",
2984 }
2985
2986 cc_library {
2987 name: "mylib",
2988 vendor_available: true,
2989 }
2990 `)
2991
2992 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002993 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002994 name := apexBundle.BaseModuleName()
2995 prefix := "TARGET_"
2996 var builder strings.Builder
2997 data.Custom(&builder, name, prefix, "", data)
2998 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00002999 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003000}
3001
Jooyung Han2ed99d02020-06-24 23:26:26 +09003002func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003003 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003004 apex {
3005 name: "myapex",
3006 key: "myapex.key",
3007 vintf_fragments: ["fragment.xml"],
3008 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003009 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003010 }
3011 apex_key {
3012 name: "myapex.key",
3013 public_key: "testkey.avbpubkey",
3014 private_key: "testkey.pem",
3015 }
3016 cc_binary {
3017 name: "mybin",
3018 }
3019 `)
3020
3021 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003022 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003023 name := apexBundle.BaseModuleName()
3024 prefix := "TARGET_"
3025 var builder strings.Builder
3026 data.Custom(&builder, name, prefix, "", data)
3027 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003028 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003029 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003030}
3031
Jiyong Park16e91a02018-12-20 18:18:08 +09003032func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003033 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003034 apex {
3035 name: "myapex",
3036 key: "myapex.key",
3037 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003038 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003039 }
3040
3041 apex_key {
3042 name: "myapex.key",
3043 public_key: "testkey.avbpubkey",
3044 private_key: "testkey.pem",
3045 }
3046
3047 cc_library {
3048 name: "mylib",
3049 srcs: ["mylib.cpp"],
3050 system_shared_libs: [],
3051 stl: "none",
3052 stubs: {
3053 versions: ["1", "2", "3"],
3054 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003055 apex_available: [
3056 "//apex_available:platform",
3057 "myapex",
3058 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003059 }
3060
3061 cc_binary {
3062 name: "not_in_apex",
3063 srcs: ["mylib.cpp"],
3064 static_libs: ["mylib"],
3065 static_executable: true,
3066 system_shared_libs: [],
3067 stl: "none",
3068 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003069 `)
3070
Colin Cross7113d202019-11-20 16:39:12 -08003071 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003072
3073 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003074 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003075}
Jiyong Park9335a262018-12-24 11:31:58 +09003076
3077func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003078 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003079 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003080 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003081 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003082 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003083 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003084 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003085 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003086 }
3087
3088 cc_library {
3089 name: "mylib",
3090 srcs: ["mylib.cpp"],
3091 system_shared_libs: [],
3092 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003093 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003094 }
3095
3096 apex_key {
3097 name: "myapex.key",
3098 public_key: "testkey.avbpubkey",
3099 private_key: "testkey.pem",
3100 }
3101
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003102 android_app_certificate {
3103 name: "myapex.certificate",
3104 certificate: "testkey",
3105 }
3106
3107 android_app_certificate {
3108 name: "myapex.certificate.override",
3109 certificate: "testkey.override",
3110 }
3111
Jiyong Park9335a262018-12-24 11:31:58 +09003112 `)
3113
3114 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003115 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003116
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003117 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3118 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003119 "vendor/foo/devkeys/testkey.avbpubkey")
3120 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003121 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3122 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003123 "vendor/foo/devkeys/testkey.pem")
3124 }
3125
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003126 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003127 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003128 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003129 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003130 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003131 }
3132}
Jiyong Park58e364a2019-01-19 19:24:06 +09003133
Jooyung Hanf121a652019-12-17 14:30:11 +09003134func TestCertificate(t *testing.T) {
3135 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003136 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003137 apex {
3138 name: "myapex",
3139 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003140 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003141 }
3142 apex_key {
3143 name: "myapex.key",
3144 public_key: "testkey.avbpubkey",
3145 private_key: "testkey.pem",
3146 }`)
3147 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3148 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3149 if actual := rule.Args["certificates"]; actual != expected {
3150 t.Errorf("certificates should be %q, not %q", expected, actual)
3151 }
3152 })
3153 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003154 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003155 apex {
3156 name: "myapex_keytest",
3157 key: "myapex.key",
3158 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003159 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003160 }
3161 apex_key {
3162 name: "myapex.key",
3163 public_key: "testkey.avbpubkey",
3164 private_key: "testkey.pem",
3165 }
3166 android_app_certificate {
3167 name: "myapex.certificate.override",
3168 certificate: "testkey.override",
3169 }`)
3170 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3171 expected := "testkey.override.x509.pem testkey.override.pk8"
3172 if actual := rule.Args["certificates"]; actual != expected {
3173 t.Errorf("certificates should be %q, not %q", expected, actual)
3174 }
3175 })
3176 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003177 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003178 apex {
3179 name: "myapex",
3180 key: "myapex.key",
3181 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003182 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003183 }
3184 apex_key {
3185 name: "myapex.key",
3186 public_key: "testkey.avbpubkey",
3187 private_key: "testkey.pem",
3188 }
3189 android_app_certificate {
3190 name: "myapex.certificate",
3191 certificate: "testkey",
3192 }`)
3193 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3194 expected := "testkey.x509.pem testkey.pk8"
3195 if actual := rule.Args["certificates"]; actual != expected {
3196 t.Errorf("certificates should be %q, not %q", expected, actual)
3197 }
3198 })
3199 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003200 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003201 apex {
3202 name: "myapex_keytest",
3203 key: "myapex.key",
3204 file_contexts: ":myapex-file_contexts",
3205 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003206 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003207 }
3208 apex_key {
3209 name: "myapex.key",
3210 public_key: "testkey.avbpubkey",
3211 private_key: "testkey.pem",
3212 }
3213 android_app_certificate {
3214 name: "myapex.certificate.override",
3215 certificate: "testkey.override",
3216 }`)
3217 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3218 expected := "testkey.override.x509.pem testkey.override.pk8"
3219 if actual := rule.Args["certificates"]; actual != expected {
3220 t.Errorf("certificates should be %q, not %q", expected, actual)
3221 }
3222 })
3223 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003224 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003225 apex {
3226 name: "myapex",
3227 key: "myapex.key",
3228 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003229 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003230 }
3231 apex_key {
3232 name: "myapex.key",
3233 public_key: "testkey.avbpubkey",
3234 private_key: "testkey.pem",
3235 }`)
3236 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3237 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3238 if actual := rule.Args["certificates"]; actual != expected {
3239 t.Errorf("certificates should be %q, not %q", expected, actual)
3240 }
3241 })
3242 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003243 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003244 apex {
3245 name: "myapex_keytest",
3246 key: "myapex.key",
3247 file_contexts: ":myapex-file_contexts",
3248 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003249 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003250 }
3251 apex_key {
3252 name: "myapex.key",
3253 public_key: "testkey.avbpubkey",
3254 private_key: "testkey.pem",
3255 }
3256 android_app_certificate {
3257 name: "myapex.certificate.override",
3258 certificate: "testkey.override",
3259 }`)
3260 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3261 expected := "testkey.override.x509.pem testkey.override.pk8"
3262 if actual := rule.Args["certificates"]; actual != expected {
3263 t.Errorf("certificates should be %q, not %q", expected, actual)
3264 }
3265 })
3266}
3267
Jiyong Park58e364a2019-01-19 19:24:06 +09003268func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003269 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003270 apex {
3271 name: "myapex",
3272 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003273 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003274 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003275 }
3276
3277 apex {
3278 name: "otherapex",
3279 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003280 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003281 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003282 }
3283
3284 apex_key {
3285 name: "myapex.key",
3286 public_key: "testkey.avbpubkey",
3287 private_key: "testkey.pem",
3288 }
3289
3290 cc_library {
3291 name: "mylib",
3292 srcs: ["mylib.cpp"],
3293 system_shared_libs: [],
3294 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003295 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003296 "myapex",
3297 "otherapex",
3298 ],
Jooyung Han24282772020-03-21 23:20:55 +09003299 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003300 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003301 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003302 cc_library {
3303 name: "mylib2",
3304 srcs: ["mylib.cpp"],
3305 system_shared_libs: [],
3306 stl: "none",
3307 apex_available: [
3308 "myapex",
3309 "otherapex",
3310 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003311 static_libs: ["mylib3"],
3312 recovery_available: true,
3313 min_sdk_version: "29",
3314 }
3315 cc_library {
3316 name: "mylib3",
3317 srcs: ["mylib.cpp"],
3318 system_shared_libs: [],
3319 stl: "none",
3320 apex_available: [
3321 "myapex",
3322 "otherapex",
3323 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003324 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003325 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003326 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003327 `)
3328
Jooyung Hanc87a0592020-03-02 17:44:33 +09003329 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003330 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003331 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003332 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003333
Jooyung Hanccce2f22020-03-07 03:45:53 +09003334 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003335 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003336 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003337 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003338
Jooyung Hanccce2f22020-03-07 03:45:53 +09003339 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003340 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003341 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003342 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003343
Colin Crossaede88c2020-08-11 12:17:01 -07003344 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3345 // each variant defines additional macros to distinguish which apex variant it is built for
3346
3347 // non-APEX variant does not have __ANDROID_APEX__ defined
3348 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3349 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3350
Dan Albertb19953d2020-11-17 15:29:36 -08003351 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003352 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3353 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003354 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003355
Jooyung Hanc87a0592020-03-02 17:44:33 +09003356 // non-APEX variant does not have __ANDROID_APEX__ defined
3357 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3358 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3359
Dan Albertb19953d2020-11-17 15:29:36 -08003360 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003361 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003362 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003363 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003364}
Jiyong Park7e636d02019-01-28 16:16:54 +09003365
3366func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003367 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003368 apex {
3369 name: "myapex",
3370 key: "myapex.key",
3371 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003372 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003373 }
3374
3375 apex_key {
3376 name: "myapex.key",
3377 public_key: "testkey.avbpubkey",
3378 private_key: "testkey.pem",
3379 }
3380
3381 cc_library_headers {
3382 name: "mylib_headers",
3383 export_include_dirs: ["my_include"],
3384 system_shared_libs: [],
3385 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003386 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003387 }
3388
3389 cc_library {
3390 name: "mylib",
3391 srcs: ["mylib.cpp"],
3392 system_shared_libs: [],
3393 stl: "none",
3394 header_libs: ["mylib_headers"],
3395 export_header_lib_headers: ["mylib_headers"],
3396 stubs: {
3397 versions: ["1", "2", "3"],
3398 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003399 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003400 }
3401
3402 cc_library {
3403 name: "otherlib",
3404 srcs: ["mylib.cpp"],
3405 system_shared_libs: [],
3406 stl: "none",
3407 shared_libs: ["mylib"],
3408 }
3409 `)
3410
Colin Cross7113d202019-11-20 16:39:12 -08003411 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003412
3413 // Ensure that the include path of the header lib is exported to 'otherlib'
3414 ensureContains(t, cFlags, "-Imy_include")
3415}
Alex Light9670d332019-01-29 18:07:33 -08003416
Jiyong Park7cd10e32020-01-14 09:22:18 +09003417type fileInApex struct {
3418 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003419 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003420 isLink bool
3421}
3422
Jooyung Han1724d582022-12-21 10:17:44 +09003423func (f fileInApex) String() string {
3424 return f.src + ":" + f.path
3425}
3426
3427func (f fileInApex) match(expectation string) bool {
3428 parts := strings.Split(expectation, ":")
3429 if len(parts) == 1 {
3430 match, _ := path.Match(parts[0], f.path)
3431 return match
3432 }
3433 if len(parts) == 2 {
3434 matchSrc, _ := path.Match(parts[0], f.src)
3435 matchDst, _ := path.Match(parts[1], f.path)
3436 return matchSrc && matchDst
3437 }
3438 panic("invalid expected file specification: " + expectation)
3439}
3440
Jooyung Hana57af4a2020-01-23 05:36:59 +00003441func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003442 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003443 module := ctx.ModuleForTests(moduleName, variant)
3444 apexRule := module.MaybeRule("apexRule")
3445 apexDir := "/image.apex/"
3446 if apexRule.Rule == nil {
3447 apexRule = module.Rule("zipApexRule")
3448 apexDir = "/image.zipapex/"
3449 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003450 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003451 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003452 for _, cmd := range strings.Split(copyCmds, "&&") {
3453 cmd = strings.TrimSpace(cmd)
3454 if cmd == "" {
3455 continue
3456 }
3457 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003458 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003459 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003460 switch terms[0] {
3461 case "mkdir":
3462 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003463 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003464 t.Fatal("copyCmds contains invalid cp command", cmd)
3465 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003466 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003467 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003468 isLink = false
3469 case "ln":
3470 if len(terms) != 3 && len(terms) != 4 {
3471 // ln LINK TARGET or ln -s LINK TARGET
3472 t.Fatal("copyCmds contains invalid ln command", cmd)
3473 }
3474 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003475 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003476 isLink = true
3477 default:
3478 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3479 }
3480 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003481 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003482 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003483 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003484 }
Jooyung Han1724d582022-12-21 10:17:44 +09003485 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003486 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003487 }
3488 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003489 return ret
3490}
3491
Jooyung Hana57af4a2020-01-23 05:36:59 +00003492func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3493 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003494 var failed bool
3495 var surplus []string
3496 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003497 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Han1724d582022-12-21 10:17:44 +09003498 matchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003499 for _, expected := range files {
Jooyung Han1724d582022-12-21 10:17:44 +09003500 if file.match(expected) {
3501 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003502 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003503 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003504 }
3505 }
Jooyung Han1724d582022-12-21 10:17:44 +09003506 if !matchFound {
3507 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003508 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003509 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003510
Jooyung Han31c470b2019-10-18 16:26:59 +09003511 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003512 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003513 t.Log("surplus files", surplus)
3514 failed = true
3515 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003516
3517 if len(files) > len(filesMatched) {
3518 var missing []string
3519 for _, expected := range files {
3520 if !filesMatched[expected] {
3521 missing = append(missing, expected)
3522 }
3523 }
3524 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003525 t.Log("missing files", missing)
3526 failed = true
3527 }
3528 if failed {
3529 t.Fail()
3530 }
3531}
3532
Jooyung Han344d5432019-08-23 11:17:39 +09003533func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003534 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003535 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003536 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003537 "etc/llndk.libraries.29.txt",
3538 "etc/vndkcore.libraries.29.txt",
3539 "etc/vndksp.libraries.29.txt",
3540 "etc/vndkprivate.libraries.29.txt",
3541 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003542 }
3543 testCases := []struct {
3544 vndkVersion string
3545 expectedFiles []string
3546 }{
3547 {
3548 vndkVersion: "current",
3549 expectedFiles: append(commonFiles,
3550 "lib/libvndk.so",
3551 "lib/libvndksp.so",
3552 "lib64/libvndk.so",
3553 "lib64/libvndksp.so"),
3554 },
3555 {
3556 vndkVersion: "",
3557 expectedFiles: append(commonFiles,
3558 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3559 "lib/libvndksp.so",
3560 "lib64/libvndksp.so"),
3561 },
3562 }
3563 for _, tc := range testCases {
3564 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3565 ctx := testApex(t, `
3566 apex_vndk {
3567 name: "com.android.vndk.current",
3568 key: "com.android.vndk.current.key",
3569 updatable: false,
3570 }
3571
3572 apex_key {
3573 name: "com.android.vndk.current.key",
3574 public_key: "testkey.avbpubkey",
3575 private_key: "testkey.pem",
3576 }
3577
3578 cc_library {
3579 name: "libvndk",
3580 srcs: ["mylib.cpp"],
3581 vendor_available: true,
3582 product_available: true,
3583 vndk: {
3584 enabled: true,
3585 },
3586 system_shared_libs: [],
3587 stl: "none",
3588 apex_available: [ "com.android.vndk.current" ],
3589 }
3590
3591 cc_library {
3592 name: "libvndksp",
3593 srcs: ["mylib.cpp"],
3594 vendor_available: true,
3595 product_available: true,
3596 vndk: {
3597 enabled: true,
3598 support_system_process: true,
3599 },
3600 system_shared_libs: [],
3601 stl: "none",
3602 apex_available: [ "com.android.vndk.current" ],
3603 }
3604
3605 // VNDK-Ext should not cause any problems
3606
3607 cc_library {
3608 name: "libvndk.ext",
3609 srcs: ["mylib2.cpp"],
3610 vendor: true,
3611 vndk: {
3612 enabled: true,
3613 extends: "libvndk",
3614 },
3615 system_shared_libs: [],
3616 stl: "none",
3617 }
3618
3619 cc_library {
3620 name: "libvndksp.ext",
3621 srcs: ["mylib2.cpp"],
3622 vendor: true,
3623 vndk: {
3624 enabled: true,
3625 support_system_process: true,
3626 extends: "libvndksp",
3627 },
3628 system_shared_libs: [],
3629 stl: "none",
3630 }
3631 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3632 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3633 }))
3634 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3635 })
3636 }
Jooyung Han344d5432019-08-23 11:17:39 +09003637}
3638
3639func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003640 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003641 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003642 name: "com.android.vndk.current",
3643 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003644 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003645 }
3646
3647 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003648 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003649 public_key: "testkey.avbpubkey",
3650 private_key: "testkey.pem",
3651 }
3652
3653 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003654 name: "libvndk",
3655 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003656 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003657 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003658 vndk: {
3659 enabled: true,
3660 },
3661 system_shared_libs: [],
3662 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003663 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003664 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003665
3666 cc_prebuilt_library_shared {
3667 name: "libvndk.arm",
3668 srcs: ["libvndk.arm.so"],
3669 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003670 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003671 vndk: {
3672 enabled: true,
3673 },
3674 enabled: false,
3675 arch: {
3676 arm: {
3677 enabled: true,
3678 },
3679 },
3680 system_shared_libs: [],
3681 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003682 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003683 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003684 `+vndkLibrariesTxtFiles("current"),
3685 withFiles(map[string][]byte{
3686 "libvndk.so": nil,
3687 "libvndk.arm.so": nil,
3688 }))
Colin Cross2807f002021-03-02 10:15:29 -08003689 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003690 "lib/libvndk.so",
3691 "lib/libvndk.arm.so",
3692 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003693 "lib/libc++.so",
3694 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003695 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003696 })
Jooyung Han344d5432019-08-23 11:17:39 +09003697}
3698
Jooyung Han39edb6c2019-11-06 16:53:07 +09003699func vndkLibrariesTxtFiles(vers ...string) (result string) {
3700 for _, v := range vers {
3701 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003702 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003703 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003704 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003705 name: "` + txt + `.libraries.txt",
3706 }
3707 `
3708 }
3709 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003710 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003711 result += `
3712 prebuilt_etc {
3713 name: "` + txt + `.libraries.` + v + `.txt",
3714 src: "dummy.txt",
3715 }
3716 `
3717 }
3718 }
3719 }
3720 return
3721}
3722
Jooyung Han344d5432019-08-23 11:17:39 +09003723func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003724 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003725 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003726 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003727 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003728 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003729 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003730 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003731 }
3732
3733 apex_key {
3734 name: "myapex.key",
3735 public_key: "testkey.avbpubkey",
3736 private_key: "testkey.pem",
3737 }
3738
Jooyung Han31c470b2019-10-18 16:26:59 +09003739 vndk_prebuilt_shared {
3740 name: "libvndk27",
3741 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003742 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003743 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003744 vndk: {
3745 enabled: true,
3746 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003747 target_arch: "arm64",
3748 arch: {
3749 arm: {
3750 srcs: ["libvndk27_arm.so"],
3751 },
3752 arm64: {
3753 srcs: ["libvndk27_arm64.so"],
3754 },
3755 },
Colin Cross2807f002021-03-02 10:15:29 -08003756 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003757 }
3758
3759 vndk_prebuilt_shared {
3760 name: "libvndk27",
3761 version: "27",
3762 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003763 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003764 vndk: {
3765 enabled: true,
3766 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003767 target_arch: "x86_64",
3768 arch: {
3769 x86: {
3770 srcs: ["libvndk27_x86.so"],
3771 },
3772 x86_64: {
3773 srcs: ["libvndk27_x86_64.so"],
3774 },
3775 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003776 }
3777 `+vndkLibrariesTxtFiles("27"),
3778 withFiles(map[string][]byte{
3779 "libvndk27_arm.so": nil,
3780 "libvndk27_arm64.so": nil,
3781 "libvndk27_x86.so": nil,
3782 "libvndk27_x86_64.so": nil,
3783 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003784
Colin Cross2807f002021-03-02 10:15:29 -08003785 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003786 "lib/libvndk27_arm.so",
3787 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003788 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003789 })
Jooyung Han344d5432019-08-23 11:17:39 +09003790}
3791
Jooyung Han90eee022019-10-01 20:02:42 +09003792func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003793 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003794 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003795 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003796 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003797 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003798 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003799 }
3800 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003801 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003802 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003803 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003804 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003805 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003806 }
3807 apex_key {
3808 name: "myapex.key",
3809 public_key: "testkey.avbpubkey",
3810 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003811 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003812
3813 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003814 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003815 actual := proptools.String(bundle.properties.Apex_name)
3816 if !reflect.DeepEqual(actual, expected) {
3817 t.Errorf("Got '%v', expected '%v'", actual, expected)
3818 }
3819 }
3820
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003821 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003822 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003823}
3824
Jooyung Han344d5432019-08-23 11:17:39 +09003825func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003826 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003827 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003828 name: "com.android.vndk.current",
3829 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003830 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003831 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003832 }
3833
3834 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003835 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003836 public_key: "testkey.avbpubkey",
3837 private_key: "testkey.pem",
3838 }
3839
3840 cc_library {
3841 name: "libvndk",
3842 srcs: ["mylib.cpp"],
3843 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003844 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003845 native_bridge_supported: true,
3846 host_supported: true,
3847 vndk: {
3848 enabled: true,
3849 },
3850 system_shared_libs: [],
3851 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003852 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003853 }
Colin Cross2807f002021-03-02 10:15:29 -08003854 `+vndkLibrariesTxtFiles("current"),
3855 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003856
Colin Cross2807f002021-03-02 10:15:29 -08003857 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003858 "lib/libvndk.so",
3859 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003860 "lib/libc++.so",
3861 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003862 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003863 })
Jooyung Han344d5432019-08-23 11:17:39 +09003864}
3865
3866func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003867 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003868 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003869 name: "com.android.vndk.current",
3870 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003871 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003872 native_bridge_supported: true,
3873 }
3874
3875 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003876 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003877 public_key: "testkey.avbpubkey",
3878 private_key: "testkey.pem",
3879 }
3880
3881 cc_library {
3882 name: "libvndk",
3883 srcs: ["mylib.cpp"],
3884 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003885 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003886 native_bridge_supported: true,
3887 host_supported: true,
3888 vndk: {
3889 enabled: true,
3890 },
3891 system_shared_libs: [],
3892 stl: "none",
3893 }
3894 `)
3895}
3896
Jooyung Han31c470b2019-10-18 16:26:59 +09003897func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003898 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003899 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003900 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003901 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003902 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003903 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003904 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003905 }
3906
3907 apex_key {
3908 name: "myapex.key",
3909 public_key: "testkey.avbpubkey",
3910 private_key: "testkey.pem",
3911 }
3912
3913 vndk_prebuilt_shared {
3914 name: "libvndk27",
3915 version: "27",
3916 target_arch: "arm",
3917 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003918 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003919 vndk: {
3920 enabled: true,
3921 },
3922 arch: {
3923 arm: {
3924 srcs: ["libvndk27.so"],
3925 }
3926 },
3927 }
3928
3929 vndk_prebuilt_shared {
3930 name: "libvndk27",
3931 version: "27",
3932 target_arch: "arm",
3933 binder32bit: true,
3934 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003935 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003936 vndk: {
3937 enabled: true,
3938 },
3939 arch: {
3940 arm: {
3941 srcs: ["libvndk27binder32.so"],
3942 }
3943 },
Colin Cross2807f002021-03-02 10:15:29 -08003944 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003945 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003946 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003947 withFiles(map[string][]byte{
3948 "libvndk27.so": nil,
3949 "libvndk27binder32.so": nil,
3950 }),
3951 withBinder32bit,
3952 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003953 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003954 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3955 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003956 },
3957 }),
3958 )
3959
Colin Cross2807f002021-03-02 10:15:29 -08003960 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003961 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003962 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003963 })
3964}
3965
Jooyung Han45a96772020-06-15 14:59:42 +09003966func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003967 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003968 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003969 name: "com.android.vndk.current",
3970 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003971 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003972 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003973 }
3974
3975 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003976 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003977 public_key: "testkey.avbpubkey",
3978 private_key: "testkey.pem",
3979 }
3980
3981 cc_library {
3982 name: "libz",
3983 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003984 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003985 vndk: {
3986 enabled: true,
3987 },
3988 stubs: {
3989 symbol_file: "libz.map.txt",
3990 versions: ["30"],
3991 }
3992 }
3993 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3994 "libz.map.txt": nil,
3995 }))
3996
Colin Cross2807f002021-03-02 10:15:29 -08003997 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003998 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3999 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09004000 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
4001 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4002 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4003 "*/*",
4004 })
Jooyung Han45a96772020-06-15 14:59:42 +09004005}
4006
Jooyung Hane1633032019-08-01 17:41:43 +09004007func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004008 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004009 apex {
4010 name: "myapex_nodep",
4011 key: "myapex.key",
4012 native_shared_libs: ["lib_nodep"],
4013 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004014 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004015 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004016 }
4017
4018 apex {
4019 name: "myapex_dep",
4020 key: "myapex.key",
4021 native_shared_libs: ["lib_dep"],
4022 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004023 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004024 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004025 }
4026
4027 apex {
4028 name: "myapex_provider",
4029 key: "myapex.key",
4030 native_shared_libs: ["libfoo"],
4031 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004032 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004033 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004034 }
4035
4036 apex {
4037 name: "myapex_selfcontained",
4038 key: "myapex.key",
4039 native_shared_libs: ["lib_dep", "libfoo"],
4040 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004041 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004042 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004043 }
4044
4045 apex_key {
4046 name: "myapex.key",
4047 public_key: "testkey.avbpubkey",
4048 private_key: "testkey.pem",
4049 }
4050
4051 cc_library {
4052 name: "lib_nodep",
4053 srcs: ["mylib.cpp"],
4054 system_shared_libs: [],
4055 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004056 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004057 }
4058
4059 cc_library {
4060 name: "lib_dep",
4061 srcs: ["mylib.cpp"],
4062 shared_libs: ["libfoo"],
4063 system_shared_libs: [],
4064 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004065 apex_available: [
4066 "myapex_dep",
4067 "myapex_provider",
4068 "myapex_selfcontained",
4069 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004070 }
4071
4072 cc_library {
4073 name: "libfoo",
4074 srcs: ["mytest.cpp"],
4075 stubs: {
4076 versions: ["1"],
4077 },
4078 system_shared_libs: [],
4079 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004080 apex_available: [
4081 "myapex_provider",
4082 "myapex_selfcontained",
4083 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004084 }
4085 `)
4086
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004087 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004088 var provideNativeLibs, requireNativeLibs []string
4089
Sundong Ahnabb64432019-10-22 13:58:29 +09004090 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004091 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4092 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004093 ensureListEmpty(t, provideNativeLibs)
4094 ensureListEmpty(t, requireNativeLibs)
4095
Sundong Ahnabb64432019-10-22 13:58:29 +09004096 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004097 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4098 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004099 ensureListEmpty(t, provideNativeLibs)
4100 ensureListContains(t, requireNativeLibs, "libfoo.so")
4101
Sundong Ahnabb64432019-10-22 13:58:29 +09004102 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004103 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4104 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004105 ensureListContains(t, provideNativeLibs, "libfoo.so")
4106 ensureListEmpty(t, requireNativeLibs)
4107
Sundong Ahnabb64432019-10-22 13:58:29 +09004108 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004109 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4110 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004111 ensureListContains(t, provideNativeLibs, "libfoo.so")
4112 ensureListEmpty(t, requireNativeLibs)
4113}
4114
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004115func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004116 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004117 apex {
4118 name: "myapex",
4119 key: "myapex.key",
4120 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09004121 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004122 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004123 }
4124
4125 apex_key {
4126 name: "myapex.key",
4127 public_key: "testkey.avbpubkey",
4128 private_key: "testkey.pem",
4129 }
Jiyong Parkdb334862020-02-05 17:19:28 +09004130
4131 cc_library {
4132 name: "mylib",
4133 srcs: ["mylib.cpp"],
4134 system_shared_libs: [],
4135 stl: "none",
4136 apex_available: [
4137 "//apex_available:platform",
4138 "myapex",
4139 ],
4140 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004141 `)
4142
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004143 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004144 apexManifestRule := module.Rule("apexManifestRule")
4145 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4146 apexRule := module.Rule("apexRule")
4147 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004148
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004149 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004150 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004151 name := apexBundle.BaseModuleName()
4152 prefix := "TARGET_"
4153 var builder strings.Builder
4154 data.Custom(&builder, name, prefix, "", data)
4155 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00004156 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Parkdb334862020-02-05 17:19:28 +09004157 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004158}
4159
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004160func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4161 ctx := testApex(t, `
4162 apex {
4163 name: "myapex",
4164 key: "myapex.key",
4165 apex_name: "com.android.myapex",
4166 native_shared_libs: ["mylib"],
4167 updatable: false,
4168 }
4169
4170 apex_key {
4171 name: "myapex.key",
4172 public_key: "testkey.avbpubkey",
4173 private_key: "testkey.pem",
4174 }
4175
4176 cc_library {
4177 name: "mylib",
4178 srcs: ["mylib.cpp"],
4179 system_shared_libs: [],
4180 stl: "none",
4181 apex_available: [
4182 "//apex_available:platform",
4183 "myapex",
4184 ],
4185 }
4186 `, android.FixtureMergeEnv(map[string]string{
4187 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4188 }))
4189
4190 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
4191 apexManifestRule := module.Rule("apexManifestRule")
4192 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4193}
4194
Vinh Tran8f5310f2022-10-07 18:16:47 -04004195func TestCompileMultilibProp(t *testing.T) {
4196 testCases := []struct {
4197 compileMultiLibProp string
4198 containedLibs []string
4199 notContainedLibs []string
4200 }{
4201 {
4202 containedLibs: []string{
4203 "image.apex/lib64/mylib.so",
4204 "image.apex/lib/mylib.so",
4205 },
4206 compileMultiLibProp: `compile_multilib: "both",`,
4207 },
4208 {
4209 containedLibs: []string{"image.apex/lib64/mylib.so"},
4210 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4211 compileMultiLibProp: `compile_multilib: "first",`,
4212 },
4213 {
4214 containedLibs: []string{"image.apex/lib64/mylib.so"},
4215 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4216 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4217 },
4218 {
4219 containedLibs: []string{"image.apex/lib64/mylib.so"},
4220 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4221 compileMultiLibProp: `compile_multilib: "64",`,
4222 },
4223 {
4224 containedLibs: []string{"image.apex/lib/mylib.so"},
4225 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4226 compileMultiLibProp: `compile_multilib: "32",`,
4227 },
4228 }
4229 for _, testCase := range testCases {
4230 ctx := testApex(t, fmt.Sprintf(`
4231 apex {
4232 name: "myapex",
4233 key: "myapex.key",
4234 %s
4235 native_shared_libs: ["mylib"],
4236 updatable: false,
4237 }
4238 apex_key {
4239 name: "myapex.key",
4240 public_key: "testkey.avbpubkey",
4241 private_key: "testkey.pem",
4242 }
4243 cc_library {
4244 name: "mylib",
4245 srcs: ["mylib.cpp"],
4246 apex_available: [
4247 "//apex_available:platform",
4248 "myapex",
4249 ],
4250 }
4251 `, testCase.compileMultiLibProp),
4252 )
4253 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4254 apexRule := module.Rule("apexRule")
4255 copyCmds := apexRule.Args["copy_commands"]
4256 for _, containedLib := range testCase.containedLibs {
4257 ensureContains(t, copyCmds, containedLib)
4258 }
4259 for _, notContainedLib := range testCase.notContainedLibs {
4260 ensureNotContains(t, copyCmds, notContainedLib)
4261 }
4262 }
4263}
4264
Alex Light0851b882019-02-07 13:20:53 -08004265func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004266 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004267 apex {
4268 name: "myapex",
4269 key: "myapex.key",
4270 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004271 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004272 }
4273
4274 apex_key {
4275 name: "myapex.key",
4276 public_key: "testkey.avbpubkey",
4277 private_key: "testkey.pem",
4278 }
4279
4280 cc_library {
4281 name: "mylib_common",
4282 srcs: ["mylib.cpp"],
4283 system_shared_libs: [],
4284 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004285 apex_available: [
4286 "//apex_available:platform",
4287 "myapex",
4288 ],
Alex Light0851b882019-02-07 13:20:53 -08004289 }
4290 `)
4291
Sundong Ahnabb64432019-10-22 13:58:29 +09004292 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004293 apexRule := module.Rule("apexRule")
4294 copyCmds := apexRule.Args["copy_commands"]
4295
4296 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4297 t.Log("Apex was a test apex!")
4298 t.Fail()
4299 }
4300 // Ensure that main rule creates an output
4301 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4302
4303 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004304 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004305
4306 // Ensure that both direct and indirect deps are copied into apex
4307 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4308
Colin Cross7113d202019-11-20 16:39:12 -08004309 // Ensure that the platform variant ends with _shared
4310 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004311
Colin Cross56a83212020-09-15 18:30:11 -07004312 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004313 t.Log("Found mylib_common not in any apex!")
4314 t.Fail()
4315 }
4316}
4317
4318func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004319 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004320 apex_test {
4321 name: "myapex",
4322 key: "myapex.key",
4323 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004324 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004325 }
4326
4327 apex_key {
4328 name: "myapex.key",
4329 public_key: "testkey.avbpubkey",
4330 private_key: "testkey.pem",
4331 }
4332
4333 cc_library {
4334 name: "mylib_common_test",
4335 srcs: ["mylib.cpp"],
4336 system_shared_libs: [],
4337 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004338 // TODO: remove //apex_available:platform
4339 apex_available: [
4340 "//apex_available:platform",
4341 "myapex",
4342 ],
Alex Light0851b882019-02-07 13:20:53 -08004343 }
4344 `)
4345
Sundong Ahnabb64432019-10-22 13:58:29 +09004346 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004347 apexRule := module.Rule("apexRule")
4348 copyCmds := apexRule.Args["copy_commands"]
4349
4350 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4351 t.Log("Apex was not a test apex!")
4352 t.Fail()
4353 }
4354 // Ensure that main rule creates an output
4355 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4356
4357 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004358 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004359
4360 // Ensure that both direct and indirect deps are copied into apex
4361 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4362
Colin Cross7113d202019-11-20 16:39:12 -08004363 // Ensure that the platform variant ends with _shared
4364 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004365}
4366
Alex Light9670d332019-01-29 18:07:33 -08004367func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004368 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004369 apex {
4370 name: "myapex",
4371 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004372 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004373 multilib: {
4374 first: {
4375 native_shared_libs: ["mylib_common"],
4376 }
4377 },
4378 target: {
4379 android: {
4380 multilib: {
4381 first: {
4382 native_shared_libs: ["mylib"],
4383 }
4384 }
4385 },
4386 host: {
4387 multilib: {
4388 first: {
4389 native_shared_libs: ["mylib2"],
4390 }
4391 }
4392 }
4393 }
4394 }
4395
4396 apex_key {
4397 name: "myapex.key",
4398 public_key: "testkey.avbpubkey",
4399 private_key: "testkey.pem",
4400 }
4401
4402 cc_library {
4403 name: "mylib",
4404 srcs: ["mylib.cpp"],
4405 system_shared_libs: [],
4406 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004407 // TODO: remove //apex_available:platform
4408 apex_available: [
4409 "//apex_available:platform",
4410 "myapex",
4411 ],
Alex Light9670d332019-01-29 18:07:33 -08004412 }
4413
4414 cc_library {
4415 name: "mylib_common",
4416 srcs: ["mylib.cpp"],
4417 system_shared_libs: [],
4418 stl: "none",
4419 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004420 // TODO: remove //apex_available:platform
4421 apex_available: [
4422 "//apex_available:platform",
4423 "myapex",
4424 ],
Alex Light9670d332019-01-29 18:07:33 -08004425 }
4426
4427 cc_library {
4428 name: "mylib2",
4429 srcs: ["mylib.cpp"],
4430 system_shared_libs: [],
4431 stl: "none",
4432 compile_multilib: "first",
4433 }
4434 `)
4435
Sundong Ahnabb64432019-10-22 13:58:29 +09004436 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004437 copyCmds := apexRule.Args["copy_commands"]
4438
4439 // Ensure that main rule creates an output
4440 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4441
4442 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004443 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4444 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4445 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004446
4447 // Ensure that both direct and indirect deps are copied into apex
4448 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4449 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4450 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4451
Colin Cross7113d202019-11-20 16:39:12 -08004452 // Ensure that the platform variant ends with _shared
4453 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4454 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4455 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004456}
Jiyong Park04480cf2019-02-06 00:16:29 +09004457
Jiyong Park59140302020-12-14 18:44:04 +09004458func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004459 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004460 apex {
4461 name: "myapex",
4462 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004463 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004464 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004465 arch: {
4466 arm64: {
4467 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004468 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004469 },
4470 x86_64: {
4471 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004472 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004473 },
4474 }
4475 }
4476
4477 apex_key {
4478 name: "myapex.key",
4479 public_key: "testkey.avbpubkey",
4480 private_key: "testkey.pem",
4481 }
4482
4483 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004484 name: "mylib.generic",
4485 srcs: ["mylib.cpp"],
4486 system_shared_libs: [],
4487 stl: "none",
4488 // TODO: remove //apex_available:platform
4489 apex_available: [
4490 "//apex_available:platform",
4491 "myapex",
4492 ],
4493 }
4494
4495 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004496 name: "mylib.arm64",
4497 srcs: ["mylib.cpp"],
4498 system_shared_libs: [],
4499 stl: "none",
4500 // TODO: remove //apex_available:platform
4501 apex_available: [
4502 "//apex_available:platform",
4503 "myapex",
4504 ],
4505 }
4506
4507 cc_library {
4508 name: "mylib.x64",
4509 srcs: ["mylib.cpp"],
4510 system_shared_libs: [],
4511 stl: "none",
4512 // TODO: remove //apex_available:platform
4513 apex_available: [
4514 "//apex_available:platform",
4515 "myapex",
4516 ],
4517 }
4518 `)
4519
4520 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4521 copyCmds := apexRule.Args["copy_commands"]
4522
4523 // Ensure that apex variant is created for the direct dep
4524 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004525 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004526 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4527
4528 // Ensure that both direct and indirect deps are copied into apex
4529 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4530 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4531}
4532
Jiyong Park04480cf2019-02-06 00:16:29 +09004533func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004534 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004535 apex {
4536 name: "myapex",
4537 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004538 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004539 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004540 }
4541
4542 apex_key {
4543 name: "myapex.key",
4544 public_key: "testkey.avbpubkey",
4545 private_key: "testkey.pem",
4546 }
4547
4548 sh_binary {
4549 name: "myscript",
4550 src: "mylib.cpp",
4551 filename: "myscript.sh",
4552 sub_dir: "script",
4553 }
4554 `)
4555
Sundong Ahnabb64432019-10-22 13:58:29 +09004556 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004557 copyCmds := apexRule.Args["copy_commands"]
4558
4559 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4560}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004561
Jooyung Han91df2082019-11-20 01:49:42 +09004562func TestApexInVariousPartition(t *testing.T) {
4563 testcases := []struct {
4564 propName, parition, flattenedPartition string
4565 }{
4566 {"", "system", "system_ext"},
4567 {"product_specific: true", "product", "product"},
4568 {"soc_specific: true", "vendor", "vendor"},
4569 {"proprietary: true", "vendor", "vendor"},
4570 {"vendor: true", "vendor", "vendor"},
4571 {"system_ext_specific: true", "system_ext", "system_ext"},
4572 }
4573 for _, tc := range testcases {
4574 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004575 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004576 apex {
4577 name: "myapex",
4578 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004579 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004580 `+tc.propName+`
4581 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004582
Jooyung Han91df2082019-11-20 01:49:42 +09004583 apex_key {
4584 name: "myapex.key",
4585 public_key: "testkey.avbpubkey",
4586 private_key: "testkey.pem",
4587 }
4588 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004589
Jooyung Han91df2082019-11-20 01:49:42 +09004590 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004591 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4592 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004593 if actual != expected {
4594 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4595 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004596
Jooyung Han91df2082019-11-20 01:49:42 +09004597 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004598 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4599 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004600 if actual != expected {
4601 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4602 }
4603 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004604 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004605}
Jiyong Park67882562019-03-21 01:11:21 +09004606
Jooyung Han580eb4f2020-06-24 19:33:06 +09004607func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004608 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004609 apex {
4610 name: "myapex",
4611 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004612 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004613 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004614
Jooyung Han580eb4f2020-06-24 19:33:06 +09004615 apex_key {
4616 name: "myapex.key",
4617 public_key: "testkey.avbpubkey",
4618 private_key: "testkey.pem",
4619 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004620 `)
4621 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004622 rule := module.Output("file_contexts")
4623 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4624}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004625
Jooyung Han580eb4f2020-06-24 19:33:06 +09004626func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004627 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004628 apex {
4629 name: "myapex",
4630 key: "myapex.key",
4631 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004632 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004633 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004634
Jooyung Han580eb4f2020-06-24 19:33:06 +09004635 apex_key {
4636 name: "myapex.key",
4637 public_key: "testkey.avbpubkey",
4638 private_key: "testkey.pem",
4639 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004640 `, withFiles(map[string][]byte{
4641 "my_own_file_contexts": nil,
4642 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004643}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004644
Jooyung Han580eb4f2020-06-24 19:33:06 +09004645func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004646 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004647 apex {
4648 name: "myapex",
4649 key: "myapex.key",
4650 product_specific: true,
4651 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004652 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004653 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004654
Jooyung Han580eb4f2020-06-24 19:33:06 +09004655 apex_key {
4656 name: "myapex.key",
4657 public_key: "testkey.avbpubkey",
4658 private_key: "testkey.pem",
4659 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004660 `)
4661
Colin Cross1c460562021-02-16 17:55:47 -08004662 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004663 apex {
4664 name: "myapex",
4665 key: "myapex.key",
4666 product_specific: true,
4667 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004668 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004669 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004670
Jooyung Han580eb4f2020-06-24 19:33:06 +09004671 apex_key {
4672 name: "myapex.key",
4673 public_key: "testkey.avbpubkey",
4674 private_key: "testkey.pem",
4675 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004676 `, withFiles(map[string][]byte{
4677 "product_specific_file_contexts": nil,
4678 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004679 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4680 rule := module.Output("file_contexts")
4681 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4682}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004683
Jooyung Han580eb4f2020-06-24 19:33:06 +09004684func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004685 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004686 apex {
4687 name: "myapex",
4688 key: "myapex.key",
4689 product_specific: true,
4690 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004691 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004692 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004693
Jooyung Han580eb4f2020-06-24 19:33:06 +09004694 apex_key {
4695 name: "myapex.key",
4696 public_key: "testkey.avbpubkey",
4697 private_key: "testkey.pem",
4698 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004699
Jooyung Han580eb4f2020-06-24 19:33:06 +09004700 filegroup {
4701 name: "my-file-contexts",
4702 srcs: ["product_specific_file_contexts"],
4703 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004704 `, withFiles(map[string][]byte{
4705 "product_specific_file_contexts": nil,
4706 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004707 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4708 rule := module.Output("file_contexts")
4709 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004710}
4711
Jiyong Park67882562019-03-21 01:11:21 +09004712func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004713 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004714 apex_key {
4715 name: "myapex.key",
4716 public_key: ":my.avbpubkey",
4717 private_key: ":my.pem",
4718 product_specific: true,
4719 }
4720
4721 filegroup {
4722 name: "my.avbpubkey",
4723 srcs: ["testkey2.avbpubkey"],
4724 }
4725
4726 filegroup {
4727 name: "my.pem",
4728 srcs: ["testkey2.pem"],
4729 }
4730 `)
4731
4732 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4733 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004734 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004735 if actual_pubkey != expected_pubkey {
4736 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4737 }
4738 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004739 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004740 if actual_privkey != expected_privkey {
4741 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4742 }
4743}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004744
4745func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004746 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004747 prebuilt_apex {
4748 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004749 arch: {
4750 arm64: {
4751 src: "myapex-arm64.apex",
4752 },
4753 arm: {
4754 src: "myapex-arm.apex",
4755 },
4756 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004757 }
4758 `)
4759
Wei Li340ee8e2022-03-18 17:33:24 -07004760 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4761 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004762
Jiyong Parkc95714e2019-03-29 14:23:10 +09004763 expectedInput := "myapex-arm64.apex"
4764 if prebuilt.inputApex.String() != expectedInput {
4765 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4766 }
Wei Li340ee8e2022-03-18 17:33:24 -07004767 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4768 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4769 rule := testingModule.Rule("genProvenanceMetaData")
4770 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4771 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4772 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4773 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004774}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004775
Paul Duffinc0609c62021-03-01 17:27:16 +00004776func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004777 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004778 prebuilt_apex {
4779 name: "myapex",
4780 }
4781 `)
4782}
4783
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004784func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004785 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004786 prebuilt_apex {
4787 name: "myapex",
4788 src: "myapex-arm.apex",
4789 filename: "notmyapex.apex",
4790 }
4791 `)
4792
Wei Li340ee8e2022-03-18 17:33:24 -07004793 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4794 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004795
4796 expected := "notmyapex.apex"
4797 if p.installFilename != expected {
4798 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4799 }
Wei Li340ee8e2022-03-18 17:33:24 -07004800 rule := testingModule.Rule("genProvenanceMetaData")
4801 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4802 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4803 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4804 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004805}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004806
Samiul Islam7c02e262021-09-08 17:48:28 +01004807func TestApexSetFilenameOverride(t *testing.T) {
4808 testApex(t, `
4809 apex_set {
4810 name: "com.company.android.myapex",
4811 apex_name: "com.android.myapex",
4812 set: "company-myapex.apks",
4813 filename: "com.company.android.myapex.apex"
4814 }
4815 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4816
4817 testApex(t, `
4818 apex_set {
4819 name: "com.company.android.myapex",
4820 apex_name: "com.android.myapex",
4821 set: "company-myapex.apks",
4822 filename: "com.company.android.myapex.capex"
4823 }
4824 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4825
4826 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4827 apex_set {
4828 name: "com.company.android.myapex",
4829 apex_name: "com.android.myapex",
4830 set: "company-myapex.apks",
4831 filename: "some-random-suffix"
4832 }
4833 `)
4834}
4835
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004836func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004837 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004838 prebuilt_apex {
4839 name: "myapex.prebuilt",
4840 src: "myapex-arm.apex",
4841 overrides: [
4842 "myapex",
4843 ],
4844 }
4845 `)
4846
Wei Li340ee8e2022-03-18 17:33:24 -07004847 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4848 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004849
4850 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004851 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004852 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004853 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004854 }
Wei Li340ee8e2022-03-18 17:33:24 -07004855 rule := testingModule.Rule("genProvenanceMetaData")
4856 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4857 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4858 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4859 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004860}
4861
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004862func TestPrebuiltApexName(t *testing.T) {
4863 testApex(t, `
4864 prebuilt_apex {
4865 name: "com.company.android.myapex",
4866 apex_name: "com.android.myapex",
4867 src: "company-myapex-arm.apex",
4868 }
4869 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4870
4871 testApex(t, `
4872 apex_set {
4873 name: "com.company.android.myapex",
4874 apex_name: "com.android.myapex",
4875 set: "company-myapex.apks",
4876 }
4877 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4878}
4879
4880func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4881 _ = android.GroupFixturePreparers(
4882 java.PrepareForTestWithJavaDefaultModules,
4883 PrepareForTestWithApexBuildComponents,
4884 android.FixtureWithRootAndroidBp(`
4885 platform_bootclasspath {
4886 name: "platform-bootclasspath",
4887 fragments: [
4888 {
4889 apex: "com.android.art",
4890 module: "art-bootclasspath-fragment",
4891 },
4892 ],
4893 }
4894
4895 prebuilt_apex {
4896 name: "com.company.android.art",
4897 apex_name: "com.android.art",
4898 src: "com.company.android.art-arm.apex",
4899 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4900 }
4901
4902 prebuilt_bootclasspath_fragment {
4903 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004904 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004905 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004906 hidden_api: {
4907 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4908 metadata: "my-bootclasspath-fragment/metadata.csv",
4909 index: "my-bootclasspath-fragment/index.csv",
4910 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4911 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4912 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004913 }
4914
4915 java_import {
4916 name: "core-oj",
4917 jars: ["prebuilt.jar"],
4918 }
4919 `),
4920 ).RunTest(t)
4921}
4922
Paul Duffin092153d2021-01-26 11:42:39 +00004923// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4924// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004925func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004926 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004927
Paul Duffin89886cb2021-02-05 16:44:03 +00004928 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004929 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004930 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004931 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004932 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004933 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004934 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4935 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4936 android.NormalizePathForTesting(dexJarBuildPath))
4937 }
4938
4939 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004940 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004941 // Make sure the import has been given the correct path to the dex jar.
4942 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4943 dexJarBuildPath := p.DexJarInstallPath()
4944 stem := android.RemoveOptionalPrebuiltPrefix(name)
4945 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4946 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4947 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004948 }
4949
Paul Duffin39853512021-02-26 11:09:39 +00004950 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004951 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004952 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004953 android.AssertArrayString(t, "Check if there is no source variant",
4954 []string{"android_common"},
4955 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004956 }
4957
4958 t.Run("prebuilt only", func(t *testing.T) {
4959 bp := `
4960 prebuilt_apex {
4961 name: "myapex",
4962 arch: {
4963 arm64: {
4964 src: "myapex-arm64.apex",
4965 },
4966 arm: {
4967 src: "myapex-arm.apex",
4968 },
4969 },
Paul Duffin39853512021-02-26 11:09:39 +00004970 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004971 }
4972
4973 java_import {
4974 name: "libfoo",
4975 jars: ["libfoo.jar"],
4976 }
Paul Duffin39853512021-02-26 11:09:39 +00004977
4978 java_sdk_library_import {
4979 name: "libbar",
4980 public: {
4981 jars: ["libbar.jar"],
4982 },
4983 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004984 `
4985
4986 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4987 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4988
Martin Stjernholm44825602021-09-17 01:44:12 +01004989 deapexerName := deapexerModuleName("myapex")
4990 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4991
Paul Duffinf6932af2021-02-26 18:21:56 +00004992 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004993 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004994 rule := deapexer.Rule("deapexer")
4995 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4996 t.Errorf("expected: %q, found: %q", expected, actual)
4997 }
4998
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004999 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005000 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005001 rule = prebuiltApex.Rule("android/soong/android.Cp")
5002 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5003 t.Errorf("expected: %q, found: %q", expected, actual)
5004 }
5005
Paul Duffin89886cb2021-02-05 16:44:03 +00005006 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005007 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005008
5009 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005010 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005011 })
5012
5013 t.Run("prebuilt with source preferred", func(t *testing.T) {
5014
5015 bp := `
5016 prebuilt_apex {
5017 name: "myapex",
5018 arch: {
5019 arm64: {
5020 src: "myapex-arm64.apex",
5021 },
5022 arm: {
5023 src: "myapex-arm.apex",
5024 },
5025 },
Paul Duffin39853512021-02-26 11:09:39 +00005026 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005027 }
5028
5029 java_import {
5030 name: "libfoo",
5031 jars: ["libfoo.jar"],
5032 }
5033
5034 java_library {
5035 name: "libfoo",
5036 }
Paul Duffin39853512021-02-26 11:09:39 +00005037
5038 java_sdk_library_import {
5039 name: "libbar",
5040 public: {
5041 jars: ["libbar.jar"],
5042 },
5043 }
5044
5045 java_sdk_library {
5046 name: "libbar",
5047 srcs: ["foo/bar/MyClass.java"],
5048 unsafe_ignore_missing_latest_api: true,
5049 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005050 `
5051
5052 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5053 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5054
Paul Duffin89886cb2021-02-05 16:44:03 +00005055 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005056 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005057 ensureNoSourceVariant(t, ctx, "libfoo")
5058
5059 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005060 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005061 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005062 })
5063
5064 t.Run("prebuilt preferred with source", func(t *testing.T) {
5065 bp := `
5066 prebuilt_apex {
5067 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005068 arch: {
5069 arm64: {
5070 src: "myapex-arm64.apex",
5071 },
5072 arm: {
5073 src: "myapex-arm.apex",
5074 },
5075 },
Paul Duffin39853512021-02-26 11:09:39 +00005076 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005077 }
5078
5079 java_import {
5080 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005081 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005082 jars: ["libfoo.jar"],
5083 }
5084
5085 java_library {
5086 name: "libfoo",
5087 }
Paul Duffin39853512021-02-26 11:09:39 +00005088
5089 java_sdk_library_import {
5090 name: "libbar",
5091 prefer: true,
5092 public: {
5093 jars: ["libbar.jar"],
5094 },
5095 }
5096
5097 java_sdk_library {
5098 name: "libbar",
5099 srcs: ["foo/bar/MyClass.java"],
5100 unsafe_ignore_missing_latest_api: true,
5101 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005102 `
5103
5104 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5105 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5106
Paul Duffin89886cb2021-02-05 16:44:03 +00005107 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005108 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005109 ensureNoSourceVariant(t, ctx, "libfoo")
5110
5111 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005112 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005113 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005114 })
5115}
5116
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005117func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005118 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005119 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005120 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5121 // is disabled.
5122 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5123 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005124
Paul Duffin37856732021-02-26 14:24:15 +00005125 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5126 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005127 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005128 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005129 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005130 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005131 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005132 foundLibfooJar = true
5133 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005134 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005135 }
5136 }
5137 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005138 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 +00005139 }
5140 }
5141
Paul Duffin40a3f652021-07-19 13:11:24 +01005142 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005143 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005144 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005145 var rule android.TestingBuildParams
5146
5147 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5148 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005149 }
5150
Paul Duffin40a3f652021-07-19 13:11:24 +01005151 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5152 t.Helper()
5153 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5154 var rule android.TestingBuildParams
5155
5156 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5157 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5158 }
5159
Paul Duffin89f570a2021-06-16 01:42:33 +01005160 fragment := java.ApexVariantReference{
5161 Apex: proptools.StringPtr("myapex"),
5162 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5163 }
5164
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005165 t.Run("prebuilt only", func(t *testing.T) {
5166 bp := `
5167 prebuilt_apex {
5168 name: "myapex",
5169 arch: {
5170 arm64: {
5171 src: "myapex-arm64.apex",
5172 },
5173 arm: {
5174 src: "myapex-arm.apex",
5175 },
5176 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005177 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5178 }
5179
5180 prebuilt_bootclasspath_fragment {
5181 name: "my-bootclasspath-fragment",
5182 contents: ["libfoo", "libbar"],
5183 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005184 hidden_api: {
5185 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5186 metadata: "my-bootclasspath-fragment/metadata.csv",
5187 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005188 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5189 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5190 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005191 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005192 }
5193
5194 java_import {
5195 name: "libfoo",
5196 jars: ["libfoo.jar"],
5197 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005198 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005199 }
Paul Duffin37856732021-02-26 14:24:15 +00005200
5201 java_sdk_library_import {
5202 name: "libbar",
5203 public: {
5204 jars: ["libbar.jar"],
5205 },
5206 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005207 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005208 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005209 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005210 `
5211
Paul Duffin89f570a2021-06-16 01:42:33 +01005212 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005213 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5214 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005215
Paul Duffin537ea3d2021-05-14 10:38:00 +01005216 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005217 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005218 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005219 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005220 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5221 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005222 })
5223
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005224 t.Run("apex_set only", func(t *testing.T) {
5225 bp := `
5226 apex_set {
5227 name: "myapex",
5228 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005229 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5230 }
5231
5232 prebuilt_bootclasspath_fragment {
5233 name: "my-bootclasspath-fragment",
5234 contents: ["libfoo", "libbar"],
5235 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005236 hidden_api: {
5237 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5238 metadata: "my-bootclasspath-fragment/metadata.csv",
5239 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005240 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5241 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5242 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005243 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005244 }
5245
5246 java_import {
5247 name: "libfoo",
5248 jars: ["libfoo.jar"],
5249 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005250 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005251 }
5252
5253 java_sdk_library_import {
5254 name: "libbar",
5255 public: {
5256 jars: ["libbar.jar"],
5257 },
5258 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005259 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005260 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005261 }
5262 `
5263
Paul Duffin89f570a2021-06-16 01:42:33 +01005264 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005265 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5266 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5267
Paul Duffin537ea3d2021-05-14 10:38:00 +01005268 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005269 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005270 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005271 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005272 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5273 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005274 })
5275
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005276 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5277 bp := `
5278 prebuilt_apex {
5279 name: "myapex",
5280 arch: {
5281 arm64: {
5282 src: "myapex-arm64.apex",
5283 },
5284 arm: {
5285 src: "myapex-arm.apex",
5286 },
5287 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005288 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5289 }
5290
5291 prebuilt_bootclasspath_fragment {
5292 name: "my-bootclasspath-fragment",
5293 contents: ["libfoo", "libbar"],
5294 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005295 hidden_api: {
5296 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5297 metadata: "my-bootclasspath-fragment/metadata.csv",
5298 index: "my-bootclasspath-fragment/index.csv",
5299 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5300 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5301 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005302 }
5303
5304 java_import {
5305 name: "libfoo",
5306 jars: ["libfoo.jar"],
5307 apex_available: ["myapex"],
5308 }
5309
5310 java_library {
5311 name: "libfoo",
5312 srcs: ["foo/bar/MyClass.java"],
5313 apex_available: ["myapex"],
5314 }
Paul Duffin37856732021-02-26 14:24:15 +00005315
5316 java_sdk_library_import {
5317 name: "libbar",
5318 public: {
5319 jars: ["libbar.jar"],
5320 },
5321 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005322 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005323 }
5324
5325 java_sdk_library {
5326 name: "libbar",
5327 srcs: ["foo/bar/MyClass.java"],
5328 unsafe_ignore_missing_latest_api: true,
5329 apex_available: ["myapex"],
5330 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005331 `
5332
5333 // In this test the source (java_library) libfoo is active since the
5334 // prebuilt (java_import) defaults to prefer:false. However the
5335 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5336 // find the dex boot jar in it. We either need to disable the source libfoo
5337 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005338 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005339 // dexbootjar check is skipped if AllowMissingDependencies is true
5340 preparerAllowMissingDeps := android.GroupFixturePreparers(
5341 preparer,
5342 android.PrepareForTestWithAllowMissingDependencies,
5343 )
5344 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005345 })
5346
5347 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5348 bp := `
5349 prebuilt_apex {
5350 name: "myapex",
5351 arch: {
5352 arm64: {
5353 src: "myapex-arm64.apex",
5354 },
5355 arm: {
5356 src: "myapex-arm.apex",
5357 },
5358 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005359 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5360 }
5361
5362 prebuilt_bootclasspath_fragment {
5363 name: "my-bootclasspath-fragment",
5364 contents: ["libfoo", "libbar"],
5365 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005366 hidden_api: {
5367 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5368 metadata: "my-bootclasspath-fragment/metadata.csv",
5369 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005370 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5371 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5372 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005373 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005374 }
5375
5376 java_import {
5377 name: "libfoo",
5378 prefer: true,
5379 jars: ["libfoo.jar"],
5380 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005381 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005382 }
5383
5384 java_library {
5385 name: "libfoo",
5386 srcs: ["foo/bar/MyClass.java"],
5387 apex_available: ["myapex"],
5388 }
Paul Duffin37856732021-02-26 14:24:15 +00005389
5390 java_sdk_library_import {
5391 name: "libbar",
5392 prefer: true,
5393 public: {
5394 jars: ["libbar.jar"],
5395 },
5396 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005397 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005398 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005399 }
5400
5401 java_sdk_library {
5402 name: "libbar",
5403 srcs: ["foo/bar/MyClass.java"],
5404 unsafe_ignore_missing_latest_api: true,
5405 apex_available: ["myapex"],
5406 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005407 `
5408
Paul Duffin89f570a2021-06-16 01:42:33 +01005409 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005410 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5411 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005412
Paul Duffin537ea3d2021-05-14 10:38:00 +01005413 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005414 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005415 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005416 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005417 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5418 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005419 })
5420
5421 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5422 bp := `
5423 apex {
5424 name: "myapex",
5425 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005426 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005427 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005428 }
5429
5430 apex_key {
5431 name: "myapex.key",
5432 public_key: "testkey.avbpubkey",
5433 private_key: "testkey.pem",
5434 }
5435
5436 prebuilt_apex {
5437 name: "myapex",
5438 arch: {
5439 arm64: {
5440 src: "myapex-arm64.apex",
5441 },
5442 arm: {
5443 src: "myapex-arm.apex",
5444 },
5445 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005446 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5447 }
5448
5449 prebuilt_bootclasspath_fragment {
5450 name: "my-bootclasspath-fragment",
5451 contents: ["libfoo", "libbar"],
5452 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005453 hidden_api: {
5454 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5455 metadata: "my-bootclasspath-fragment/metadata.csv",
5456 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005457 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5458 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5459 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005460 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005461 }
5462
5463 java_import {
5464 name: "libfoo",
5465 jars: ["libfoo.jar"],
5466 apex_available: ["myapex"],
5467 }
5468
5469 java_library {
5470 name: "libfoo",
5471 srcs: ["foo/bar/MyClass.java"],
5472 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005473 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005474 }
Paul Duffin37856732021-02-26 14:24:15 +00005475
5476 java_sdk_library_import {
5477 name: "libbar",
5478 public: {
5479 jars: ["libbar.jar"],
5480 },
5481 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005482 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005483 }
5484
5485 java_sdk_library {
5486 name: "libbar",
5487 srcs: ["foo/bar/MyClass.java"],
5488 unsafe_ignore_missing_latest_api: true,
5489 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005490 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005491 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005492 `
5493
Paul Duffin89f570a2021-06-16 01:42:33 +01005494 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005495 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5496 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005497
Paul Duffin537ea3d2021-05-14 10:38:00 +01005498 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005499 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005500 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005501 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005502 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5503 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005504 })
5505
5506 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5507 bp := `
5508 apex {
5509 name: "myapex",
5510 enabled: false,
5511 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005512 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005513 }
5514
5515 apex_key {
5516 name: "myapex.key",
5517 public_key: "testkey.avbpubkey",
5518 private_key: "testkey.pem",
5519 }
5520
5521 prebuilt_apex {
5522 name: "myapex",
5523 arch: {
5524 arm64: {
5525 src: "myapex-arm64.apex",
5526 },
5527 arm: {
5528 src: "myapex-arm.apex",
5529 },
5530 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005531 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5532 }
5533
5534 prebuilt_bootclasspath_fragment {
5535 name: "my-bootclasspath-fragment",
5536 contents: ["libfoo", "libbar"],
5537 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005538 hidden_api: {
5539 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5540 metadata: "my-bootclasspath-fragment/metadata.csv",
5541 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005542 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5543 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5544 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005545 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005546 }
5547
5548 java_import {
5549 name: "libfoo",
5550 prefer: true,
5551 jars: ["libfoo.jar"],
5552 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005553 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005554 }
5555
5556 java_library {
5557 name: "libfoo",
5558 srcs: ["foo/bar/MyClass.java"],
5559 apex_available: ["myapex"],
5560 }
Paul Duffin37856732021-02-26 14:24:15 +00005561
5562 java_sdk_library_import {
5563 name: "libbar",
5564 prefer: true,
5565 public: {
5566 jars: ["libbar.jar"],
5567 },
5568 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005569 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005570 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005571 }
5572
5573 java_sdk_library {
5574 name: "libbar",
5575 srcs: ["foo/bar/MyClass.java"],
5576 unsafe_ignore_missing_latest_api: true,
5577 apex_available: ["myapex"],
5578 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005579 `
5580
Paul Duffin89f570a2021-06-16 01:42:33 +01005581 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005582 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5583 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005584
Paul Duffin537ea3d2021-05-14 10:38:00 +01005585 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005586 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005587 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005588 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005589 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5590 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005591 })
5592}
5593
Roland Levillain630846d2019-06-26 12:48:34 +01005594func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005595 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005596 apex_test {
5597 name: "myapex",
5598 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005599 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005600 tests: [
5601 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005602 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005603 ],
5604 }
5605
5606 apex_key {
5607 name: "myapex.key",
5608 public_key: "testkey.avbpubkey",
5609 private_key: "testkey.pem",
5610 }
5611
Liz Kammer1c14a212020-05-12 15:26:55 -07005612 filegroup {
5613 name: "fg",
5614 srcs: [
5615 "baz",
5616 "bar/baz"
5617 ],
5618 }
5619
Roland Levillain630846d2019-06-26 12:48:34 +01005620 cc_test {
5621 name: "mytest",
5622 gtest: false,
5623 srcs: ["mytest.cpp"],
5624 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005625 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005626 system_shared_libs: [],
5627 static_executable: true,
5628 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005629 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005630 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005631
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005632 cc_library {
5633 name: "mylib",
5634 srcs: ["mylib.cpp"],
5635 system_shared_libs: [],
5636 stl: "none",
5637 }
5638
Liz Kammer5bd365f2020-05-27 15:15:11 -07005639 filegroup {
5640 name: "fg2",
5641 srcs: [
5642 "testdata/baz"
5643 ],
5644 }
5645
Roland Levillain9b5fde92019-06-28 15:41:19 +01005646 cc_test {
5647 name: "mytests",
5648 gtest: false,
5649 srcs: [
5650 "mytest1.cpp",
5651 "mytest2.cpp",
5652 "mytest3.cpp",
5653 ],
5654 test_per_src: true,
5655 relative_install_path: "test",
5656 system_shared_libs: [],
5657 static_executable: true,
5658 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005659 data: [
5660 ":fg",
5661 ":fg2",
5662 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005663 }
Roland Levillain630846d2019-06-26 12:48:34 +01005664 `)
5665
Sundong Ahnabb64432019-10-22 13:58:29 +09005666 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005667 copyCmds := apexRule.Args["copy_commands"]
5668
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005669 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005670 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005671 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005672
Liz Kammer1c14a212020-05-12 15:26:55 -07005673 //Ensure that test data are copied into apex.
5674 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5675 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5676
Roland Levillain9b5fde92019-06-28 15:41:19 +01005677 // Ensure that test deps built with `test_per_src` are copied into apex.
5678 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5679 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5680 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005681
5682 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005683 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005684 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005685 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005686 prefix := "TARGET_"
5687 var builder strings.Builder
5688 data.Custom(&builder, name, prefix, "", data)
5689 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005690 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5691 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5692 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5693 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
5694 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
5695 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005696 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005697
5698 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005699 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005700 data.Custom(&builder, name, prefix, "", data)
5701 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005702 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5703 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005704}
5705
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005706func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005707 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005708 apex {
5709 name: "myapex",
5710 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005711 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005712 }
5713 apex_key {
5714 name: "myapex.key",
5715 public_key: "testkey.avbpubkey",
5716 private_key: "testkey.pem",
5717 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005718 `,
5719 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5720 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5721 }),
5722 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005723 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005724 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005725 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005726 var builder strings.Builder
5727 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5728 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005729 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex myapex.flattened\n")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005730}
5731
Jooyung Hand48f3c32019-08-23 11:18:57 +09005732func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5733 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5734 apex {
5735 name: "myapex",
5736 key: "myapex.key",
5737 native_shared_libs: ["libfoo"],
5738 }
5739
5740 apex_key {
5741 name: "myapex.key",
5742 public_key: "testkey.avbpubkey",
5743 private_key: "testkey.pem",
5744 }
5745
5746 cc_library {
5747 name: "libfoo",
5748 stl: "none",
5749 system_shared_libs: [],
5750 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005751 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005752 }
5753 `)
5754 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5755 apex {
5756 name: "myapex",
5757 key: "myapex.key",
5758 java_libs: ["myjar"],
5759 }
5760
5761 apex_key {
5762 name: "myapex.key",
5763 public_key: "testkey.avbpubkey",
5764 private_key: "testkey.pem",
5765 }
5766
5767 java_library {
5768 name: "myjar",
5769 srcs: ["foo/bar/MyClass.java"],
5770 sdk_version: "none",
5771 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005772 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005773 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005774 }
5775 `)
5776}
5777
Bill Peckhama41a6962021-01-11 10:58:54 -08005778func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005779 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005780 apex {
5781 name: "myapex",
5782 key: "myapex.key",
5783 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005784 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005785 }
5786
5787 apex_key {
5788 name: "myapex.key",
5789 public_key: "testkey.avbpubkey",
5790 private_key: "testkey.pem",
5791 }
5792
5793 java_import {
5794 name: "myjavaimport",
5795 apex_available: ["myapex"],
5796 jars: ["my.jar"],
5797 compile_dex: true,
5798 }
5799 `)
5800
5801 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5802 apexRule := module.Rule("apexRule")
5803 copyCmds := apexRule.Args["copy_commands"]
5804 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5805}
5806
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005807func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005808 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005809 apex {
5810 name: "myapex",
5811 key: "myapex.key",
5812 apps: [
5813 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005814 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005815 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005816 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005817 }
5818
5819 apex_key {
5820 name: "myapex.key",
5821 public_key: "testkey.avbpubkey",
5822 private_key: "testkey.pem",
5823 }
5824
5825 android_app {
5826 name: "AppFoo",
5827 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005828 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005829 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005830 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005831 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005832 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005833 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005834
5835 android_app {
5836 name: "AppFooPriv",
5837 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005838 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005839 system_modules: "none",
5840 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005841 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005842 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005843 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005844
5845 cc_library_shared {
5846 name: "libjni",
5847 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005848 shared_libs: ["libfoo"],
5849 stl: "none",
5850 system_shared_libs: [],
5851 apex_available: [ "myapex" ],
5852 sdk_version: "current",
5853 }
5854
5855 cc_library_shared {
5856 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005857 stl: "none",
5858 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005859 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005860 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005861 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005862 `)
5863
Sundong Ahnabb64432019-10-22 13:58:29 +09005864 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005865 apexRule := module.Rule("apexRule")
5866 copyCmds := apexRule.Args["copy_commands"]
5867
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005868 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5869 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005870
Colin Crossaede88c2020-08-11 12:17:01 -07005871 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005872 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005873 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005874 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005875 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005876 // JNI libraries including transitive deps are
5877 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005878 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005879 // ... embedded inside APK (jnilibs.zip)
5880 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5881 // ... and not directly inside the APEX
5882 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5883 }
Dario Frenicde2a032019-10-27 00:29:22 +01005884}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005885
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005886func TestApexWithAppImportBuildId(t *testing.T) {
5887 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5888 for _, id := range invalidBuildIds {
5889 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5890 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5891 variables.BuildId = proptools.StringPtr(id)
5892 })
5893 testApexError(t, message, `apex {
5894 name: "myapex",
5895 key: "myapex.key",
5896 apps: ["AppFooPrebuilt"],
5897 updatable: false,
5898 }
5899
5900 apex_key {
5901 name: "myapex.key",
5902 public_key: "testkey.avbpubkey",
5903 private_key: "testkey.pem",
5904 }
5905
5906 android_app_import {
5907 name: "AppFooPrebuilt",
5908 apk: "PrebuiltAppFoo.apk",
5909 presigned: true,
5910 apex_available: ["myapex"],
5911 }
5912 `, fixture)
5913 }
5914}
5915
Dario Frenicde2a032019-10-27 00:29:22 +01005916func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005917 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005918 apex {
5919 name: "myapex",
5920 key: "myapex.key",
5921 apps: [
5922 "AppFooPrebuilt",
5923 "AppFooPrivPrebuilt",
5924 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005925 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005926 }
5927
5928 apex_key {
5929 name: "myapex.key",
5930 public_key: "testkey.avbpubkey",
5931 private_key: "testkey.pem",
5932 }
5933
5934 android_app_import {
5935 name: "AppFooPrebuilt",
5936 apk: "PrebuiltAppFoo.apk",
5937 presigned: true,
5938 dex_preopt: {
5939 enabled: false,
5940 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005941 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005942 }
5943
5944 android_app_import {
5945 name: "AppFooPrivPrebuilt",
5946 apk: "PrebuiltAppFooPriv.apk",
5947 privileged: true,
5948 presigned: true,
5949 dex_preopt: {
5950 enabled: false,
5951 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005952 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005953 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005954 }
5955 `)
5956
Sundong Ahnabb64432019-10-22 13:58:29 +09005957 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005958 apexRule := module.Rule("apexRule")
5959 copyCmds := apexRule.Args["copy_commands"]
5960
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005961 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5962 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005963}
5964
5965func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005966 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005967 apex {
5968 name: "myapex",
5969 key: "myapex.key",
5970 apps: [
5971 "AppFoo",
5972 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005973 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005974 }
5975
5976 apex_key {
5977 name: "myapex.key",
5978 public_key: "testkey.avbpubkey",
5979 private_key: "testkey.pem",
5980 }
5981
5982 android_app {
5983 name: "AppFoo",
5984 srcs: ["foo/bar/MyClass.java"],
5985 sdk_version: "none",
5986 system_modules: "none",
5987 apex_available: [ "myapex" ],
5988 }
5989
5990 android_app_import {
5991 name: "AppFoo",
5992 apk: "AppFooPrebuilt.apk",
5993 filename: "AppFooPrebuilt.apk",
5994 presigned: true,
5995 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005996 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005997 }
5998 `, withFiles(map[string][]byte{
5999 "AppFooPrebuilt.apk": nil,
6000 }))
6001
6002 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006003 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006004 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006005}
6006
Dario Freni6f3937c2019-12-20 22:58:03 +00006007func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006008 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006009 apex {
6010 name: "myapex",
6011 key: "myapex.key",
6012 apps: [
6013 "TesterHelpAppFoo",
6014 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006015 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006016 }
6017
6018 apex_key {
6019 name: "myapex.key",
6020 public_key: "testkey.avbpubkey",
6021 private_key: "testkey.pem",
6022 }
6023
6024 android_test_helper_app {
6025 name: "TesterHelpAppFoo",
6026 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006027 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006028 }
6029
6030 `)
6031
6032 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6033 apexRule := module.Rule("apexRule")
6034 copyCmds := apexRule.Args["copy_commands"]
6035
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006036 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006037}
6038
Jooyung Han18020ea2019-11-13 10:50:48 +09006039func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6040 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006041 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006042 apex {
6043 name: "myapex",
6044 key: "myapex.key",
6045 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006046 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006047 }
6048
6049 apex_key {
6050 name: "myapex.key",
6051 public_key: "testkey.avbpubkey",
6052 private_key: "testkey.pem",
6053 }
6054
6055 apex {
6056 name: "otherapex",
6057 key: "myapex.key",
6058 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006059 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006060 }
6061
6062 cc_defaults {
6063 name: "libfoo-defaults",
6064 apex_available: ["otherapex"],
6065 }
6066
6067 cc_library {
6068 name: "libfoo",
6069 defaults: ["libfoo-defaults"],
6070 stl: "none",
6071 system_shared_libs: [],
6072 }`)
6073}
6074
Paul Duffine52e66f2020-03-30 17:54:29 +01006075func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006076 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006077 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006078 apex {
6079 name: "myapex",
6080 key: "myapex.key",
6081 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006082 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006083 }
6084
6085 apex_key {
6086 name: "myapex.key",
6087 public_key: "testkey.avbpubkey",
6088 private_key: "testkey.pem",
6089 }
6090
6091 apex {
6092 name: "otherapex",
6093 key: "otherapex.key",
6094 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006095 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006096 }
6097
6098 apex_key {
6099 name: "otherapex.key",
6100 public_key: "testkey.avbpubkey",
6101 private_key: "testkey.pem",
6102 }
6103
6104 cc_library {
6105 name: "libfoo",
6106 stl: "none",
6107 system_shared_libs: [],
6108 apex_available: ["otherapex"],
6109 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006110}
Jiyong Park127b40b2019-09-30 16:04:35 +09006111
Paul Duffine52e66f2020-03-30 17:54:29 +01006112func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006113 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006114 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006115.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006116.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006117.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006118.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006119.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006120.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006121 apex {
6122 name: "myapex",
6123 key: "myapex.key",
6124 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006125 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006126 }
6127
6128 apex_key {
6129 name: "myapex.key",
6130 public_key: "testkey.avbpubkey",
6131 private_key: "testkey.pem",
6132 }
6133
Jiyong Park127b40b2019-09-30 16:04:35 +09006134 cc_library {
6135 name: "libfoo",
6136 stl: "none",
6137 shared_libs: ["libbar"],
6138 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006139 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006140 }
6141
6142 cc_library {
6143 name: "libbar",
6144 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006145 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006146 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006147 apex_available: ["myapex"],
6148 }
6149
6150 cc_library {
6151 name: "libbaz",
6152 stl: "none",
6153 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006154 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006155}
Jiyong Park127b40b2019-09-30 16:04:35 +09006156
Paul Duffine52e66f2020-03-30 17:54:29 +01006157func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006158 testApexError(t, "\"otherapex\" is not a valid module name", `
6159 apex {
6160 name: "myapex",
6161 key: "myapex.key",
6162 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006163 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006164 }
6165
6166 apex_key {
6167 name: "myapex.key",
6168 public_key: "testkey.avbpubkey",
6169 private_key: "testkey.pem",
6170 }
6171
6172 cc_library {
6173 name: "libfoo",
6174 stl: "none",
6175 system_shared_libs: [],
6176 apex_available: ["otherapex"],
6177 }`)
6178
Paul Duffine52e66f2020-03-30 17:54:29 +01006179 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006180 apex {
6181 name: "myapex",
6182 key: "myapex.key",
6183 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006184 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006185 }
6186
6187 apex_key {
6188 name: "myapex.key",
6189 public_key: "testkey.avbpubkey",
6190 private_key: "testkey.pem",
6191 }
6192
6193 cc_library {
6194 name: "libfoo",
6195 stl: "none",
6196 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006197 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006198 apex_available: ["myapex"],
6199 }
6200
6201 cc_library {
6202 name: "libbar",
6203 stl: "none",
6204 system_shared_libs: [],
6205 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006206 }
6207
6208 cc_library {
6209 name: "libbaz",
6210 stl: "none",
6211 system_shared_libs: [],
6212 stubs: {
6213 versions: ["10", "20", "30"],
6214 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006215 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006216}
Jiyong Park127b40b2019-09-30 16:04:35 +09006217
Jiyong Park89e850a2020-04-07 16:37:39 +09006218func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006219 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006220 apex {
6221 name: "myapex",
6222 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006223 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006224 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006225 }
6226
6227 apex_key {
6228 name: "myapex.key",
6229 public_key: "testkey.avbpubkey",
6230 private_key: "testkey.pem",
6231 }
6232
6233 cc_library {
6234 name: "libfoo",
6235 stl: "none",
6236 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006237 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006238 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006239 }
6240
6241 cc_library {
6242 name: "libfoo2",
6243 stl: "none",
6244 system_shared_libs: [],
6245 shared_libs: ["libbaz"],
6246 apex_available: ["//apex_available:platform"],
6247 }
6248
6249 cc_library {
6250 name: "libbar",
6251 stl: "none",
6252 system_shared_libs: [],
6253 apex_available: ["myapex"],
6254 }
6255
6256 cc_library {
6257 name: "libbaz",
6258 stl: "none",
6259 system_shared_libs: [],
6260 apex_available: ["myapex"],
6261 stubs: {
6262 versions: ["1"],
6263 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006264 }`)
6265
Jiyong Park89e850a2020-04-07 16:37:39 +09006266 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6267 // because it depends on libbar which isn't available to platform
6268 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6269 if libfoo.NotAvailableForPlatform() != true {
6270 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6271 }
6272
6273 // libfoo2 however can be available to platform because it depends on libbaz which provides
6274 // stubs
6275 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6276 if libfoo2.NotAvailableForPlatform() == true {
6277 t.Errorf("%q should be available to platform", libfoo2.String())
6278 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006279}
Jiyong Parka90ca002019-10-07 15:47:24 +09006280
Paul Duffine52e66f2020-03-30 17:54:29 +01006281func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006282 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006283 apex {
6284 name: "myapex",
6285 key: "myapex.key",
6286 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006287 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006288 }
6289
6290 apex_key {
6291 name: "myapex.key",
6292 public_key: "testkey.avbpubkey",
6293 private_key: "testkey.pem",
6294 }
6295
6296 cc_library {
6297 name: "libfoo",
6298 stl: "none",
6299 system_shared_libs: [],
6300 apex_available: ["myapex"],
6301 static: {
6302 apex_available: ["//apex_available:platform"],
6303 },
6304 }`)
6305
Jiyong Park89e850a2020-04-07 16:37:39 +09006306 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6307 if libfooShared.NotAvailableForPlatform() != true {
6308 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6309 }
6310 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6311 if libfooStatic.NotAvailableForPlatform() != false {
6312 t.Errorf("%q should be available to platform", libfooStatic.String())
6313 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006314}
6315
Jiyong Park5d790c32019-11-15 18:40:32 +09006316func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006317 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006318 apex {
6319 name: "myapex",
6320 key: "myapex.key",
6321 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006322 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006323 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006324 bootclasspath_fragments: ["mybootclasspath_fragment"],
6325 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6326 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006327 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006328 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006329 }
6330
6331 override_apex {
6332 name: "override_myapex",
6333 base: "myapex",
6334 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006335 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006336 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006337 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6338 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6339 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006340 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006341 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006342 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006343 key: "mynewapex.key",
6344 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006345 }
6346
6347 apex_key {
6348 name: "myapex.key",
6349 public_key: "testkey.avbpubkey",
6350 private_key: "testkey.pem",
6351 }
6352
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006353 apex_key {
6354 name: "mynewapex.key",
6355 public_key: "testkey2.avbpubkey",
6356 private_key: "testkey2.pem",
6357 }
6358
6359 android_app_certificate {
6360 name: "myapex.certificate",
6361 certificate: "testkey",
6362 }
6363
Jiyong Park5d790c32019-11-15 18:40:32 +09006364 android_app {
6365 name: "app",
6366 srcs: ["foo/bar/MyClass.java"],
6367 package_name: "foo",
6368 sdk_version: "none",
6369 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006370 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006371 }
6372
6373 override_android_app {
6374 name: "override_app",
6375 base: "app",
6376 package_name: "bar",
6377 }
markchien7c803b82021-08-26 22:10:06 +08006378
6379 bpf {
6380 name: "bpf",
6381 srcs: ["bpf.c"],
6382 }
6383
6384 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006385 name: "overrideBpf",
6386 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006387 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006388
6389 prebuilt_etc {
6390 name: "myetc",
6391 src: "myprebuilt",
6392 }
6393
6394 prebuilt_etc {
6395 name: "override_myetc",
6396 src: "override_myprebuilt",
6397 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006398
6399 java_library {
6400 name: "bcplib",
6401 srcs: ["a.java"],
6402 compile_dex: true,
6403 apex_available: ["myapex"],
6404 permitted_packages: ["bcp.lib"],
6405 }
6406
6407 bootclasspath_fragment {
6408 name: "mybootclasspath_fragment",
6409 contents: ["bcplib"],
6410 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006411 hidden_api: {
6412 split_packages: ["*"],
6413 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006414 }
6415
6416 java_library {
6417 name: "override_bcplib",
6418 srcs: ["a.java"],
6419 compile_dex: true,
6420 apex_available: ["myapex"],
6421 permitted_packages: ["override.bcp.lib"],
6422 }
6423
6424 bootclasspath_fragment {
6425 name: "override_bootclasspath_fragment",
6426 contents: ["override_bcplib"],
6427 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006428 hidden_api: {
6429 split_packages: ["*"],
6430 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006431 }
6432
6433 java_library {
6434 name: "systemserverlib",
6435 srcs: ["a.java"],
6436 apex_available: ["myapex"],
6437 }
6438
6439 systemserverclasspath_fragment {
6440 name: "mysystemserverclasspath_fragment",
6441 standalone_contents: ["systemserverlib"],
6442 apex_available: ["myapex"],
6443 }
6444
6445 java_library {
6446 name: "override_systemserverlib",
6447 srcs: ["a.java"],
6448 apex_available: ["myapex"],
6449 }
6450
6451 systemserverclasspath_fragment {
6452 name: "override_systemserverclasspath_fragment",
6453 standalone_contents: ["override_systemserverlib"],
6454 apex_available: ["myapex"],
6455 }
6456
6457 java_library {
6458 name: "myjava_library",
6459 srcs: ["a.java"],
6460 compile_dex: true,
6461 apex_available: ["myapex"],
6462 }
6463
6464 java_library {
6465 name: "override_java_library",
6466 srcs: ["a.java"],
6467 compile_dex: true,
6468 apex_available: ["myapex"],
6469 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006470 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006471
Jiyong Park317645e2019-12-05 13:20:58 +09006472 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6473 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6474 if originalVariant.GetOverriddenBy() != "" {
6475 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6476 }
6477 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6478 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6479 }
6480
Jiyong Park5d790c32019-11-15 18:40:32 +09006481 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6482 apexRule := module.Rule("apexRule")
6483 copyCmds := apexRule.Args["copy_commands"]
6484
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006485 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6486 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006487
markchien7c803b82021-08-26 22:10:06 +08006488 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006489 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006490
Daniel Norman5a3ce132021-08-26 15:44:43 -07006491 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6492 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6493
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006494 apexBundle := module.Module().(*apexBundle)
6495 name := apexBundle.Name()
6496 if name != "override_myapex" {
6497 t.Errorf("name should be \"override_myapex\", but was %q", name)
6498 }
6499
Baligh Uddin004d7172020-02-19 21:29:28 -08006500 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6501 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6502 }
6503
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006504 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6505 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6506 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6507 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6508 android.AssertArrayString(t, "Java_libs does not match",
6509 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6510
Jiyong Park20bacab2020-03-03 11:45:41 +09006511 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006512 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006513 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6514
6515 signApkRule := module.Rule("signapk")
6516 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006517
Colin Crossaa255532020-07-03 13:18:24 -07006518 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006519 var builder strings.Builder
6520 data.Custom(&builder, name, "TARGET_", "", data)
6521 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006522 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6523 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
6524 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
6525 ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex")
6526 ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex")
6527 ensureContains(t, androidMk, "LOCAL_MODULE := override_java_library.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006528 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006529 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006530 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006531 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006532 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006533 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006534 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6535 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6536 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006537 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006538}
6539
Albert Martineefabcf2022-03-21 20:11:16 +00006540func TestMinSdkVersionOverride(t *testing.T) {
6541 // Override from 29 to 31
6542 minSdkOverride31 := "31"
6543 ctx := testApex(t, `
6544 apex {
6545 name: "myapex",
6546 key: "myapex.key",
6547 native_shared_libs: ["mylib"],
6548 updatable: true,
6549 min_sdk_version: "29"
6550 }
6551
6552 override_apex {
6553 name: "override_myapex",
6554 base: "myapex",
6555 logging_parent: "com.foo.bar",
6556 package_name: "test.overridden.package"
6557 }
6558
6559 apex_key {
6560 name: "myapex.key",
6561 public_key: "testkey.avbpubkey",
6562 private_key: "testkey.pem",
6563 }
6564
6565 cc_library {
6566 name: "mylib",
6567 srcs: ["mylib.cpp"],
6568 runtime_libs: ["libbar"],
6569 system_shared_libs: [],
6570 stl: "none",
6571 apex_available: [ "myapex" ],
6572 min_sdk_version: "apex_inherit"
6573 }
6574
6575 cc_library {
6576 name: "libbar",
6577 srcs: ["mylib.cpp"],
6578 system_shared_libs: [],
6579 stl: "none",
6580 apex_available: [ "myapex" ],
6581 min_sdk_version: "apex_inherit"
6582 }
6583
6584 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6585
6586 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6587 copyCmds := apexRule.Args["copy_commands"]
6588
6589 // Ensure that direct non-stubs dep is always included
6590 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6591
6592 // Ensure that runtime_libs dep in included
6593 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6594
6595 // Ensure libraries target overridden min_sdk_version value
6596 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6597}
6598
6599func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6600 // Attempt to override from 31 to 29, should be a NOOP
6601 minSdkOverride29 := "29"
6602 ctx := testApex(t, `
6603 apex {
6604 name: "myapex",
6605 key: "myapex.key",
6606 native_shared_libs: ["mylib"],
6607 updatable: true,
6608 min_sdk_version: "31"
6609 }
6610
6611 override_apex {
6612 name: "override_myapex",
6613 base: "myapex",
6614 logging_parent: "com.foo.bar",
6615 package_name: "test.overridden.package"
6616 }
6617
6618 apex_key {
6619 name: "myapex.key",
6620 public_key: "testkey.avbpubkey",
6621 private_key: "testkey.pem",
6622 }
6623
6624 cc_library {
6625 name: "mylib",
6626 srcs: ["mylib.cpp"],
6627 runtime_libs: ["libbar"],
6628 system_shared_libs: [],
6629 stl: "none",
6630 apex_available: [ "myapex" ],
6631 min_sdk_version: "apex_inherit"
6632 }
6633
6634 cc_library {
6635 name: "libbar",
6636 srcs: ["mylib.cpp"],
6637 system_shared_libs: [],
6638 stl: "none",
6639 apex_available: [ "myapex" ],
6640 min_sdk_version: "apex_inherit"
6641 }
6642
6643 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6644
6645 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6646 copyCmds := apexRule.Args["copy_commands"]
6647
6648 // Ensure that direct non-stubs dep is always included
6649 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6650
6651 // Ensure that runtime_libs dep in included
6652 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6653
6654 // Ensure libraries target the original min_sdk_version value rather than the overridden
6655 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6656}
6657
Jooyung Han214bf372019-11-12 13:03:50 +09006658func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006659 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006660 apex {
6661 name: "myapex",
6662 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006663 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006664 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006665 }
6666
6667 apex_key {
6668 name: "myapex.key",
6669 public_key: "testkey.avbpubkey",
6670 private_key: "testkey.pem",
6671 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006672
6673 cc_library {
6674 name: "mylib",
6675 srcs: ["mylib.cpp"],
6676 stl: "libc++",
6677 system_shared_libs: [],
6678 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006679 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006680 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006681 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006682
6683 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6684 args := module.Rule("apexRule").Args
6685 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006686 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006687
6688 // The copies of the libraries in the apex should have one more dependency than
6689 // the ones outside the apex, namely the unwinder. Ideally we should check
6690 // the dependency names directly here but for some reason the names are blank in
6691 // this test.
6692 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006693 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006694 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6695 if len(apexImplicits) != len(nonApexImplicits)+1 {
6696 t.Errorf("%q missing unwinder dep", lib)
6697 }
6698 }
Jooyung Han214bf372019-11-12 13:03:50 +09006699}
6700
Paul Duffine05480a2021-03-08 15:07:14 +00006701var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006702 "api/current.txt": nil,
6703 "api/removed.txt": nil,
6704 "api/system-current.txt": nil,
6705 "api/system-removed.txt": nil,
6706 "api/test-current.txt": nil,
6707 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006708
Anton Hanssondff2c782020-12-21 17:10:01 +00006709 "100/public/api/foo.txt": nil,
6710 "100/public/api/foo-removed.txt": nil,
6711 "100/system/api/foo.txt": nil,
6712 "100/system/api/foo-removed.txt": nil,
6713
Paul Duffineedc5d52020-06-12 17:46:39 +01006714 // For java_sdk_library_import
6715 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006716}
6717
Jooyung Han58f26ab2019-12-18 15:34:32 +09006718func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006719 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006720 apex {
6721 name: "myapex",
6722 key: "myapex.key",
6723 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006724 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006725 }
6726
6727 apex_key {
6728 name: "myapex.key",
6729 public_key: "testkey.avbpubkey",
6730 private_key: "testkey.pem",
6731 }
6732
6733 java_sdk_library {
6734 name: "foo",
6735 srcs: ["a.java"],
6736 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006737 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006738 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006739
6740 prebuilt_apis {
6741 name: "sdk",
6742 api_dirs: ["100"],
6743 }
Paul Duffin9b879592020-05-26 13:21:35 +01006744 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006745
6746 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006747 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006748 "javalib/foo.jar",
6749 "etc/permissions/foo.xml",
6750 })
6751 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006752 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006753 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 +09006754}
6755
Paul Duffin9b879592020-05-26 13:21:35 +01006756func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006757 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006758 apex {
6759 name: "myapex",
6760 key: "myapex.key",
6761 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006762 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006763 }
6764
6765 apex_key {
6766 name: "myapex.key",
6767 public_key: "testkey.avbpubkey",
6768 private_key: "testkey.pem",
6769 }
6770
6771 java_sdk_library {
6772 name: "foo",
6773 srcs: ["a.java"],
6774 api_packages: ["foo"],
6775 apex_available: ["myapex"],
6776 sdk_version: "none",
6777 system_modules: "none",
6778 }
6779
6780 java_library {
6781 name: "bar",
6782 srcs: ["a.java"],
6783 libs: ["foo"],
6784 apex_available: ["myapex"],
6785 sdk_version: "none",
6786 system_modules: "none",
6787 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006788
6789 prebuilt_apis {
6790 name: "sdk",
6791 api_dirs: ["100"],
6792 }
Paul Duffin9b879592020-05-26 13:21:35 +01006793 `, withFiles(filesForSdkLibrary))
6794
6795 // java_sdk_library installs both impl jar and permission XML
6796 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6797 "javalib/bar.jar",
6798 "javalib/foo.jar",
6799 "etc/permissions/foo.xml",
6800 })
6801
6802 // The bar library should depend on the implementation jar.
6803 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006804 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006805 t.Errorf("expected %q, found %#q", expected, actual)
6806 }
6807}
6808
6809func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006810 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006811 apex {
6812 name: "myapex",
6813 key: "myapex.key",
6814 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006815 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006816 }
6817
6818 apex_key {
6819 name: "myapex.key",
6820 public_key: "testkey.avbpubkey",
6821 private_key: "testkey.pem",
6822 }
6823
6824 java_sdk_library {
6825 name: "foo",
6826 srcs: ["a.java"],
6827 api_packages: ["foo"],
6828 apex_available: ["myapex"],
6829 sdk_version: "none",
6830 system_modules: "none",
6831 }
6832
6833 java_library {
6834 name: "bar",
6835 srcs: ["a.java"],
6836 libs: ["foo"],
6837 sdk_version: "none",
6838 system_modules: "none",
6839 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006840
6841 prebuilt_apis {
6842 name: "sdk",
6843 api_dirs: ["100"],
6844 }
Paul Duffin9b879592020-05-26 13:21:35 +01006845 `, withFiles(filesForSdkLibrary))
6846
6847 // java_sdk_library installs both impl jar and permission XML
6848 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6849 "javalib/foo.jar",
6850 "etc/permissions/foo.xml",
6851 })
6852
6853 // The bar library should depend on the stubs jar.
6854 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006855 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006856 t.Errorf("expected %q, found %#q", expected, actual)
6857 }
6858}
6859
Paul Duffineedc5d52020-06-12 17:46:39 +01006860func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006861 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006862 prebuilt_apis {
6863 name: "sdk",
6864 api_dirs: ["100"],
6865 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006866 withFiles(map[string][]byte{
6867 "apex/a.java": nil,
6868 "apex/apex_manifest.json": nil,
6869 "apex/Android.bp": []byte(`
6870 package {
6871 default_visibility: ["//visibility:private"],
6872 }
6873
6874 apex {
6875 name: "myapex",
6876 key: "myapex.key",
6877 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006878 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006879 }
6880
6881 apex_key {
6882 name: "myapex.key",
6883 public_key: "testkey.avbpubkey",
6884 private_key: "testkey.pem",
6885 }
6886
6887 java_library {
6888 name: "bar",
6889 srcs: ["a.java"],
6890 libs: ["foo"],
6891 apex_available: ["myapex"],
6892 sdk_version: "none",
6893 system_modules: "none",
6894 }
6895`),
6896 "source/a.java": nil,
6897 "source/api/current.txt": nil,
6898 "source/api/removed.txt": nil,
6899 "source/Android.bp": []byte(`
6900 package {
6901 default_visibility: ["//visibility:private"],
6902 }
6903
6904 java_sdk_library {
6905 name: "foo",
6906 visibility: ["//apex"],
6907 srcs: ["a.java"],
6908 api_packages: ["foo"],
6909 apex_available: ["myapex"],
6910 sdk_version: "none",
6911 system_modules: "none",
6912 public: {
6913 enabled: true,
6914 },
6915 }
6916`),
6917 "prebuilt/a.jar": nil,
6918 "prebuilt/Android.bp": []byte(`
6919 package {
6920 default_visibility: ["//visibility:private"],
6921 }
6922
6923 java_sdk_library_import {
6924 name: "foo",
6925 visibility: ["//apex", "//source"],
6926 apex_available: ["myapex"],
6927 prefer: true,
6928 public: {
6929 jars: ["a.jar"],
6930 },
6931 }
6932`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006933 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006934 )
6935
6936 // java_sdk_library installs both impl jar and permission XML
6937 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6938 "javalib/bar.jar",
6939 "javalib/foo.jar",
6940 "etc/permissions/foo.xml",
6941 })
6942
6943 // The bar library should depend on the implementation jar.
6944 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006945 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006946 t.Errorf("expected %q, found %#q", expected, actual)
6947 }
6948}
6949
6950func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6951 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6952 apex {
6953 name: "myapex",
6954 key: "myapex.key",
6955 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006956 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006957 }
6958
6959 apex_key {
6960 name: "myapex.key",
6961 public_key: "testkey.avbpubkey",
6962 private_key: "testkey.pem",
6963 }
6964
6965 java_sdk_library_import {
6966 name: "foo",
6967 apex_available: ["myapex"],
6968 prefer: true,
6969 public: {
6970 jars: ["a.jar"],
6971 },
6972 }
6973
6974 `, withFiles(filesForSdkLibrary))
6975}
6976
atrost6e126252020-01-27 17:01:16 +00006977func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006978 result := android.GroupFixturePreparers(
6979 prepareForApexTest,
6980 java.PrepareForTestWithPlatformCompatConfig,
6981 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006982 apex {
6983 name: "myapex",
6984 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006985 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006986 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006987 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006988 }
6989
6990 apex_key {
6991 name: "myapex.key",
6992 public_key: "testkey.avbpubkey",
6993 private_key: "testkey.pem",
6994 }
6995
6996 platform_compat_config {
6997 name: "myjar-platform-compat-config",
6998 src: ":myjar",
6999 }
7000
7001 java_library {
7002 name: "myjar",
7003 srcs: ["foo/bar/MyClass.java"],
7004 sdk_version: "none",
7005 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007006 apex_available: [ "myapex" ],
7007 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007008
7009 // Make sure that a preferred prebuilt does not affect the apex contents.
7010 prebuilt_platform_compat_config {
7011 name: "myjar-platform-compat-config",
7012 metadata: "compat-config/metadata.xml",
7013 prefer: true,
7014 }
atrost6e126252020-01-27 17:01:16 +00007015 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007016 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007017 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7018 "etc/compatconfig/myjar-platform-compat-config.xml",
7019 "javalib/myjar.jar",
7020 })
7021}
7022
Jooyung Han862c0d62022-12-21 10:15:37 +09007023func TestNoDupeApexFiles(t *testing.T) {
7024 android.GroupFixturePreparers(
7025 android.PrepareForTestWithAndroidBuildComponents,
7026 PrepareForTestWithApexBuildComponents,
7027 prepareForTestWithMyapex,
7028 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7029 ).
7030 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7031 RunTestWithBp(t, `
7032 apex {
7033 name: "myapex",
7034 key: "myapex.key",
7035 prebuilts: ["foo", "bar"],
7036 updatable: false,
7037 }
7038
7039 apex_key {
7040 name: "myapex.key",
7041 public_key: "testkey.avbpubkey",
7042 private_key: "testkey.pem",
7043 }
7044
7045 prebuilt_etc {
7046 name: "foo",
7047 src: "myprebuilt",
7048 filename_from_src: true,
7049 }
7050
7051 prebuilt_etc {
7052 name: "bar",
7053 src: "myprebuilt",
7054 filename_from_src: true,
7055 }
7056 `)
7057}
7058
Jiyong Park479321d2019-12-16 11:47:12 +09007059func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7060 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7061 apex {
7062 name: "myapex",
7063 key: "myapex.key",
7064 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007065 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007066 }
7067
7068 apex_key {
7069 name: "myapex.key",
7070 public_key: "testkey.avbpubkey",
7071 private_key: "testkey.pem",
7072 }
7073
7074 java_library {
7075 name: "myjar",
7076 srcs: ["foo/bar/MyClass.java"],
7077 sdk_version: "none",
7078 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007079 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007080 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007081 }
7082 `)
7083}
7084
Jiyong Park7afd1072019-12-30 16:56:33 +09007085func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007086 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007087 apex {
7088 name: "myapex",
7089 key: "myapex.key",
7090 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007091 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007092 }
7093
7094 apex_key {
7095 name: "myapex.key",
7096 public_key: "testkey.avbpubkey",
7097 private_key: "testkey.pem",
7098 }
7099
7100 cc_library {
7101 name: "mylib",
7102 srcs: ["mylib.cpp"],
7103 system_shared_libs: [],
7104 stl: "none",
7105 required: ["a", "b"],
7106 host_required: ["c", "d"],
7107 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007108 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007109 }
7110 `)
7111
7112 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007113 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007114 name := apexBundle.BaseModuleName()
7115 prefix := "TARGET_"
7116 var builder strings.Builder
7117 data.Custom(&builder, name, prefix, "", data)
7118 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007119 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007120 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7121 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007122}
7123
Jiyong Park7cd10e32020-01-14 09:22:18 +09007124func TestSymlinksFromApexToSystem(t *testing.T) {
7125 bp := `
7126 apex {
7127 name: "myapex",
7128 key: "myapex.key",
7129 native_shared_libs: ["mylib"],
7130 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007131 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007132 }
7133
Jiyong Park9d677202020-02-19 16:29:35 +09007134 apex {
7135 name: "myapex.updatable",
7136 key: "myapex.key",
7137 native_shared_libs: ["mylib"],
7138 java_libs: ["myjar"],
7139 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09007140 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09007141 }
7142
Jiyong Park7cd10e32020-01-14 09:22:18 +09007143 apex_key {
7144 name: "myapex.key",
7145 public_key: "testkey.avbpubkey",
7146 private_key: "testkey.pem",
7147 }
7148
7149 cc_library {
7150 name: "mylib",
7151 srcs: ["mylib.cpp"],
7152 shared_libs: ["myotherlib"],
7153 system_shared_libs: [],
7154 stl: "none",
7155 apex_available: [
7156 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007157 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007158 "//apex_available:platform",
7159 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007160 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007161 }
7162
7163 cc_library {
7164 name: "myotherlib",
7165 srcs: ["mylib.cpp"],
7166 system_shared_libs: [],
7167 stl: "none",
7168 apex_available: [
7169 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007170 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007171 "//apex_available:platform",
7172 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007173 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007174 }
7175
7176 java_library {
7177 name: "myjar",
7178 srcs: ["foo/bar/MyClass.java"],
7179 sdk_version: "none",
7180 system_modules: "none",
7181 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007182 apex_available: [
7183 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007184 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007185 "//apex_available:platform",
7186 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007187 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007188 }
7189
7190 java_library {
7191 name: "myotherjar",
7192 srcs: ["foo/bar/MyClass.java"],
7193 sdk_version: "none",
7194 system_modules: "none",
7195 apex_available: [
7196 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007197 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007198 "//apex_available:platform",
7199 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007200 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007201 }
7202 `
7203
7204 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7205 for _, f := range files {
7206 if f.path == file {
7207 if f.isLink {
7208 t.Errorf("%q is not a real file", file)
7209 }
7210 return
7211 }
7212 }
7213 t.Errorf("%q is not found", file)
7214 }
7215
7216 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
7217 for _, f := range files {
7218 if f.path == file {
7219 if !f.isLink {
7220 t.Errorf("%q is not a symlink", file)
7221 }
7222 return
7223 }
7224 }
7225 t.Errorf("%q is not found", file)
7226 }
7227
Jiyong Park9d677202020-02-19 16:29:35 +09007228 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7229 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007230 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007231 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007232 ensureRealfileExists(t, files, "javalib/myjar.jar")
7233 ensureRealfileExists(t, files, "lib64/mylib.so")
7234 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7235
Jiyong Park9d677202020-02-19 16:29:35 +09007236 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7237 ensureRealfileExists(t, files, "javalib/myjar.jar")
7238 ensureRealfileExists(t, files, "lib64/mylib.so")
7239 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7240
7241 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007242 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007243 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007244 ensureRealfileExists(t, files, "javalib/myjar.jar")
7245 ensureRealfileExists(t, files, "lib64/mylib.so")
7246 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007247
7248 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7249 ensureRealfileExists(t, files, "javalib/myjar.jar")
7250 ensureRealfileExists(t, files, "lib64/mylib.so")
7251 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007252}
7253
Yo Chiange8128052020-07-23 20:09:18 +08007254func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007255 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007256 apex {
7257 name: "myapex",
7258 key: "myapex.key",
7259 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007260 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007261 }
7262
7263 apex_key {
7264 name: "myapex.key",
7265 public_key: "testkey.avbpubkey",
7266 private_key: "testkey.pem",
7267 }
7268
7269 cc_library_shared {
7270 name: "mylib",
7271 srcs: ["mylib.cpp"],
7272 shared_libs: ["myotherlib"],
7273 system_shared_libs: [],
7274 stl: "none",
7275 apex_available: [
7276 "myapex",
7277 "//apex_available:platform",
7278 ],
7279 }
7280
7281 cc_prebuilt_library_shared {
7282 name: "myotherlib",
7283 srcs: ["prebuilt.so"],
7284 system_shared_libs: [],
7285 stl: "none",
7286 apex_available: [
7287 "myapex",
7288 "//apex_available:platform",
7289 ],
7290 }
7291 `)
7292
Prerana Patilb1896c82022-11-09 18:14:34 +00007293 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007294 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007295 var builder strings.Builder
7296 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7297 androidMk := builder.String()
7298 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007299 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007300 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7301 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7302 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007303 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 +08007304}
7305
Jooyung Han643adc42020-02-27 13:50:06 +09007306func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007307 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007308 apex {
7309 name: "myapex",
7310 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007311 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007312 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007313 }
7314
7315 apex_key {
7316 name: "myapex.key",
7317 public_key: "testkey.avbpubkey",
7318 private_key: "testkey.pem",
7319 }
7320
7321 cc_library {
7322 name: "mylib",
7323 srcs: ["mylib.cpp"],
7324 shared_libs: ["mylib2"],
7325 system_shared_libs: [],
7326 stl: "none",
7327 apex_available: [ "myapex" ],
7328 }
7329
7330 cc_library {
7331 name: "mylib2",
7332 srcs: ["mylib.cpp"],
7333 system_shared_libs: [],
7334 stl: "none",
7335 apex_available: [ "myapex" ],
7336 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007337
7338 rust_ffi_shared {
7339 name: "libfoo.rust",
7340 crate_name: "foo",
7341 srcs: ["foo.rs"],
7342 shared_libs: ["libfoo.shared_from_rust"],
7343 prefer_rlib: true,
7344 apex_available: ["myapex"],
7345 }
7346
7347 cc_library_shared {
7348 name: "libfoo.shared_from_rust",
7349 srcs: ["mylib.cpp"],
7350 system_shared_libs: [],
7351 stl: "none",
7352 stubs: {
7353 versions: ["10", "11", "12"],
7354 },
7355 }
7356
Jooyung Han643adc42020-02-27 13:50:06 +09007357 `)
7358
7359 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7360 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007361 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007362 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7363 "lib64/mylib.so",
7364 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007365 "lib64/libfoo.rust.so",
7366 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7367 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007368 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007369
7370 // b/220397949
7371 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007372}
7373
Jooyung Han49f67012020-04-17 13:43:10 +09007374func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007375 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007376 apex {
7377 name: "myapex",
7378 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007379 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007380 }
7381 apex_key {
7382 name: "myapex.key",
7383 public_key: "testkey.avbpubkey",
7384 private_key: "testkey.pem",
7385 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007386 `,
7387 android.FixtureModifyConfig(func(config android.Config) {
7388 delete(config.Targets, android.Android)
7389 config.AndroidCommonTarget = android.Target{}
7390 }),
7391 )
Jooyung Han49f67012020-04-17 13:43:10 +09007392
7393 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7394 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7395 }
7396}
7397
Jiyong Parkbd159612020-02-28 15:22:21 +09007398func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007399 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007400 apex {
7401 name: "myapex",
7402 key: "myapex.key",
7403 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007404 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007405 }
7406
7407 apex_key {
7408 name: "myapex.key",
7409 public_key: "testkey.avbpubkey",
7410 private_key: "testkey.pem",
7411 }
7412
7413 android_app {
7414 name: "AppFoo",
7415 srcs: ["foo/bar/MyClass.java"],
7416 sdk_version: "none",
7417 system_modules: "none",
7418 apex_available: [ "myapex" ],
7419 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007420 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007421
Colin Crosscf371cc2020-11-13 11:48:42 -08007422 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007423 content := bundleConfigRule.Args["content"]
7424
7425 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007426 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 +09007427}
7428
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007429func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007430 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007431 apex {
7432 name: "myapex",
7433 key: "myapex.key",
7434 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007435 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007436 }
7437
7438 apex_key {
7439 name: "myapex.key",
7440 public_key: "testkey.avbpubkey",
7441 private_key: "testkey.pem",
7442 }
7443
7444 android_app_set {
7445 name: "AppSet",
7446 set: "AppSet.apks",
7447 }`)
7448 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007449 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007450 content := bundleConfigRule.Args["content"]
7451 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7452 s := mod.Rule("apexRule").Args["copy_commands"]
7453 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007454 if len(copyCmds) != 4 {
7455 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007456 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007457 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7458 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007459 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7460 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007461
7462 // Ensure that canned_fs_config has an entry for the app set zip file
7463 generateFsRule := mod.Rule("generateFsConfig")
7464 cmd := generateFsRule.RuleParams.Command
7465 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007466}
7467
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007468func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007469 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007470 apex_set {
7471 name: "myapex",
7472 filename: "foo_v2.apex",
7473 sanitized: {
7474 none: { set: "myapex.apks", },
7475 hwaddress: { set: "myapex.hwasan.apks", },
7476 },
Paul Duffin24704672021-04-06 16:09:30 +01007477 }
7478 `
7479 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007480
Paul Duffin24704672021-04-06 16:09:30 +01007481 // Check that the extractor produces the correct output file from the correct input file.
7482 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007483
Paul Duffin24704672021-04-06 16:09:30 +01007484 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7485 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007486
Paul Duffin24704672021-04-06 16:09:30 +01007487 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7488
7489 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007490 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7491 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007492
7493 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007494}
7495
Pranav Guptaeba03b02022-09-27 00:27:08 +00007496func TestApexSetApksModuleAssignment(t *testing.T) {
7497 ctx := testApex(t, `
7498 apex_set {
7499 name: "myapex",
7500 set: ":myapex_apks_file",
7501 }
7502
7503 filegroup {
7504 name: "myapex_apks_file",
7505 srcs: ["myapex.apks"],
7506 }
7507 `)
7508
7509 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7510
7511 // Check that the extractor produces the correct apks file from the input module
7512 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7513 extractedApex := m.Output(extractorOutput)
7514
7515 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7516}
7517
Paul Duffin89f570a2021-06-16 01:42:33 +01007518func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007519 t.Helper()
7520
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007521 bp := `
7522 java_library {
7523 name: "some-updatable-apex-lib",
7524 srcs: ["a.java"],
7525 sdk_version: "current",
7526 apex_available: [
7527 "some-updatable-apex",
7528 ],
satayevabcd5972021-08-06 17:49:46 +01007529 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007530 }
7531
7532 java_library {
7533 name: "some-non-updatable-apex-lib",
7534 srcs: ["a.java"],
7535 apex_available: [
7536 "some-non-updatable-apex",
7537 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007538 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007539 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007540 }
7541
7542 bootclasspath_fragment {
7543 name: "some-non-updatable-fragment",
7544 contents: ["some-non-updatable-apex-lib"],
7545 apex_available: [
7546 "some-non-updatable-apex",
7547 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007548 hidden_api: {
7549 split_packages: ["*"],
7550 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007551 }
7552
7553 java_library {
7554 name: "some-platform-lib",
7555 srcs: ["a.java"],
7556 sdk_version: "current",
7557 installable: true,
7558 }
7559
7560 java_library {
7561 name: "some-art-lib",
7562 srcs: ["a.java"],
7563 sdk_version: "current",
7564 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007565 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007566 ],
7567 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007568 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007569 }
7570
7571 apex {
7572 name: "some-updatable-apex",
7573 key: "some-updatable-apex.key",
7574 java_libs: ["some-updatable-apex-lib"],
7575 updatable: true,
7576 min_sdk_version: "current",
7577 }
7578
7579 apex {
7580 name: "some-non-updatable-apex",
7581 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007582 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007583 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007584 }
7585
7586 apex_key {
7587 name: "some-updatable-apex.key",
7588 }
7589
7590 apex_key {
7591 name: "some-non-updatable-apex.key",
7592 }
7593
7594 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007595 name: "com.android.art.debug",
7596 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007597 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007598 updatable: true,
7599 min_sdk_version: "current",
7600 }
7601
Paul Duffinf23bc472021-04-27 12:42:20 +01007602 bootclasspath_fragment {
7603 name: "art-bootclasspath-fragment",
7604 image_name: "art",
7605 contents: ["some-art-lib"],
7606 apex_available: [
7607 "com.android.art.debug",
7608 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007609 hidden_api: {
7610 split_packages: ["*"],
7611 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007612 }
7613
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007614 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007615 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007616 }
7617
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007618 filegroup {
7619 name: "some-updatable-apex-file_contexts",
7620 srcs: [
7621 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7622 ],
7623 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007624
7625 filegroup {
7626 name: "some-non-updatable-apex-file_contexts",
7627 srcs: [
7628 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7629 ],
7630 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007631 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007632
Paul Duffin89f570a2021-06-16 01:42:33 +01007633 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007634}
7635
Paul Duffin89f570a2021-06-16 01:42:33 +01007636func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007637 t.Helper()
7638
Paul Duffin55607122021-03-30 23:32:51 +01007639 fs := android.MockFS{
7640 "a.java": nil,
7641 "a.jar": nil,
7642 "apex_manifest.json": nil,
7643 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007644 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007645 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7646 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7647 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007648 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007649 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007650
Paul Duffin55607122021-03-30 23:32:51 +01007651 errorHandler := android.FixtureExpectsNoErrors
7652 if errmsg != "" {
7653 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007654 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007655
Paul Duffin55607122021-03-30 23:32:51 +01007656 result := android.GroupFixturePreparers(
7657 cc.PrepareForTestWithCcDefaultModules,
7658 java.PrepareForTestWithHiddenApiBuildComponents,
7659 java.PrepareForTestWithJavaDefaultModules,
7660 java.PrepareForTestWithJavaSdkLibraryFiles,
7661 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007662 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007663 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007664 android.FixtureModifyMockFS(func(fs android.MockFS) {
7665 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7666 insert := ""
7667 for _, fragment := range fragments {
7668 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7669 }
7670 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7671 platform_bootclasspath {
7672 name: "platform-bootclasspath",
7673 fragments: [
7674 %s
7675 ],
7676 }
7677 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007678 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007679 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007680 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007681 ).
7682 ExtendWithErrorHandler(errorHandler).
7683 RunTestWithBp(t, bp)
7684
7685 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007686}
7687
Paul Duffin5556c5f2022-06-09 17:32:21 +00007688func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007689 preparers := android.GroupFixturePreparers(
7690 java.PrepareForTestWithJavaDefaultModules,
7691 PrepareForTestWithApexBuildComponents,
7692 ).
7693 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7694 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7695
7696 bpBase := `
7697 apex_set {
7698 name: "com.android.myapex",
7699 installable: true,
7700 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7701 set: "myapex.apks",
7702 }
7703
7704 apex_set {
7705 name: "com.mycompany.android.myapex",
7706 apex_name: "com.android.myapex",
7707 installable: true,
7708 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7709 set: "company-myapex.apks",
7710 }
7711
7712 prebuilt_bootclasspath_fragment {
7713 name: "my-bootclasspath-fragment",
7714 apex_available: ["com.android.myapex"],
7715 %s
7716 }
7717 `
7718
7719 t.Run("java_import", func(t *testing.T) {
7720 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7721 java_import {
7722 name: "libfoo",
7723 jars: ["libfoo.jar"],
7724 apex_available: ["com.android.myapex"],
7725 }
7726 `)
7727 })
7728
7729 t.Run("java_sdk_library_import", func(t *testing.T) {
7730 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7731 java_sdk_library_import {
7732 name: "libfoo",
7733 public: {
7734 jars: ["libbar.jar"],
7735 },
7736 apex_available: ["com.android.myapex"],
7737 }
7738 `)
7739 })
7740
7741 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7742 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7743 image_name: "art",
7744 contents: ["libfoo"],
7745 `)+`
7746 java_sdk_library_import {
7747 name: "libfoo",
7748 public: {
7749 jars: ["libbar.jar"],
7750 },
7751 apex_available: ["com.android.myapex"],
7752 }
7753 `)
7754 })
7755}
7756
Paul Duffin5556c5f2022-06-09 17:32:21 +00007757func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7758 preparers := android.GroupFixturePreparers(
7759 java.PrepareForTestWithJavaDefaultModules,
7760 PrepareForTestWithApexBuildComponents,
7761 )
7762
7763 bpBase := `
7764 apex_set {
7765 name: "com.android.myapex",
7766 installable: true,
7767 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7768 set: "myapex.apks",
7769 }
7770
7771 apex_set {
7772 name: "com.android.myapex_compressed",
7773 apex_name: "com.android.myapex",
7774 installable: true,
7775 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7776 set: "myapex_compressed.apks",
7777 }
7778
7779 prebuilt_bootclasspath_fragment {
7780 name: "my-bootclasspath-fragment",
7781 apex_available: [
7782 "com.android.myapex",
7783 "com.android.myapex_compressed",
7784 ],
7785 hidden_api: {
7786 annotation_flags: "annotation-flags.csv",
7787 metadata: "metadata.csv",
7788 index: "index.csv",
7789 signature_patterns: "signature_patterns.csv",
7790 },
7791 %s
7792 }
7793 `
7794
7795 t.Run("java_import", func(t *testing.T) {
7796 result := preparers.RunTestWithBp(t,
7797 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7798 java_import {
7799 name: "libfoo",
7800 jars: ["libfoo.jar"],
7801 apex_available: [
7802 "com.android.myapex",
7803 "com.android.myapex_compressed",
7804 ],
7805 }
7806 `)
7807
7808 module := result.Module("libfoo", "android_common_com.android.myapex")
7809 usesLibraryDep := module.(java.UsesLibraryDependency)
7810 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7811 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7812 usesLibraryDep.DexJarBuildPath().Path())
7813 })
7814
7815 t.Run("java_sdk_library_import", func(t *testing.T) {
7816 result := preparers.RunTestWithBp(t,
7817 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7818 java_sdk_library_import {
7819 name: "libfoo",
7820 public: {
7821 jars: ["libbar.jar"],
7822 },
7823 apex_available: [
7824 "com.android.myapex",
7825 "com.android.myapex_compressed",
7826 ],
7827 compile_dex: true,
7828 }
7829 `)
7830
7831 module := result.Module("libfoo", "android_common_com.android.myapex")
7832 usesLibraryDep := module.(java.UsesLibraryDependency)
7833 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7834 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7835 usesLibraryDep.DexJarBuildPath().Path())
7836 })
7837
7838 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7839 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7840 image_name: "art",
7841 contents: ["libfoo"],
7842 `)+`
7843 java_sdk_library_import {
7844 name: "libfoo",
7845 public: {
7846 jars: ["libbar.jar"],
7847 },
7848 apex_available: [
7849 "com.android.myapex",
7850 "com.android.myapex_compressed",
7851 ],
7852 compile_dex: true,
7853 }
7854 `)
7855 })
7856}
7857
Jooyung Han548640b2020-04-27 12:10:30 +09007858func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7859 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7860 apex {
7861 name: "myapex",
7862 key: "myapex.key",
7863 updatable: true,
7864 }
7865
7866 apex_key {
7867 name: "myapex.key",
7868 public_key: "testkey.avbpubkey",
7869 private_key: "testkey.pem",
7870 }
7871 `)
7872}
7873
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007874func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7875 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7876 apex {
7877 name: "myapex",
7878 key: "myapex.key",
7879 }
7880
7881 apex_key {
7882 name: "myapex.key",
7883 public_key: "testkey.avbpubkey",
7884 private_key: "testkey.pem",
7885 }
7886 `)
7887}
7888
Daniel Norman69109112021-12-02 12:52:42 -08007889func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7890 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7891 apex {
7892 name: "myapex",
7893 key: "myapex.key",
7894 updatable: true,
7895 soc_specific: true,
7896 }
7897
7898 apex_key {
7899 name: "myapex.key",
7900 public_key: "testkey.avbpubkey",
7901 private_key: "testkey.pem",
7902 }
7903 `)
7904}
7905
satayevb98371c2021-06-15 16:49:50 +01007906func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7907 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7908 apex {
7909 name: "myapex",
7910 key: "myapex.key",
7911 systemserverclasspath_fragments: [
7912 "mysystemserverclasspathfragment",
7913 ],
7914 min_sdk_version: "29",
7915 updatable: true,
7916 }
7917
7918 apex_key {
7919 name: "myapex.key",
7920 public_key: "testkey.avbpubkey",
7921 private_key: "testkey.pem",
7922 }
7923
7924 java_library {
7925 name: "foo",
7926 srcs: ["b.java"],
7927 min_sdk_version: "29",
7928 installable: true,
7929 apex_available: [
7930 "myapex",
7931 ],
7932 }
7933
7934 systemserverclasspath_fragment {
7935 name: "mysystemserverclasspathfragment",
7936 generate_classpaths_proto: false,
7937 contents: [
7938 "foo",
7939 ],
7940 apex_available: [
7941 "myapex",
7942 ],
7943 }
satayevabcd5972021-08-06 17:49:46 +01007944 `,
7945 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7946 )
satayevb98371c2021-06-15 16:49:50 +01007947}
7948
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007949func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007950 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7951 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7952 // modules to be included in the BootJars.
7953 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7954 return android.GroupFixturePreparers(
7955 dexpreopt.FixtureSetBootJars(bootJars...),
7956 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7957 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7958 }),
7959 )
7960 }
7961
7962 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7963 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7964 // specified in the ArtApexJars configuration.
7965 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7966 return android.GroupFixturePreparers(
7967 dexpreopt.FixtureSetArtBootJars(bootJars...),
7968 dexpreopt.FixtureSetBootJars(bootJars...),
7969 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7970 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7971 }),
7972 )
7973 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007974
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007975 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007976 preparer := android.GroupFixturePreparers(
7977 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7978 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7979 )
7980 fragments := []java.ApexVariantReference{
7981 {
7982 Apex: proptools.StringPtr("com.android.art.debug"),
7983 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7984 },
7985 {
7986 Apex: proptools.StringPtr("some-non-updatable-apex"),
7987 Module: proptools.StringPtr("some-non-updatable-fragment"),
7988 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007989 }
satayevabcd5972021-08-06 17:49:46 +01007990 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007991 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007992
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007993 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007994 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7995 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007996 preparer := android.GroupFixturePreparers(
7997 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7998 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7999 )
Paul Duffin60264a02021-04-12 20:02:36 +01008000 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008001 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008002
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008003 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008004 err := `ArtApexJars expects this to be in apex "some-updatable-apex" but this is only in apexes.*"com.android.art.debug"`
Paul Duffin60264a02021-04-12 20:02:36 +01008005 // Update the dexpreopt ArtApexJars directly.
8006 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
8007 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008008 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008009
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008010 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 +01008011 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 +01008012 // Update the dexpreopt ArtApexJars directly.
8013 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
8014 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008015 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008016
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008017 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 +01008018 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 +01008019 preparer := android.GroupFixturePreparers(
8020 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
8021 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8022 )
Paul Duffin60264a02021-04-12 20:02:36 +01008023 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008024 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008025
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008026 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008027 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01008028 fragment := java.ApexVariantReference{
8029 Apex: proptools.StringPtr("some-non-updatable-apex"),
8030 Module: proptools.StringPtr("some-non-updatable-fragment"),
8031 }
8032 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008033 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008034
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008035 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008036 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008037 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8038 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008039 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008040
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008041 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008042 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008043 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8044 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008045 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008046
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008047 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008048 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01008049 // Update the dexpreopt ArtApexJars directly.
8050 preparer := prepareSetArtJars("platform:some-platform-lib")
8051 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008052 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008053
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008054 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008055 preparer := android.GroupFixturePreparers(
8056 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8057 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8058 )
8059 fragments := []java.ApexVariantReference{
8060 {
8061 Apex: proptools.StringPtr("some-non-updatable-apex"),
8062 Module: proptools.StringPtr("some-non-updatable-fragment"),
8063 },
8064 }
8065 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008066 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008067}
8068
8069func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008070 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008071 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008072 fragment := java.ApexVariantReference{
8073 Apex: proptools.StringPtr("myapex"),
8074 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8075 }
8076
Paul Duffin064b70c2020-11-02 17:32:38 +00008077 testDexpreoptWithApexes(t, `
8078 prebuilt_apex {
8079 name: "myapex" ,
8080 arch: {
8081 arm64: {
8082 src: "myapex-arm64.apex",
8083 },
8084 arm: {
8085 src: "myapex-arm.apex",
8086 },
8087 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008088 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8089 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008090
Paul Duffin89f570a2021-06-16 01:42:33 +01008091 prebuilt_bootclasspath_fragment {
8092 name: "my-bootclasspath-fragment",
8093 contents: ["libfoo"],
8094 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008095 hidden_api: {
8096 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8097 metadata: "my-bootclasspath-fragment/metadata.csv",
8098 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008099 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8100 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8101 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008102 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008103 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008104
Paul Duffin89f570a2021-06-16 01:42:33 +01008105 java_import {
8106 name: "libfoo",
8107 jars: ["libfoo.jar"],
8108 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008109 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008110 }
8111 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008112 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008113}
8114
Spandan Dasf14e2542021-11-12 00:01:37 +00008115func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008116 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008117 bp += `
8118 apex_key {
8119 name: "myapex.key",
8120 public_key: "testkey.avbpubkey",
8121 private_key: "testkey.pem",
8122 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008123 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008124 "lib1/src/A.java": nil,
8125 "lib2/src/B.java": nil,
8126 "system/sepolicy/apex/myapex-file_contexts": nil,
8127 }
8128
Paul Duffin45338f02021-03-30 23:07:52 +01008129 errorHandler := android.FixtureExpectsNoErrors
8130 if errmsg != "" {
8131 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008132 }
Colin Crossae8600b2020-10-29 17:09:13 -07008133
Paul Duffin45338f02021-03-30 23:07:52 +01008134 android.GroupFixturePreparers(
8135 android.PrepareForTestWithAndroidBuildComponents,
8136 java.PrepareForTestWithJavaBuildComponents,
8137 PrepareForTestWithApexBuildComponents,
8138 android.PrepareForTestWithNeverallowRules(rules),
8139 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008140 apexBootJars := make([]string, 0, len(bootJars))
8141 for _, apexBootJar := range bootJars {
8142 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008143 }
satayevd604b212021-07-21 14:23:52 +01008144 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008145 }),
8146 fs.AddToFixture(),
8147 ).
8148 ExtendWithErrorHandler(errorHandler).
8149 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008150}
8151
8152func TestApexPermittedPackagesRules(t *testing.T) {
8153 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008154 name string
8155 expectedError string
8156 bp string
8157 bootJars []string
8158 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008159 }{
8160
8161 {
8162 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8163 expectedError: "",
8164 bp: `
8165 java_library {
8166 name: "bcp_lib1",
8167 srcs: ["lib1/src/*.java"],
8168 permitted_packages: ["foo.bar"],
8169 apex_available: ["myapex"],
8170 sdk_version: "none",
8171 system_modules: "none",
8172 }
8173 java_library {
8174 name: "nonbcp_lib2",
8175 srcs: ["lib2/src/*.java"],
8176 apex_available: ["myapex"],
8177 permitted_packages: ["a.b"],
8178 sdk_version: "none",
8179 system_modules: "none",
8180 }
8181 apex {
8182 name: "myapex",
8183 key: "myapex.key",
8184 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008185 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008186 }`,
8187 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008188 bcpPermittedPackages: map[string][]string{
8189 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008190 "foo.bar",
8191 },
8192 },
8193 },
8194 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008195 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008196 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 +01008197 bp: `
8198 java_library {
8199 name: "bcp_lib1",
8200 srcs: ["lib1/src/*.java"],
8201 apex_available: ["myapex"],
8202 permitted_packages: ["foo.bar"],
8203 sdk_version: "none",
8204 system_modules: "none",
8205 }
8206 java_library {
8207 name: "bcp_lib2",
8208 srcs: ["lib2/src/*.java"],
8209 apex_available: ["myapex"],
8210 permitted_packages: ["foo.bar", "bar.baz"],
8211 sdk_version: "none",
8212 system_modules: "none",
8213 }
8214 apex {
8215 name: "myapex",
8216 key: "myapex.key",
8217 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008218 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008219 }
8220 `,
8221 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008222 bcpPermittedPackages: map[string][]string{
8223 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008224 "foo.bar",
8225 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008226 "bcp_lib2": []string{
8227 "foo.bar",
8228 },
8229 },
8230 },
8231 {
8232 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8233 expectedError: "",
8234 bp: `
8235 java_library {
8236 name: "bcp_lib_restricted",
8237 srcs: ["lib1/src/*.java"],
8238 apex_available: ["myapex"],
8239 permitted_packages: ["foo.bar"],
8240 sdk_version: "none",
8241 min_sdk_version: "29",
8242 system_modules: "none",
8243 }
8244 java_library {
8245 name: "bcp_lib_unrestricted",
8246 srcs: ["lib2/src/*.java"],
8247 apex_available: ["myapex"],
8248 permitted_packages: ["foo.bar", "bar.baz"],
8249 sdk_version: "none",
8250 min_sdk_version: "29",
8251 system_modules: "none",
8252 }
8253 apex {
8254 name: "myapex",
8255 key: "myapex.key",
8256 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8257 updatable: true,
8258 min_sdk_version: "29",
8259 }
8260 `,
8261 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8262 bcpPermittedPackages: map[string][]string{
8263 "bcp_lib1_non_updateable": []string{
8264 "foo.bar",
8265 },
8266 // 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 +01008267 },
8268 },
8269 }
8270 for _, tc := range testcases {
8271 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008272 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8273 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008274 })
8275 }
8276}
8277
Jiyong Park62304bb2020-04-13 16:19:48 +09008278func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008279 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008280 apex {
8281 name: "myapex",
8282 key: "myapex.key",
8283 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008284 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008285 }
8286
8287 apex_key {
8288 name: "myapex.key",
8289 public_key: "testkey.avbpubkey",
8290 private_key: "testkey.pem",
8291 }
8292
8293 cc_library {
8294 name: "mylib",
8295 srcs: ["mylib.cpp"],
8296 system_shared_libs: [],
8297 stl: "none",
8298 stubs: {
8299 versions: ["1"],
8300 },
8301 apex_available: ["myapex"],
8302 }
8303
8304 cc_library {
8305 name: "myprivlib",
8306 srcs: ["mylib.cpp"],
8307 system_shared_libs: [],
8308 stl: "none",
8309 apex_available: ["myapex"],
8310 }
8311
8312
8313 cc_test {
8314 name: "mytest",
8315 gtest: false,
8316 srcs: ["mylib.cpp"],
8317 system_shared_libs: [],
8318 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008319 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008320 test_for: ["myapex"]
8321 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008322
8323 cc_library {
8324 name: "mytestlib",
8325 srcs: ["mylib.cpp"],
8326 system_shared_libs: [],
8327 shared_libs: ["mylib", "myprivlib"],
8328 stl: "none",
8329 test_for: ["myapex"],
8330 }
8331
8332 cc_benchmark {
8333 name: "mybench",
8334 srcs: ["mylib.cpp"],
8335 system_shared_libs: [],
8336 shared_libs: ["mylib", "myprivlib"],
8337 stl: "none",
8338 test_for: ["myapex"],
8339 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008340 `)
8341
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008342 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008343 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008344 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8345 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8346 }
8347
8348 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008349 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008350 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8351 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8352 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8353}
Jiyong Park46a512f2020-12-04 18:02:13 +09008354
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008355func TestIndirectTestFor(t *testing.T) {
8356 ctx := testApex(t, `
8357 apex {
8358 name: "myapex",
8359 key: "myapex.key",
8360 native_shared_libs: ["mylib", "myprivlib"],
8361 updatable: false,
8362 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008363
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008364 apex_key {
8365 name: "myapex.key",
8366 public_key: "testkey.avbpubkey",
8367 private_key: "testkey.pem",
8368 }
8369
8370 cc_library {
8371 name: "mylib",
8372 srcs: ["mylib.cpp"],
8373 system_shared_libs: [],
8374 stl: "none",
8375 stubs: {
8376 versions: ["1"],
8377 },
8378 apex_available: ["myapex"],
8379 }
8380
8381 cc_library {
8382 name: "myprivlib",
8383 srcs: ["mylib.cpp"],
8384 system_shared_libs: [],
8385 stl: "none",
8386 shared_libs: ["mylib"],
8387 apex_available: ["myapex"],
8388 }
8389
8390 cc_library {
8391 name: "mytestlib",
8392 srcs: ["mylib.cpp"],
8393 system_shared_libs: [],
8394 shared_libs: ["myprivlib"],
8395 stl: "none",
8396 test_for: ["myapex"],
8397 }
8398 `)
8399
8400 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008401 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008402 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8403 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8404 }
8405
8406 // The platform variant of mytestlib links to the platform variant of the
8407 // internal myprivlib.
8408 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8409
8410 // The platform variant of myprivlib links to the platform variant of mylib
8411 // and bypasses its stubs.
8412 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 +09008413}
8414
Martin Stjernholmec009002021-03-27 15:18:31 +00008415func TestTestForForLibInOtherApex(t *testing.T) {
8416 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8417 _ = testApex(t, `
8418 apex {
8419 name: "com.android.art",
8420 key: "myapex.key",
8421 native_shared_libs: ["mylib"],
8422 updatable: false,
8423 }
8424
8425 apex {
8426 name: "com.android.art.debug",
8427 key: "myapex.key",
8428 native_shared_libs: ["mylib", "mytestlib"],
8429 updatable: false,
8430 }
8431
8432 apex_key {
8433 name: "myapex.key",
8434 public_key: "testkey.avbpubkey",
8435 private_key: "testkey.pem",
8436 }
8437
8438 cc_library {
8439 name: "mylib",
8440 srcs: ["mylib.cpp"],
8441 system_shared_libs: [],
8442 stl: "none",
8443 stubs: {
8444 versions: ["1"],
8445 },
8446 apex_available: ["com.android.art", "com.android.art.debug"],
8447 }
8448
8449 cc_library {
8450 name: "mytestlib",
8451 srcs: ["mylib.cpp"],
8452 system_shared_libs: [],
8453 shared_libs: ["mylib"],
8454 stl: "none",
8455 apex_available: ["com.android.art.debug"],
8456 test_for: ["com.android.art"],
8457 }
8458 `,
8459 android.MockFS{
8460 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8461 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8462 }.AddToFixture())
8463}
8464
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008465// TODO(jungjw): Move this to proptools
8466func intPtr(i int) *int {
8467 return &i
8468}
8469
8470func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008471 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008472 apex_set {
8473 name: "myapex",
8474 set: "myapex.apks",
8475 filename: "foo_v2.apex",
8476 overrides: ["foo"],
8477 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008478 `,
8479 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8480 variables.Platform_sdk_version = intPtr(30)
8481 }),
8482 android.FixtureModifyConfig(func(config android.Config) {
8483 config.Targets[android.Android] = []android.Target{
8484 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8485 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8486 }
8487 }),
8488 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008489
Paul Duffin24704672021-04-06 16:09:30 +01008490 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008491
8492 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008493 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008494 actual := extractedApex.Args["abis"]
8495 expected := "ARMEABI_V7A,ARM64_V8A"
8496 if actual != expected {
8497 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8498 }
8499 actual = extractedApex.Args["sdk-version"]
8500 expected = "30"
8501 if actual != expected {
8502 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8503 }
8504
Paul Duffin6717d882021-06-15 19:09:41 +01008505 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008506 a := m.Module().(*ApexSet)
8507 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008508 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008509 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8510 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8511 }
8512}
8513
Anton Hansson805e0a52022-11-25 14:06:46 +00008514func TestApexSet_NativeBridge(t *testing.T) {
8515 ctx := testApex(t, `
8516 apex_set {
8517 name: "myapex",
8518 set: "myapex.apks",
8519 filename: "foo_v2.apex",
8520 overrides: ["foo"],
8521 }
8522 `,
8523 android.FixtureModifyConfig(func(config android.Config) {
8524 config.Targets[android.Android] = []android.Target{
8525 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8526 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8527 }
8528 }),
8529 )
8530
8531 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8532
8533 // Check extract_apks tool parameters. No native bridge arch expected
8534 extractedApex := m.Output("extracted/myapex.apks")
8535 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8536}
8537
Jiyong Park7d95a512020-05-10 15:16:24 +09008538func TestNoStaticLinkingToStubsLib(t *testing.T) {
8539 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8540 apex {
8541 name: "myapex",
8542 key: "myapex.key",
8543 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008544 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008545 }
8546
8547 apex_key {
8548 name: "myapex.key",
8549 public_key: "testkey.avbpubkey",
8550 private_key: "testkey.pem",
8551 }
8552
8553 cc_library {
8554 name: "mylib",
8555 srcs: ["mylib.cpp"],
8556 static_libs: ["otherlib"],
8557 system_shared_libs: [],
8558 stl: "none",
8559 apex_available: [ "myapex" ],
8560 }
8561
8562 cc_library {
8563 name: "otherlib",
8564 srcs: ["mylib.cpp"],
8565 system_shared_libs: [],
8566 stl: "none",
8567 stubs: {
8568 versions: ["1", "2", "3"],
8569 },
8570 apex_available: [ "myapex" ],
8571 }
8572 `)
8573}
8574
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008575func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008576 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008577 apex {
8578 name: "myapex",
8579 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008580 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008581 custom_sign_tool: "sign_myapex",
8582 }
8583
8584 apex_key {
8585 name: "myapex.key",
8586 public_key: "testkey.avbpubkey",
8587 private_key: "testkey.pem",
8588 }
8589 `)
8590
8591 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8592 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8593 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"`)
8594}
8595
8596func TestApexKeysTxtOverrides(t *testing.T) {
8597 ctx := testApex(t, `
8598 apex {
8599 name: "myapex",
8600 key: "myapex.key",
8601 updatable: false,
8602 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008603 }
8604
8605 apex_key {
8606 name: "myapex.key",
8607 public_key: "testkey.avbpubkey",
8608 private_key: "testkey.pem",
8609 }
8610
8611 prebuilt_apex {
8612 name: "myapex",
8613 prefer: true,
8614 arch: {
8615 arm64: {
8616 src: "myapex-arm64.apex",
8617 },
8618 arm: {
8619 src: "myapex-arm.apex",
8620 },
8621 },
8622 }
8623
8624 apex_set {
8625 name: "myapex_set",
8626 set: "myapex.apks",
8627 filename: "myapex_set.apex",
8628 overrides: ["myapex"],
8629 }
8630 `)
8631
8632 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8633 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8634 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 +09008635 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 +09008636}
8637
Jooyung Han938b5932020-06-20 12:47:47 +09008638func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008639 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008640 apex {
8641 name: "myapex",
8642 key: "myapex.key",
8643 apps: ["app"],
8644 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008645 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008646 }
8647
8648 apex_key {
8649 name: "myapex.key",
8650 public_key: "testkey.avbpubkey",
8651 private_key: "testkey.pem",
8652 }
8653
8654 android_app {
8655 name: "app",
8656 srcs: ["foo/bar/MyClass.java"],
8657 package_name: "foo",
8658 sdk_version: "none",
8659 system_modules: "none",
8660 apex_available: [ "myapex" ],
8661 }
8662 `, withFiles(map[string][]byte{
8663 "sub/Android.bp": []byte(`
8664 override_apex {
8665 name: "override_myapex",
8666 base: "myapex",
8667 apps: ["override_app"],
8668 allowed_files: ":allowed",
8669 }
8670 // Overridable "path" property should be referenced indirectly
8671 filegroup {
8672 name: "allowed",
8673 srcs: ["allowed.txt"],
8674 }
8675 override_android_app {
8676 name: "override_app",
8677 base: "app",
8678 package_name: "bar",
8679 }
8680 `),
8681 }))
8682
8683 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8684 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8685 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8686 }
8687
8688 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8689 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8690 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8691 }
8692}
8693
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008694func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008695 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008696 apex {
8697 name: "myapex",
8698 key: "myapex.key",
8699 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008700 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008701 }
8702
8703 apex_key {
8704 name: "myapex.key",
8705 public_key: "testkey.avbpubkey",
8706 private_key: "testkey.pem",
8707 }
8708
8709 cc_library {
8710 name: "mylib",
8711 srcs: ["mylib.cpp"],
8712 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008713 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008714 },
8715 apex_available: ["myapex"],
8716 }
8717
8718 cc_prebuilt_library_shared {
8719 name: "mylib",
8720 prefer: false,
8721 srcs: ["prebuilt.so"],
8722 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008723 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008724 },
8725 apex_available: ["myapex"],
8726 }
8727 `)
8728}
8729
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008730func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008731 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008732 apex {
8733 name: "myapex",
8734 key: "myapex.key",
8735 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008736 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008737 }
8738 apex_key {
8739 name: "myapex.key",
8740 public_key: "testkey.avbpubkey",
8741 private_key: "testkey.pem",
8742 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008743 `,
8744 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8745 variables.CompressedApex = proptools.BoolPtr(true)
8746 }),
8747 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008748
8749 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8750 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8751
8752 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8753 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8754
8755 // Make sure output of bundle is .capex
8756 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8757 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8758
8759 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008760 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008761 var builder strings.Builder
8762 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8763 androidMk := builder.String()
8764 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8765}
8766
Martin Stjernholm2856c662020-12-02 15:03:42 +00008767func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008768 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008769 apex {
8770 name: "myapex",
8771 key: "myapex.key",
8772 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008773 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008774 }
8775
8776 apex_key {
8777 name: "myapex.key",
8778 public_key: "testkey.avbpubkey",
8779 private_key: "testkey.pem",
8780 }
8781
8782 cc_library {
8783 name: "mylib",
8784 srcs: ["mylib.cpp"],
8785 apex_available: ["myapex"],
8786 shared_libs: ["otherlib"],
8787 system_shared_libs: [],
8788 }
8789
8790 cc_library {
8791 name: "otherlib",
8792 srcs: ["mylib.cpp"],
8793 stubs: {
8794 versions: ["current"],
8795 },
8796 }
8797
8798 cc_prebuilt_library_shared {
8799 name: "otherlib",
8800 prefer: true,
8801 srcs: ["prebuilt.so"],
8802 stubs: {
8803 versions: ["current"],
8804 },
8805 }
8806 `)
8807
8808 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008809 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008810 var builder strings.Builder
8811 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8812 androidMk := builder.String()
8813
8814 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8815 // a thing there.
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008816 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 +00008817}
8818
Jiyong Parke3867542020-12-03 17:28:25 +09008819func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008820 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008821 apex {
8822 name: "myapex",
8823 key: "myapex.key",
8824 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008825 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008826 }
8827
8828 apex_key {
8829 name: "myapex.key",
8830 public_key: "testkey.avbpubkey",
8831 private_key: "testkey.pem",
8832 }
8833
8834 cc_library {
8835 name: "mylib",
8836 srcs: ["mylib.cpp"],
8837 system_shared_libs: [],
8838 stl: "none",
8839 apex_available: ["myapex"],
8840 shared_libs: ["mylib2"],
8841 target: {
8842 apex: {
8843 exclude_shared_libs: ["mylib2"],
8844 },
8845 },
8846 }
8847
8848 cc_library {
8849 name: "mylib2",
8850 srcs: ["mylib.cpp"],
8851 system_shared_libs: [],
8852 stl: "none",
8853 }
8854 `)
8855
8856 // Check if mylib is linked to mylib2 for the non-apex target
8857 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8858 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8859
8860 // Make sure that the link doesn't occur for the apex target
8861 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8862 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8863
8864 // It shouldn't appear in the copy cmd as well.
8865 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8866 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8867}
8868
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008869func TestPrebuiltStubLibDep(t *testing.T) {
8870 bpBase := `
8871 apex {
8872 name: "myapex",
8873 key: "myapex.key",
8874 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008875 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008876 }
8877 apex_key {
8878 name: "myapex.key",
8879 public_key: "testkey.avbpubkey",
8880 private_key: "testkey.pem",
8881 }
8882 cc_library {
8883 name: "mylib",
8884 srcs: ["mylib.cpp"],
8885 apex_available: ["myapex"],
8886 shared_libs: ["stublib"],
8887 system_shared_libs: [],
8888 }
8889 apex {
8890 name: "otherapex",
8891 enabled: %s,
8892 key: "myapex.key",
8893 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008894 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008895 }
8896 `
8897
8898 stublibSourceBp := `
8899 cc_library {
8900 name: "stublib",
8901 srcs: ["mylib.cpp"],
8902 apex_available: ["otherapex"],
8903 system_shared_libs: [],
8904 stl: "none",
8905 stubs: {
8906 versions: ["1"],
8907 },
8908 }
8909 `
8910
8911 stublibPrebuiltBp := `
8912 cc_prebuilt_library_shared {
8913 name: "stublib",
8914 srcs: ["prebuilt.so"],
8915 apex_available: ["otherapex"],
8916 stubs: {
8917 versions: ["1"],
8918 },
8919 %s
8920 }
8921 `
8922
8923 tests := []struct {
8924 name string
8925 stublibBp string
8926 usePrebuilt bool
8927 modNames []string // Modules to collect AndroidMkEntries for
8928 otherApexEnabled []string
8929 }{
8930 {
8931 name: "only_source",
8932 stublibBp: stublibSourceBp,
8933 usePrebuilt: false,
8934 modNames: []string{"stublib"},
8935 otherApexEnabled: []string{"true", "false"},
8936 },
8937 {
8938 name: "source_preferred",
8939 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8940 usePrebuilt: false,
8941 modNames: []string{"stublib", "prebuilt_stublib"},
8942 otherApexEnabled: []string{"true", "false"},
8943 },
8944 {
8945 name: "prebuilt_preferred",
8946 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8947 usePrebuilt: true,
8948 modNames: []string{"stublib", "prebuilt_stublib"},
8949 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8950 },
8951 {
8952 name: "only_prebuilt",
8953 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8954 usePrebuilt: true,
8955 modNames: []string{"stublib"},
8956 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8957 },
8958 }
8959
8960 for _, test := range tests {
8961 t.Run(test.name, func(t *testing.T) {
8962 for _, otherApexEnabled := range test.otherApexEnabled {
8963 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008964 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008965
8966 type modAndMkEntries struct {
8967 mod *cc.Module
8968 mkEntries android.AndroidMkEntries
8969 }
8970 entries := []*modAndMkEntries{}
8971
8972 // Gather shared lib modules that are installable
8973 for _, modName := range test.modNames {
8974 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8975 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8976 continue
8977 }
8978 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008979 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008980 continue
8981 }
Colin Crossaa255532020-07-03 13:18:24 -07008982 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008983 if ent.Disabled {
8984 continue
8985 }
8986 entries = append(entries, &modAndMkEntries{
8987 mod: mod,
8988 mkEntries: ent,
8989 })
8990 }
8991 }
8992 }
8993
8994 var entry *modAndMkEntries = nil
8995 for _, ent := range entries {
8996 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8997 if entry != nil {
8998 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8999 } else {
9000 entry = ent
9001 }
9002 }
9003 }
9004
9005 if entry == nil {
9006 t.Errorf("AndroidMk entry for \"stublib\" missing")
9007 } else {
9008 isPrebuilt := entry.mod.Prebuilt() != nil
9009 if isPrebuilt != test.usePrebuilt {
9010 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9011 }
9012 if !entry.mod.IsStubs() {
9013 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9014 }
9015 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9016 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9017 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009018 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009019 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009020 if !android.InList(expected, cflags) {
9021 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9022 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009023 }
9024 })
9025 }
9026 })
9027 }
9028}
9029
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009030func TestHostApexInHostOnlyBuild(t *testing.T) {
9031 testApex(t, `
9032 apex {
9033 name: "myapex",
9034 host_supported: true,
9035 key: "myapex.key",
9036 updatable: false,
9037 payload_type: "zip",
9038 }
9039 apex_key {
9040 name: "myapex.key",
9041 public_key: "testkey.avbpubkey",
9042 private_key: "testkey.pem",
9043 }
9044 `,
9045 android.FixtureModifyConfig(func(config android.Config) {
9046 // We may not have device targets in all builds, e.g. in
9047 // prebuilts/build-tools/build-prebuilts.sh
9048 config.Targets[android.Android] = []android.Target{}
9049 }))
9050}
9051
Colin Crossc33e5212021-05-25 18:16:02 -07009052func TestApexJavaCoverage(t *testing.T) {
9053 bp := `
9054 apex {
9055 name: "myapex",
9056 key: "myapex.key",
9057 java_libs: ["mylib"],
9058 bootclasspath_fragments: ["mybootclasspathfragment"],
9059 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9060 updatable: false,
9061 }
9062
9063 apex_key {
9064 name: "myapex.key",
9065 public_key: "testkey.avbpubkey",
9066 private_key: "testkey.pem",
9067 }
9068
9069 java_library {
9070 name: "mylib",
9071 srcs: ["mylib.java"],
9072 apex_available: ["myapex"],
9073 compile_dex: true,
9074 }
9075
9076 bootclasspath_fragment {
9077 name: "mybootclasspathfragment",
9078 contents: ["mybootclasspathlib"],
9079 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009080 hidden_api: {
9081 split_packages: ["*"],
9082 },
Colin Crossc33e5212021-05-25 18:16:02 -07009083 }
9084
9085 java_library {
9086 name: "mybootclasspathlib",
9087 srcs: ["mybootclasspathlib.java"],
9088 apex_available: ["myapex"],
9089 compile_dex: true,
9090 }
9091
9092 systemserverclasspath_fragment {
9093 name: "mysystemserverclasspathfragment",
9094 contents: ["mysystemserverclasspathlib"],
9095 apex_available: ["myapex"],
9096 }
9097
9098 java_library {
9099 name: "mysystemserverclasspathlib",
9100 srcs: ["mysystemserverclasspathlib.java"],
9101 apex_available: ["myapex"],
9102 compile_dex: true,
9103 }
9104 `
9105
9106 result := android.GroupFixturePreparers(
9107 PrepareForTestWithApexBuildComponents,
9108 prepareForTestWithMyapex,
9109 java.PrepareForTestWithJavaDefaultModules,
9110 android.PrepareForTestWithAndroidBuildComponents,
9111 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009112 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9113 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009114 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009115 ).RunTest(t)
9116
9117 // Make sure jacoco ran on both mylib and mybootclasspathlib
9118 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9119 t.Errorf("Failed to find jacoco rule for mylib")
9120 }
9121 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9122 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9123 }
9124 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9125 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9126 }
9127}
9128
Jiyong Park192600a2021-08-03 07:52:17 +00009129func TestProhibitStaticExecutable(t *testing.T) {
9130 testApexError(t, `executable mybin is static`, `
9131 apex {
9132 name: "myapex",
9133 key: "myapex.key",
9134 binaries: ["mybin"],
9135 min_sdk_version: "29",
9136 }
9137
9138 apex_key {
9139 name: "myapex.key",
9140 public_key: "testkey.avbpubkey",
9141 private_key: "testkey.pem",
9142 }
9143
9144 cc_binary {
9145 name: "mybin",
9146 srcs: ["mylib.cpp"],
9147 relative_install_path: "foo/bar",
9148 static_executable: true,
9149 system_shared_libs: [],
9150 stl: "none",
9151 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009152 min_sdk_version: "29",
9153 }
9154 `)
9155
9156 testApexError(t, `executable mybin.rust is static`, `
9157 apex {
9158 name: "myapex",
9159 key: "myapex.key",
9160 binaries: ["mybin.rust"],
9161 min_sdk_version: "29",
9162 }
9163
9164 apex_key {
9165 name: "myapex.key",
9166 public_key: "testkey.avbpubkey",
9167 private_key: "testkey.pem",
9168 }
9169
9170 rust_binary {
9171 name: "mybin.rust",
9172 srcs: ["foo.rs"],
9173 static_executable: true,
9174 apex_available: ["myapex"],
9175 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009176 }
9177 `)
9178}
9179
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009180func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9181 ctx := testApex(t, `
9182 apex {
9183 name: "myapex",
9184 key: "myapex.key",
9185 updatable: false,
9186 java_libs: ["foo"],
9187 }
9188
9189 apex_key {
9190 name: "myapex.key",
9191 public_key: "testkey.avbpubkey",
9192 private_key: "testkey.pem",
9193 }
9194
9195 java_library {
9196 name: "foo",
9197 srcs: ["foo.java"],
9198 apex_available: ["myapex"],
9199 installable: true,
9200 }
9201 `,
9202 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9203 )
9204
9205 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9206 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9207 var builder strings.Builder
9208 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9209 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009210 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 +00009211}
9212
9213func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9214 ctx := testApex(t, `
9215 prebuilt_apex {
9216 name: "myapex",
9217 arch: {
9218 arm64: {
9219 src: "myapex-arm64.apex",
9220 },
9221 arm: {
9222 src: "myapex-arm.apex",
9223 },
9224 },
9225 exported_java_libs: ["foo"],
9226 }
9227
9228 java_import {
9229 name: "foo",
9230 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009231 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009232 }
9233 `,
9234 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9235 )
9236
9237 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9238 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9239 mainModuleEntries := entriesList[0]
9240 android.AssertArrayString(t,
9241 "LOCAL_REQUIRED_MODULES",
9242 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9243 []string{
9244 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9245 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9246 })
9247}
9248
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009249func TestAndroidMk_RequiredModules(t *testing.T) {
9250 ctx := testApex(t, `
9251 apex {
9252 name: "myapex",
9253 key: "myapex.key",
9254 updatable: false,
9255 java_libs: ["foo"],
9256 required: ["otherapex"],
9257 }
9258
9259 apex {
9260 name: "otherapex",
9261 key: "myapex.key",
9262 updatable: false,
9263 java_libs: ["foo"],
9264 required: ["otherapex"],
9265 }
9266
9267 apex_key {
9268 name: "myapex.key",
9269 public_key: "testkey.avbpubkey",
9270 private_key: "testkey.pem",
9271 }
9272
9273 java_library {
9274 name: "foo",
9275 srcs: ["foo.java"],
9276 apex_available: ["myapex", "otherapex"],
9277 installable: true,
9278 }
9279 `)
9280
9281 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9282 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9283 var builder strings.Builder
9284 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9285 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009286 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009287}
9288
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009289func TestAndroidMk_RequiredDeps(t *testing.T) {
9290 ctx := testApex(t, `
9291 apex {
9292 name: "myapex",
9293 key: "myapex.key",
9294 updatable: false,
9295 }
9296
9297 apex_key {
9298 name: "myapex.key",
9299 public_key: "testkey.avbpubkey",
9300 private_key: "testkey.pem",
9301 }
9302 `)
9303
9304 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9305 bundle.requiredDeps = append(bundle.requiredDeps, "foo")
9306 data := android.AndroidMkDataForTest(t, ctx, bundle)
9307 var builder strings.Builder
9308 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9309 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009310 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009311
9312 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
9313 flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
9314 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9315 var flattenedBuilder strings.Builder
9316 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9317 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009318 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009319}
9320
Jooyung Hana6d36672022-02-24 13:58:07 +09009321func TestApexOutputFileProducer(t *testing.T) {
9322 for _, tc := range []struct {
9323 name string
9324 ref string
9325 expected_data []string
9326 }{
9327 {
9328 name: "test_using_output",
9329 ref: ":myapex",
9330 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9331 },
9332 {
9333 name: "test_using_apex",
9334 ref: ":myapex{.apex}",
9335 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9336 },
9337 } {
9338 t.Run(tc.name, func(t *testing.T) {
9339 ctx := testApex(t, `
9340 apex {
9341 name: "myapex",
9342 key: "myapex.key",
9343 compressible: true,
9344 updatable: false,
9345 }
9346
9347 apex_key {
9348 name: "myapex.key",
9349 public_key: "testkey.avbpubkey",
9350 private_key: "testkey.pem",
9351 }
9352
9353 java_test {
9354 name: "`+tc.name+`",
9355 srcs: ["a.java"],
9356 data: ["`+tc.ref+`"],
9357 }
9358 `,
9359 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9360 variables.CompressedApex = proptools.BoolPtr(true)
9361 }))
9362 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9363 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9364 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9365 })
9366 }
9367}
9368
satayev758968a2021-12-06 11:42:40 +00009369func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9370 preparer := android.GroupFixturePreparers(
9371 PrepareForTestWithApexBuildComponents,
9372 prepareForTestWithMyapex,
9373 java.PrepareForTestWithJavaSdkLibraryFiles,
9374 java.PrepareForTestWithJavaDefaultModules,
9375 android.PrepareForTestWithAndroidBuildComponents,
9376 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9377 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9378 )
9379
9380 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9381 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9382 preparer.RunTestWithBp(t, `
9383 apex {
9384 name: "myapex",
9385 key: "myapex.key",
9386 bootclasspath_fragments: ["mybootclasspathfragment"],
9387 min_sdk_version: "30",
9388 updatable: false,
9389 }
9390
9391 apex_key {
9392 name: "myapex.key",
9393 public_key: "testkey.avbpubkey",
9394 private_key: "testkey.pem",
9395 }
9396
9397 bootclasspath_fragment {
9398 name: "mybootclasspathfragment",
9399 contents: ["mybootclasspathlib"],
9400 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009401 hidden_api: {
9402 split_packages: ["*"],
9403 },
satayev758968a2021-12-06 11:42:40 +00009404 }
9405
9406 java_sdk_library {
9407 name: "mybootclasspathlib",
9408 srcs: ["mybootclasspathlib.java"],
9409 apex_available: ["myapex"],
9410 compile_dex: true,
9411 unsafe_ignore_missing_latest_api: true,
9412 min_sdk_version: "31",
9413 static_libs: ["util"],
9414 }
9415
9416 java_library {
9417 name: "util",
9418 srcs: ["a.java"],
9419 apex_available: ["myapex"],
9420 min_sdk_version: "31",
9421 static_libs: ["another_util"],
9422 }
9423
9424 java_library {
9425 name: "another_util",
9426 srcs: ["a.java"],
9427 min_sdk_version: "31",
9428 apex_available: ["myapex"],
9429 }
9430 `)
9431 })
9432
9433 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9434 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9435 preparer.RunTestWithBp(t, `
9436 apex {
9437 name: "myapex",
9438 key: "myapex.key",
9439 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9440 min_sdk_version: "30",
9441 updatable: false,
9442 }
9443
9444 apex_key {
9445 name: "myapex.key",
9446 public_key: "testkey.avbpubkey",
9447 private_key: "testkey.pem",
9448 }
9449
9450 systemserverclasspath_fragment {
9451 name: "mysystemserverclasspathfragment",
9452 contents: ["mysystemserverclasspathlib"],
9453 apex_available: ["myapex"],
9454 }
9455
9456 java_sdk_library {
9457 name: "mysystemserverclasspathlib",
9458 srcs: ["mysystemserverclasspathlib.java"],
9459 apex_available: ["myapex"],
9460 compile_dex: true,
9461 min_sdk_version: "32",
9462 unsafe_ignore_missing_latest_api: true,
9463 static_libs: ["util"],
9464 }
9465
9466 java_library {
9467 name: "util",
9468 srcs: ["a.java"],
9469 apex_available: ["myapex"],
9470 min_sdk_version: "31",
9471 static_libs: ["another_util"],
9472 }
9473
9474 java_library {
9475 name: "another_util",
9476 srcs: ["a.java"],
9477 min_sdk_version: "31",
9478 apex_available: ["myapex"],
9479 }
9480 `)
9481 })
9482
9483 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9484 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9485 RunTestWithBp(t, `
9486 apex {
9487 name: "myapex",
9488 key: "myapex.key",
9489 bootclasspath_fragments: ["mybootclasspathfragment"],
9490 min_sdk_version: "30",
9491 updatable: false,
9492 }
9493
9494 apex_key {
9495 name: "myapex.key",
9496 public_key: "testkey.avbpubkey",
9497 private_key: "testkey.pem",
9498 }
9499
9500 bootclasspath_fragment {
9501 name: "mybootclasspathfragment",
9502 contents: ["mybootclasspathlib"],
9503 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009504 hidden_api: {
9505 split_packages: ["*"],
9506 },
satayev758968a2021-12-06 11:42:40 +00009507 }
9508
9509 java_sdk_library {
9510 name: "mybootclasspathlib",
9511 srcs: ["mybootclasspathlib.java"],
9512 apex_available: ["myapex"],
9513 compile_dex: true,
9514 unsafe_ignore_missing_latest_api: true,
9515 }
9516 `)
9517 })
9518
9519 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9520 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9521 RunTestWithBp(t, `
9522 apex {
9523 name: "myapex",
9524 key: "myapex.key",
9525 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9526 min_sdk_version: "30",
9527 updatable: false,
9528 }
9529
9530 apex_key {
9531 name: "myapex.key",
9532 public_key: "testkey.avbpubkey",
9533 private_key: "testkey.pem",
9534 }
9535
9536 systemserverclasspath_fragment {
9537 name: "mysystemserverclasspathfragment",
9538 contents: ["mysystemserverclasspathlib"],
9539 apex_available: ["myapex"],
9540 }
9541
9542 java_sdk_library {
9543 name: "mysystemserverclasspathlib",
9544 srcs: ["mysystemserverclasspathlib.java"],
9545 apex_available: ["myapex"],
9546 compile_dex: true,
9547 unsafe_ignore_missing_latest_api: true,
9548 }
9549 `)
9550 })
9551}
9552
Jiakai Zhang6decef92022-01-12 17:56:19 +00009553// Verifies that the APEX depends on all the Make modules in the list.
9554func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9555 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9556 for _, dep := range deps {
9557 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9558 }
9559}
9560
9561// Verifies that the APEX does not depend on any of the Make modules in the list.
9562func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9563 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9564 for _, dep := range deps {
9565 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9566 }
9567}
9568
Spandan Das66773252022-01-15 00:23:18 +00009569func TestApexStrictUpdtabilityLint(t *testing.T) {
9570 bpTemplate := `
9571 apex {
9572 name: "myapex",
9573 key: "myapex.key",
9574 java_libs: ["myjavalib"],
9575 updatable: %v,
9576 min_sdk_version: "29",
9577 }
9578 apex_key {
9579 name: "myapex.key",
9580 }
9581 java_library {
9582 name: "myjavalib",
9583 srcs: ["MyClass.java"],
9584 apex_available: [ "myapex" ],
9585 lint: {
9586 strict_updatability_linting: %v,
9587 },
9588 sdk_version: "current",
9589 min_sdk_version: "29",
9590 }
9591 `
9592 fs := android.MockFS{
9593 "lint-baseline.xml": nil,
9594 }
9595
9596 testCases := []struct {
9597 testCaseName string
9598 apexUpdatable bool
9599 javaStrictUpdtabilityLint bool
9600 lintFileExists bool
9601 disallowedFlagExpected bool
9602 }{
9603 {
9604 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9605 apexUpdatable: true,
9606 javaStrictUpdtabilityLint: true,
9607 lintFileExists: false,
9608 disallowedFlagExpected: false,
9609 },
9610 {
9611 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9612 apexUpdatable: false,
9613 javaStrictUpdtabilityLint: false,
9614 lintFileExists: true,
9615 disallowedFlagExpected: false,
9616 },
9617 {
9618 testCaseName: "non-updatable apex respects strict updatability of javalib",
9619 apexUpdatable: false,
9620 javaStrictUpdtabilityLint: true,
9621 lintFileExists: true,
9622 disallowedFlagExpected: true,
9623 },
9624 {
9625 testCaseName: "updatable apex sets strict updatability of javalib to true",
9626 apexUpdatable: true,
9627 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9628 lintFileExists: true,
9629 disallowedFlagExpected: true,
9630 },
9631 }
9632
9633 for _, testCase := range testCases {
9634 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9635 fixtures := []android.FixturePreparer{}
9636 if testCase.lintFileExists {
9637 fixtures = append(fixtures, fs.AddToFixture())
9638 }
9639
9640 result := testApex(t, bp, fixtures...)
9641 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9642 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9643 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9644
9645 if disallowedFlagActual != testCase.disallowedFlagExpected {
9646 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9647 }
9648 }
9649}
9650
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009651func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9652 bp := `
9653 apex {
9654 name: "myapex",
9655 key: "myapex.key",
9656 java_libs: ["myjavalib"],
9657 updatable: true,
9658 min_sdk_version: "29",
9659 }
9660 apex_key {
9661 name: "myapex.key",
9662 }
9663 java_library {
9664 name: "myjavalib",
9665 srcs: ["MyClass.java"],
9666 apex_available: [ "myapex" ],
9667 sdk_version: "current",
9668 min_sdk_version: "29",
9669 }
9670 `
9671
9672 testCases := []struct {
9673 testCaseName string
9674 moduleDirectory string
9675 disallowedFlagExpected bool
9676 }{
9677 {
9678 testCaseName: "lintable module defined outside libcore",
9679 moduleDirectory: "",
9680 disallowedFlagExpected: true,
9681 },
9682 {
9683 testCaseName: "lintable module defined in libcore root directory",
9684 moduleDirectory: "libcore/",
9685 disallowedFlagExpected: false,
9686 },
9687 {
9688 testCaseName: "lintable module defined in libcore child directory",
9689 moduleDirectory: "libcore/childdir/",
9690 disallowedFlagExpected: true,
9691 },
9692 }
9693
9694 for _, testCase := range testCases {
9695 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9696 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9697 result := testApex(t, "", lintFileCreator, bpFileCreator)
9698 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9699 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9700 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9701 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9702
9703 if disallowedFlagActual != testCase.disallowedFlagExpected {
9704 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9705 }
9706 }
9707}
9708
Spandan Das66773252022-01-15 00:23:18 +00009709// checks transtive deps of an apex coming from bootclasspath_fragment
9710func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9711 bp := `
9712 apex {
9713 name: "myapex",
9714 key: "myapex.key",
9715 bootclasspath_fragments: ["mybootclasspathfragment"],
9716 updatable: true,
9717 min_sdk_version: "29",
9718 }
9719 apex_key {
9720 name: "myapex.key",
9721 }
9722 bootclasspath_fragment {
9723 name: "mybootclasspathfragment",
9724 contents: ["myjavalib"],
9725 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009726 hidden_api: {
9727 split_packages: ["*"],
9728 },
Spandan Das66773252022-01-15 00:23:18 +00009729 }
9730 java_library {
9731 name: "myjavalib",
9732 srcs: ["MyClass.java"],
9733 apex_available: [ "myapex" ],
9734 sdk_version: "current",
9735 min_sdk_version: "29",
9736 compile_dex: true,
9737 }
9738 `
9739 fs := android.MockFS{
9740 "lint-baseline.xml": nil,
9741 }
9742
9743 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9744 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9745 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9746 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9747 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9748 }
9749}
9750
Spandan Das42e89502022-05-06 22:12:55 +00009751// updatable apexes should propagate updatable=true to its apps
9752func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9753 bp := `
9754 apex {
9755 name: "myapex",
9756 key: "myapex.key",
9757 updatable: %v,
9758 apps: [
9759 "myapp",
9760 ],
9761 min_sdk_version: "30",
9762 }
9763 apex_key {
9764 name: "myapex.key",
9765 }
9766 android_app {
9767 name: "myapp",
9768 updatable: %v,
9769 apex_available: [
9770 "myapex",
9771 ],
9772 sdk_version: "current",
9773 min_sdk_version: "30",
9774 }
9775 `
9776 testCases := []struct {
9777 name string
9778 apex_is_updatable_bp bool
9779 app_is_updatable_bp bool
9780 app_is_updatable_expected bool
9781 }{
9782 {
9783 name: "Non-updatable apex respects updatable property of non-updatable app",
9784 apex_is_updatable_bp: false,
9785 app_is_updatable_bp: false,
9786 app_is_updatable_expected: false,
9787 },
9788 {
9789 name: "Non-updatable apex respects updatable property of updatable app",
9790 apex_is_updatable_bp: false,
9791 app_is_updatable_bp: true,
9792 app_is_updatable_expected: true,
9793 },
9794 {
9795 name: "Updatable apex respects updatable property of updatable app",
9796 apex_is_updatable_bp: true,
9797 app_is_updatable_bp: true,
9798 app_is_updatable_expected: true,
9799 },
9800 {
9801 name: "Updatable apex sets updatable=true on non-updatable app",
9802 apex_is_updatable_bp: true,
9803 app_is_updatable_bp: false,
9804 app_is_updatable_expected: true,
9805 },
9806 }
9807 for _, testCase := range testCases {
9808 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9809 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9810 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9811 }
9812}
9813
Kiyoung Kim487689e2022-07-26 09:48:22 +09009814func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9815 bp := `
9816 apex {
9817 name: "myapex",
9818 key: "myapex.key",
9819 native_shared_libs: ["libfoo"],
9820 min_sdk_version: "29",
9821 }
9822 apex_key {
9823 name: "myapex.key",
9824 }
9825 cc_library {
9826 name: "libfoo",
9827 shared_libs: ["libc"],
9828 apex_available: ["myapex"],
9829 min_sdk_version: "29",
9830 }
9831 cc_api_library {
9832 name: "libc",
9833 src: "libc.so",
9834 min_sdk_version: "29",
9835 recovery_available: true,
9836 }
9837 api_imports {
9838 name: "api_imports",
9839 shared_libs: [
9840 "libc",
9841 ],
9842 header_libs: [],
9843 }
9844 `
9845 result := testApex(t, bp)
9846
9847 hasDep := func(m android.Module, wantDep android.Module) bool {
9848 t.Helper()
9849 var found bool
9850 result.VisitDirectDeps(m, func(dep blueprint.Module) {
9851 if dep == wantDep {
9852 found = true
9853 }
9854 })
9855 return found
9856 }
9857
9858 libfooApexVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex29").Module()
9859 libcApexVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared_apex29").Module()
9860
9861 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(libfooApexVariant, libcApexVariant))
9862
9863 // libfoo core variant should be buildable in the same inner tree since
9864 // certain mcombo files might build system and apexes in the same inner tree
9865 // libfoo core variant should link against source libc
9866 libfooCoreVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module()
9867 libcCoreVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared").Module()
9868 android.AssertBoolEquals(t, "core variant should link against source libc", true, hasDep(libfooCoreVariant, libcCoreVariant))
9869}