blob: f9ff0b9df33d2416528acdf1313a0cbfeff870c4 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Kiyoung Kim487689e2022-07-26 09:48:22 +090028 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090029 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090036 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090037 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070038 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090039)
40
Jooyung Hand3639552019-08-09 12:57:43 +090041// names returns name list from white space separated string
42func names(s string) (ns []string) {
43 for _, n := range strings.Split(s, " ") {
44 if len(n) > 0 {
45 ns = append(ns, n)
46 }
47 }
48 return
49}
50
Paul Duffin40b62572021-03-20 11:39:01 +000051func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090052 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010053 android.GroupFixturePreparers(
54 prepareForApexTest,
55 android.GroupFixturePreparers(preparers...),
56 ).
Paul Duffine05480a2021-03-08 15:07:14 +000057 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000058 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090059}
60
Paul Duffin40b62572021-03-20 11:39:01 +000061func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090062 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010063
64 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000065 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010066 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000067 }
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 result := android.GroupFixturePreparers(
70 prepareForApexTest,
71 android.GroupFixturePreparers(preparers...),
72 optionalBpPreparer,
73 ).RunTest(t)
74
Paul Duffine05480a2021-03-08 15:07:14 +000075 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090076}
77
Paul Duffin810f33d2021-03-09 14:12:32 +000078func withFiles(files android.MockFS) android.FixturePreparer {
79 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090080}
81
Paul Duffin810f33d2021-03-09 14:12:32 +000082func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
83 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090084 for k, v := range targets {
85 config.Targets[k] = v
86 }
Paul Duffin810f33d2021-03-09 14:12:32 +000087 })
Jooyung Han344d5432019-08-23 11:17:39 +090088}
89
Jooyung Han35155c42020-02-06 17:33:20 +090090// withNativeBridgeTargets sets configuration with targets including:
91// - X86_64 (primary)
92// - X86 (secondary)
93// - Arm64 on X86_64 (native bridge)
94// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000095var withNativeBridgeEnabled = android.FixtureModifyConfig(
96 func(config android.Config) {
97 config.Targets[android.Android] = []android.Target{
98 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
99 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
100 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
101 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
102 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
103 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
104 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
105 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
106 }
107 },
108)
109
110func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
111 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
112 variables.ManifestPackageNameOverrides = specs
113 })
Jooyung Han35155c42020-02-06 17:33:20 +0900114}
115
Albert Martineefabcf2022-03-21 20:11:16 +0000116func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
117 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
118 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
119 })
120}
121
Paul Duffin810f33d2021-03-09 14:12:32 +0000122var withBinder32bit = android.FixtureModifyProductVariables(
123 func(variables android.FixtureProductVariables) {
124 variables.Binder32bit = proptools.BoolPtr(true)
125 },
126)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900127
Paul Duffin810f33d2021-03-09 14:12:32 +0000128var withUnbundledBuild = android.FixtureModifyProductVariables(
129 func(variables android.FixtureProductVariables) {
130 variables.Unbundled_build = proptools.BoolPtr(true)
131 },
132)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900133
Paul Duffin284165a2021-03-29 01:50:31 +0100134// Legacy preparer used for running tests within the apex package.
135//
136// This includes everything that was needed to run any test in the apex package prior to the
137// introduction of the test fixtures. Tests that are being converted to use fixtures directly
138// rather than through the testApex...() methods should avoid using this and instead use the
139// various preparers directly, using android.GroupFixturePreparers(...) to group them when
140// necessary.
141//
142// deprecated
143var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000144 // General preparers in alphabetical order as test infrastructure will enforce correct
145 // registration order.
146 android.PrepareForTestWithAndroidBuildComponents,
147 bpf.PrepareForTestWithBpf,
148 cc.PrepareForTestWithCcBuildComponents,
149 java.PrepareForTestWithJavaDefaultModules,
150 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
151 rust.PrepareForTestWithRustDefaultModules,
152 sh.PrepareForTestWithShBuildComponents,
153
154 PrepareForTestWithApexBuildComponents,
155
156 // Additional apex test specific preparers.
157 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
158 filegroup {
159 name: "myapex-file_contexts",
160 srcs: [
161 "apex/myapex-file_contexts",
162 ],
163 }
164 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000165 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000166 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000167 "a.java": nil,
168 "PrebuiltAppFoo.apk": nil,
169 "PrebuiltAppFooPriv.apk": nil,
170 "apex_manifest.json": nil,
171 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000172 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
173 "system/sepolicy/apex/myapex2-file_contexts": nil,
174 "system/sepolicy/apex/otherapex-file_contexts": nil,
175 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
176 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700177 "mylib.cpp": nil,
178 "mytest.cpp": nil,
179 "mytest1.cpp": nil,
180 "mytest2.cpp": nil,
181 "mytest3.cpp": nil,
182 "myprebuilt": nil,
183 "my_include": nil,
184 "foo/bar/MyClass.java": nil,
185 "prebuilt.jar": nil,
186 "prebuilt.so": nil,
187 "vendor/foo/devkeys/test.x509.pem": nil,
188 "vendor/foo/devkeys/test.pk8": nil,
189 "testkey.x509.pem": nil,
190 "testkey.pk8": nil,
191 "testkey.override.x509.pem": nil,
192 "testkey.override.pk8": nil,
193 "vendor/foo/devkeys/testkey.avbpubkey": nil,
194 "vendor/foo/devkeys/testkey.pem": nil,
195 "NOTICE": nil,
196 "custom_notice": nil,
197 "custom_notice_for_static_lib": nil,
198 "testkey2.avbpubkey": nil,
199 "testkey2.pem": nil,
200 "myapex-arm64.apex": nil,
201 "myapex-arm.apex": nil,
202 "myapex.apks": nil,
203 "frameworks/base/api/current.txt": nil,
204 "framework/aidl/a.aidl": nil,
205 "dummy.txt": nil,
206 "baz": nil,
207 "bar/baz": nil,
208 "testdata/baz": nil,
209 "AppSet.apks": nil,
210 "foo.rs": nil,
211 "libfoo.jar": nil,
212 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000213 },
214 ),
215
216 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
217 variables.DeviceVndkVersion = proptools.StringPtr("current")
218 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
219 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
220 variables.Platform_sdk_codename = proptools.StringPtr("Q")
221 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000222 // "Tiramisu" needs to be in the next line for compatibility with soong code,
223 // not because of these tests specifically (it's not used by the tests)
224 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900225 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000226 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000227 }),
228)
229
Paul Duffin52bfaa42021-03-23 23:40:12 +0000230var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
231 "system/sepolicy/apex/myapex-file_contexts": nil,
232})
233
Jooyung Han643adc42020-02-27 13:50:06 +0900234// ensure that 'result' equals 'expected'
235func ensureEquals(t *testing.T, result string, expected string) {
236 t.Helper()
237 if result != expected {
238 t.Errorf("%q != %q", expected, result)
239 }
240}
241
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242// ensure that 'result' contains 'expected'
243func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900244 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900245 if !strings.Contains(result, expected) {
246 t.Errorf("%q is not found in %q", expected, result)
247 }
248}
249
Liz Kammer5bd365f2020-05-27 15:15:11 -0700250// ensure that 'result' contains 'expected' exactly one time
251func ensureContainsOnce(t *testing.T, result string, expected string) {
252 t.Helper()
253 count := strings.Count(result, expected)
254 if count != 1 {
255 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
256 }
257}
258
Jiyong Park25fc6a92018-11-18 18:02:45 +0900259// ensures that 'result' does not contain 'notExpected'
260func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900261 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900262 if strings.Contains(result, notExpected) {
263 t.Errorf("%q is found in %q", notExpected, result)
264 }
265}
266
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700267func ensureMatches(t *testing.T, result string, expectedRex string) {
268 ok, err := regexp.MatchString(expectedRex, result)
269 if err != nil {
270 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
271 return
272 }
273 if !ok {
274 t.Errorf("%s does not match regular expession %s", result, expectedRex)
275 }
276}
277
Jiyong Park25fc6a92018-11-18 18:02:45 +0900278func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900279 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900280 if !android.InList(expected, result) {
281 t.Errorf("%q is not found in %v", expected, result)
282 }
283}
284
285func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900286 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900287 if android.InList(notExpected, result) {
288 t.Errorf("%q is found in %v", notExpected, result)
289 }
290}
291
Jooyung Hane1633032019-08-01 17:41:43 +0900292func ensureListEmpty(t *testing.T, result []string) {
293 t.Helper()
294 if len(result) > 0 {
295 t.Errorf("%q is expected to be empty", result)
296 }
297}
298
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000299func ensureListNotEmpty(t *testing.T, result []string) {
300 t.Helper()
301 if len(result) == 0 {
302 t.Errorf("%q is expected to be not empty", result)
303 }
304}
305
Jiyong Park25fc6a92018-11-18 18:02:45 +0900306// Minimal test
307func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800308 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900309 apex_defaults {
310 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900311 manifest: ":myapex.manifest",
312 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900313 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900314 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900315 native_shared_libs: [
316 "mylib",
317 "libfoo.ffi",
318 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900319 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800320 multilib: {
321 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900322 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800323 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900324 },
Jiyong Park77acec62020-06-01 21:39:15 +0900325 java_libs: [
326 "myjar",
327 "myjar_dex",
328 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000329 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900330 }
331
Jiyong Park30ca9372019-02-07 16:27:23 +0900332 apex {
333 name: "myapex",
334 defaults: ["myapex-defaults"],
335 }
336
Jiyong Park25fc6a92018-11-18 18:02:45 +0900337 apex_key {
338 name: "myapex.key",
339 public_key: "testkey.avbpubkey",
340 private_key: "testkey.pem",
341 }
342
Jiyong Park809bb722019-02-13 21:33:49 +0900343 filegroup {
344 name: "myapex.manifest",
345 srcs: ["apex_manifest.json"],
346 }
347
348 filegroup {
349 name: "myapex.androidmanifest",
350 srcs: ["AndroidManifest.xml"],
351 }
352
Jiyong Park25fc6a92018-11-18 18:02:45 +0900353 cc_library {
354 name: "mylib",
355 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900356 shared_libs: [
357 "mylib2",
358 "libbar.ffi",
359 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900360 system_shared_libs: [],
361 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000362 // TODO: remove //apex_available:platform
363 apex_available: [
364 "//apex_available:platform",
365 "myapex",
366 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900367 }
368
Alex Light3d673592019-01-18 14:37:31 -0800369 cc_binary {
370 name: "foo",
371 srcs: ["mylib.cpp"],
372 compile_multilib: "both",
373 multilib: {
374 lib32: {
375 suffix: "32",
376 },
377 lib64: {
378 suffix: "64",
379 },
380 },
381 symlinks: ["foo_link_"],
382 symlink_preferred_arch: true,
383 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800384 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700385 apex_available: [ "myapex", "com.android.gki.*" ],
386 }
387
Jiyong Park99644e92020-11-17 22:21:02 +0900388 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000389 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900390 srcs: ["foo.rs"],
391 rlibs: ["libfoo.rlib.rust"],
392 dylibs: ["libfoo.dylib.rust"],
393 apex_available: ["myapex"],
394 }
395
396 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000397 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900398 srcs: ["foo.rs"],
399 crate_name: "foo",
400 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900401 shared_libs: ["libfoo.shared_from_rust"],
402 }
403
404 cc_library_shared {
405 name: "libfoo.shared_from_rust",
406 srcs: ["mylib.cpp"],
407 system_shared_libs: [],
408 stl: "none",
409 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900410 }
411
412 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000413 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900414 srcs: ["foo.rs"],
415 crate_name: "foo",
416 apex_available: ["myapex"],
417 }
418
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900419 rust_ffi_shared {
420 name: "libfoo.ffi",
421 srcs: ["foo.rs"],
422 crate_name: "foo",
423 apex_available: ["myapex"],
424 }
425
426 rust_ffi_shared {
427 name: "libbar.ffi",
428 srcs: ["foo.rs"],
429 crate_name: "bar",
430 apex_available: ["myapex"],
431 }
432
Yifan Hongd22a84a2020-07-28 17:37:46 -0700433 apex {
434 name: "com.android.gki.fake",
435 binaries: ["foo"],
436 key: "myapex.key",
437 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000438 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800439 }
440
Paul Duffindddd5462020-04-07 15:25:44 +0100441 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900442 name: "mylib2",
443 srcs: ["mylib.cpp"],
444 system_shared_libs: [],
445 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900446 static_libs: ["libstatic"],
447 // TODO: remove //apex_available:platform
448 apex_available: [
449 "//apex_available:platform",
450 "myapex",
451 ],
452 }
453
Paul Duffindddd5462020-04-07 15:25:44 +0100454 cc_prebuilt_library_shared {
455 name: "mylib2",
456 srcs: ["prebuilt.so"],
457 // TODO: remove //apex_available:platform
458 apex_available: [
459 "//apex_available:platform",
460 "myapex",
461 ],
462 }
463
Jiyong Park9918e1a2020-03-17 19:16:40 +0900464 cc_library_static {
465 name: "libstatic",
466 srcs: ["mylib.cpp"],
467 system_shared_libs: [],
468 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000469 // TODO: remove //apex_available:platform
470 apex_available: [
471 "//apex_available:platform",
472 "myapex",
473 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900474 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900475
476 java_library {
477 name: "myjar",
478 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900479 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900480 sdk_version: "none",
481 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900482 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900483 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000484 // TODO: remove //apex_available:platform
485 apex_available: [
486 "//apex_available:platform",
487 "myapex",
488 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900489 }
490
Jiyong Park77acec62020-06-01 21:39:15 +0900491 dex_import {
492 name: "myjar_dex",
493 jars: ["prebuilt.jar"],
494 apex_available: [
495 "//apex_available:platform",
496 "myapex",
497 ],
498 }
499
Jiyong Park7f7766d2019-07-25 22:02:35 +0900500 java_library {
501 name: "myotherjar",
502 srcs: ["foo/bar/MyClass.java"],
503 sdk_version: "none",
504 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900505 // TODO: remove //apex_available:platform
506 apex_available: [
507 "//apex_available:platform",
508 "myapex",
509 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900510 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900511
512 java_library {
513 name: "mysharedjar",
514 srcs: ["foo/bar/MyClass.java"],
515 sdk_version: "none",
516 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900517 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900518 `)
519
Paul Duffina71a67a2021-03-29 00:42:57 +0100520 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900521
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900522 // Make sure that Android.mk is created
523 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700524 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900525 var builder strings.Builder
526 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
527
528 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000529 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900530 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
531
Jiyong Park42cca6c2019-04-01 11:15:50 +0900532 optFlags := apexRule.Args["opt_flags"]
533 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700534 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100535 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900536
Jiyong Park25fc6a92018-11-18 18:02:45 +0900537 copyCmds := apexRule.Args["copy_commands"]
538
539 // Ensure that main rule creates an output
540 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
541
542 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700543 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
544 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900546 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900547 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900548
549 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700550 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
551 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900552 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
553 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900554 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900556
557 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800558 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
559 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900560 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900561 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900562 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900563 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
564 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900565 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900566 // .. but not for java libs
567 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900568 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800569
Colin Cross7113d202019-11-20 16:39:12 -0800570 // Ensure that the platform variant ends with _shared or _common
571 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
572 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900573 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
574 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900575 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
576
577 // Ensure that dynamic dependency to java libs are not included
578 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800579
580 // Ensure that all symlinks are present.
581 found_foo_link_64 := false
582 found_foo := false
583 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900584 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800585 if strings.HasSuffix(cmd, "bin/foo") {
586 found_foo = true
587 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
588 found_foo_link_64 = true
589 }
590 }
591 }
592 good := found_foo && found_foo_link_64
593 if !good {
594 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
595 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900596
Artur Satayeva8bd1132020-04-27 18:07:06 +0100597 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100598 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
600 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
601 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100602
603 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100604 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
606 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
607 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800608}
609
Jooyung Hanf21c7972019-12-16 22:32:06 +0900610func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800611 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900612 apex_defaults {
613 name: "myapex-defaults",
614 key: "myapex.key",
615 prebuilts: ["myetc"],
616 native_shared_libs: ["mylib"],
617 java_libs: ["myjar"],
618 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900619 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800620 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000621 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900622 }
623
624 prebuilt_etc {
625 name: "myetc",
626 src: "myprebuilt",
627 }
628
629 apex {
630 name: "myapex",
631 defaults: ["myapex-defaults"],
632 }
633
634 apex_key {
635 name: "myapex.key",
636 public_key: "testkey.avbpubkey",
637 private_key: "testkey.pem",
638 }
639
640 cc_library {
641 name: "mylib",
642 system_shared_libs: [],
643 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000644 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900645 }
646
647 java_library {
648 name: "myjar",
649 srcs: ["foo/bar/MyClass.java"],
650 sdk_version: "none",
651 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000652 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900653 }
654
655 android_app {
656 name: "AppFoo",
657 srcs: ["foo/bar/MyClass.java"],
658 sdk_version: "none",
659 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000660 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900661 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900662
663 runtime_resource_overlay {
664 name: "rro",
665 theme: "blue",
666 }
667
markchien2f59ec92020-09-02 16:23:38 +0800668 bpf {
669 name: "bpf",
670 srcs: ["bpf.c", "bpf2.c"],
671 }
672
Ken Chenfad7f9d2021-11-10 22:02:57 +0800673 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800674 name: "netdTest",
675 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800676 sub_dir: "netd",
677 }
678
Jooyung Hanf21c7972019-12-16 22:32:06 +0900679 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000680 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900681 "etc/myetc",
682 "javalib/myjar.jar",
683 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000684 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900685 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800686 "etc/bpf/bpf.o",
687 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800688 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900689 })
690}
691
Jooyung Han01a3ee22019-11-02 02:52:25 +0900692func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800693 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900694 apex {
695 name: "myapex",
696 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000697 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900698 }
699
700 apex_key {
701 name: "myapex.key",
702 public_key: "testkey.avbpubkey",
703 private_key: "testkey.pem",
704 }
705 `)
706
707 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900708 args := module.Rule("apexRule").Args
709 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
710 t.Error("manifest should be apex_manifest.pb, but " + manifest)
711 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900712}
713
Liz Kammer4854a7d2021-05-27 14:28:27 -0400714func TestApexManifestMinSdkVersion(t *testing.T) {
715 ctx := testApex(t, `
716 apex_defaults {
717 name: "my_defaults",
718 key: "myapex.key",
719 product_specific: true,
720 file_contexts: ":my-file-contexts",
721 updatable: false,
722 }
723 apex {
724 name: "myapex_30",
725 min_sdk_version: "30",
726 defaults: ["my_defaults"],
727 }
728
729 apex {
730 name: "myapex_current",
731 min_sdk_version: "current",
732 defaults: ["my_defaults"],
733 }
734
735 apex {
736 name: "myapex_none",
737 defaults: ["my_defaults"],
738 }
739
740 apex_key {
741 name: "myapex.key",
742 public_key: "testkey.avbpubkey",
743 private_key: "testkey.pem",
744 }
745
746 filegroup {
747 name: "my-file-contexts",
748 srcs: ["product_specific_file_contexts"],
749 }
750 `, withFiles(map[string][]byte{
751 "product_specific_file_contexts": nil,
752 }), android.FixtureModifyProductVariables(
753 func(variables android.FixtureProductVariables) {
754 variables.Unbundled_build = proptools.BoolPtr(true)
755 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
756 }), android.FixtureMergeEnv(map[string]string{
757 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
758 }))
759
760 testCases := []struct {
761 module string
762 minSdkVersion string
763 }{
764 {
765 module: "myapex_30",
766 minSdkVersion: "30",
767 },
768 {
769 module: "myapex_current",
770 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
771 },
772 {
773 module: "myapex_none",
774 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
775 },
776 }
777 for _, tc := range testCases {
778 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
779 args := module.Rule("apexRule").Args
780 optFlags := args["opt_flags"]
781 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
782 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
783 }
784 }
785}
786
Jooyung Hanaf730952023-02-28 14:13:38 +0900787func TestFileContexts(t *testing.T) {
788 for _, useFileContextsAsIs := range []bool{true, false} {
789 prop := ""
790 if useFileContextsAsIs {
791 prop = "use_file_contexts_as_is: true,\n"
792 }
793 ctx := testApex(t, `
794 apex {
795 name: "myapex",
796 key: "myapex.key",
797 file_contexts: "file_contexts",
798 updatable: false,
799 vendor: true,
800 `+prop+`
801 }
802
803 apex_key {
804 name: "myapex.key",
805 public_key: "testkey.avbpubkey",
806 private_key: "testkey.pem",
807 }
808 `, withFiles(map[string][]byte{
809 "file_contexts": nil,
810 }))
811
812 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("file_contexts")
813 forceLabellingCommand := "apex_manifest\\\\.pb u:object_r:system_file:s0"
814 if useFileContextsAsIs {
815 android.AssertStringDoesNotContain(t, "should force-label",
816 rule.RuleParams.Command, forceLabellingCommand)
817 } else {
818 android.AssertStringDoesContain(t, "shouldn't force-label",
819 rule.RuleParams.Command, forceLabellingCommand)
820 }
821 }
822}
823
Alex Light5098a612018-11-29 17:12:15 -0800824func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800825 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800826 apex {
827 name: "myapex",
828 key: "myapex.key",
829 payload_type: "zip",
830 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000831 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800832 }
833
834 apex_key {
835 name: "myapex.key",
836 public_key: "testkey.avbpubkey",
837 private_key: "testkey.pem",
838 }
839
840 cc_library {
841 name: "mylib",
842 srcs: ["mylib.cpp"],
843 shared_libs: ["mylib2"],
844 system_shared_libs: [],
845 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000846 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800847 }
848
849 cc_library {
850 name: "mylib2",
851 srcs: ["mylib.cpp"],
852 system_shared_libs: [],
853 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000854 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800855 }
856 `)
857
Sundong Ahnabb64432019-10-22 13:58:29 +0900858 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800859 copyCmds := zipApexRule.Args["copy_commands"]
860
861 // Ensure that main rule creates an output
862 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
863
864 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700865 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800866
867 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700868 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800869
870 // Ensure that both direct and indirect deps are copied into apex
871 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
872 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900873}
874
875func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800876 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900877 apex {
878 name: "myapex",
879 key: "myapex.key",
880 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900881 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000882 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900883 }
884
885 apex_key {
886 name: "myapex.key",
887 public_key: "testkey.avbpubkey",
888 private_key: "testkey.pem",
889 }
890
891 cc_library {
892 name: "mylib",
893 srcs: ["mylib.cpp"],
894 shared_libs: ["mylib2", "mylib3"],
895 system_shared_libs: [],
896 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000897 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900898 }
899
900 cc_library {
901 name: "mylib2",
902 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900903 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900904 system_shared_libs: [],
905 stl: "none",
906 stubs: {
907 versions: ["1", "2", "3"],
908 },
909 }
910
911 cc_library {
912 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900913 srcs: ["mylib.cpp"],
914 shared_libs: ["mylib4"],
915 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900916 stl: "none",
917 stubs: {
918 versions: ["10", "11", "12"],
919 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000920 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900922
923 cc_library {
924 name: "mylib4",
925 srcs: ["mylib.cpp"],
926 system_shared_libs: [],
927 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000928 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900929 }
Jiyong Park105dc322021-06-11 17:22:09 +0900930
931 rust_binary {
932 name: "foo.rust",
933 srcs: ["foo.rs"],
934 shared_libs: ["libfoo.shared_from_rust"],
935 prefer_rlib: true,
936 apex_available: ["myapex"],
937 }
938
939 cc_library_shared {
940 name: "libfoo.shared_from_rust",
941 srcs: ["mylib.cpp"],
942 system_shared_libs: [],
943 stl: "none",
944 stubs: {
945 versions: ["10", "11", "12"],
946 },
947 }
948
Jiyong Park25fc6a92018-11-18 18:02:45 +0900949 `)
950
Sundong Ahnabb64432019-10-22 13:58:29 +0900951 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900952 copyCmds := apexRule.Args["copy_commands"]
953
954 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800955 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900956
957 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800958 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900959
960 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800961 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900962
Colin Crossaede88c2020-08-11 12:17:01 -0700963 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900964
965 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900966 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900967 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900968 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900969
970 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700971 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900972 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700973 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900974
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700975 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
976 // is replaced by sharing of "cFlags" in cc/builder.go.
977 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
978 // module variable representing "cflags". So it was not detected by ensureNotContains.
979 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
980 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
981 // including the original cflags's "-include mylib.h".
982 //
Jiyong Park64379952018-12-13 18:37:29 +0900983 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700984 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
985 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900986
Jiyong Park85cc35a2022-07-17 11:30:47 +0900987 // Ensure that genstub for platform-provided lib is invoked with --systemapi
988 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
989 // Ensure that genstub for apex-provided lib is invoked with --apex
990 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900991
Jooyung Hana57af4a2020-01-23 05:36:59 +0000992 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900993 "lib64/mylib.so",
994 "lib64/mylib3.so",
995 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900996 "bin/foo.rust",
997 "lib64/libc++.so", // by the implicit dependency from foo.rust
998 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900999 })
Jiyong Park105dc322021-06-11 17:22:09 +09001000
1001 // Ensure that stub dependency from a rust module is not included
1002 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1003 // The rust module is linked to the stub cc library
Peter Collingbournee7c71c32023-03-31 20:21:19 -07001004 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001005 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1006 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001007
1008 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1009 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001010}
1011
Jiyong Park1bc84122021-06-22 20:23:05 +09001012func TestApexCanUsePrivateApis(t *testing.T) {
1013 ctx := testApex(t, `
1014 apex {
1015 name: "myapex",
1016 key: "myapex.key",
1017 native_shared_libs: ["mylib"],
1018 binaries: ["foo.rust"],
1019 updatable: false,
1020 platform_apis: true,
1021 }
1022
1023 apex_key {
1024 name: "myapex.key",
1025 public_key: "testkey.avbpubkey",
1026 private_key: "testkey.pem",
1027 }
1028
1029 cc_library {
1030 name: "mylib",
1031 srcs: ["mylib.cpp"],
1032 shared_libs: ["mylib2"],
1033 system_shared_libs: [],
1034 stl: "none",
1035 apex_available: [ "myapex" ],
1036 }
1037
1038 cc_library {
1039 name: "mylib2",
1040 srcs: ["mylib.cpp"],
1041 cflags: ["-include mylib.h"],
1042 system_shared_libs: [],
1043 stl: "none",
1044 stubs: {
1045 versions: ["1", "2", "3"],
1046 },
1047 }
1048
1049 rust_binary {
1050 name: "foo.rust",
1051 srcs: ["foo.rs"],
1052 shared_libs: ["libfoo.shared_from_rust"],
1053 prefer_rlib: true,
1054 apex_available: ["myapex"],
1055 }
1056
1057 cc_library_shared {
1058 name: "libfoo.shared_from_rust",
1059 srcs: ["mylib.cpp"],
1060 system_shared_libs: [],
1061 stl: "none",
1062 stubs: {
1063 versions: ["10", "11", "12"],
1064 },
1065 }
1066 `)
1067
1068 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1069 copyCmds := apexRule.Args["copy_commands"]
1070
1071 // Ensure that indirect stubs dep is not included
1072 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1073 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1074
1075 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1076 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001077 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001078 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1079 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Peter Collingbournee7c71c32023-03-31 20:21:19 -07001080 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001081 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1082 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1083}
1084
Colin Cross7812fd32020-09-25 12:35:10 -07001085func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1086 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001087 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001088 apex {
1089 name: "myapex",
1090 key: "myapex.key",
1091 native_shared_libs: ["mylib", "mylib3"],
1092 min_sdk_version: "29",
1093 }
1094
1095 apex_key {
1096 name: "myapex.key",
1097 public_key: "testkey.avbpubkey",
1098 private_key: "testkey.pem",
1099 }
1100
1101 cc_library {
1102 name: "mylib",
1103 srcs: ["mylib.cpp"],
1104 shared_libs: ["mylib2", "mylib3"],
1105 system_shared_libs: [],
1106 stl: "none",
1107 apex_available: [ "myapex" ],
1108 min_sdk_version: "28",
1109 }
1110
1111 cc_library {
1112 name: "mylib2",
1113 srcs: ["mylib.cpp"],
1114 cflags: ["-include mylib.h"],
1115 system_shared_libs: [],
1116 stl: "none",
1117 stubs: {
1118 versions: ["28", "29", "30", "current"],
1119 },
1120 min_sdk_version: "28",
1121 }
1122
1123 cc_library {
1124 name: "mylib3",
1125 srcs: ["mylib.cpp"],
1126 shared_libs: ["mylib4"],
1127 system_shared_libs: [],
1128 stl: "none",
1129 stubs: {
1130 versions: ["28", "29", "30", "current"],
1131 },
1132 apex_available: [ "myapex" ],
1133 min_sdk_version: "28",
1134 }
1135
1136 cc_library {
1137 name: "mylib4",
1138 srcs: ["mylib.cpp"],
1139 system_shared_libs: [],
1140 stl: "none",
1141 apex_available: [ "myapex" ],
1142 min_sdk_version: "28",
1143 }
1144 `)
1145
1146 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1147 copyCmds := apexRule.Args["copy_commands"]
1148
1149 // Ensure that direct non-stubs dep is always included
1150 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1151
1152 // Ensure that indirect stubs dep is not included
1153 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1154
1155 // Ensure that direct stubs dep is included
1156 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1157
1158 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1159
Jiyong Park55549df2021-02-26 23:57:23 +09001160 // Ensure that mylib is linking with the latest version of stub for mylib2
1161 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001162 // ... and not linking to the non-stub (impl) variant of mylib2
1163 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1164
1165 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1166 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1167 // .. and not linking to the stubs variant of mylib3
1168 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1169
1170 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001171 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001172 ensureNotContains(t, mylib2Cflags, "-include ")
1173
Jiyong Park85cc35a2022-07-17 11:30:47 +09001174 // Ensure that genstub is invoked with --systemapi
1175 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001176
1177 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1178 "lib64/mylib.so",
1179 "lib64/mylib3.so",
1180 "lib64/mylib4.so",
1181 })
1182}
1183
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001184func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1185 t.Parallel()
1186 // myapex (Z)
1187 // mylib -----------------.
1188 // |
1189 // otherapex (29) |
1190 // libstub's versions: 29 Z current
1191 // |
1192 // <platform> |
1193 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001194 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001195 apex {
1196 name: "myapex",
1197 key: "myapex.key",
1198 native_shared_libs: ["mylib"],
1199 min_sdk_version: "Z", // non-final
1200 }
1201
1202 cc_library {
1203 name: "mylib",
1204 srcs: ["mylib.cpp"],
1205 shared_libs: ["libstub"],
1206 apex_available: ["myapex"],
1207 min_sdk_version: "Z",
1208 }
1209
1210 apex_key {
1211 name: "myapex.key",
1212 public_key: "testkey.avbpubkey",
1213 private_key: "testkey.pem",
1214 }
1215
1216 apex {
1217 name: "otherapex",
1218 key: "myapex.key",
1219 native_shared_libs: ["libstub"],
1220 min_sdk_version: "29",
1221 }
1222
1223 cc_library {
1224 name: "libstub",
1225 srcs: ["mylib.cpp"],
1226 stubs: {
1227 versions: ["29", "Z", "current"],
1228 },
1229 apex_available: ["otherapex"],
1230 min_sdk_version: "29",
1231 }
1232
1233 // platform module depending on libstub from otherapex should use the latest stub("current")
1234 cc_library {
1235 name: "libplatform",
1236 srcs: ["mylib.cpp"],
1237 shared_libs: ["libstub"],
1238 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001239 `,
1240 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1241 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1242 variables.Platform_sdk_final = proptools.BoolPtr(false)
1243 variables.Platform_version_active_codenames = []string{"Z"}
1244 }),
1245 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001246
Jiyong Park55549df2021-02-26 23:57:23 +09001247 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001248 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001249 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001250 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001251 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001252
1253 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1254 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1255 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1256 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1257 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1258}
1259
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001260func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001261 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001262 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001263 name: "myapex2",
1264 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001265 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001266 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001267 }
1268
1269 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001270 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001271 public_key: "testkey.avbpubkey",
1272 private_key: "testkey.pem",
1273 }
1274
1275 cc_library {
1276 name: "mylib",
1277 srcs: ["mylib.cpp"],
1278 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001279 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001280 system_shared_libs: [],
1281 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001282 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001283 }
1284
1285 cc_library {
1286 name: "libfoo",
1287 srcs: ["mylib.cpp"],
1288 shared_libs: ["libbar"],
1289 system_shared_libs: [],
1290 stl: "none",
1291 stubs: {
1292 versions: ["10", "20", "30"],
1293 },
1294 }
1295
1296 cc_library {
1297 name: "libbar",
1298 srcs: ["mylib.cpp"],
1299 system_shared_libs: [],
1300 stl: "none",
1301 }
1302
Jiyong Park678c8812020-02-07 17:25:49 +09001303 cc_library_static {
1304 name: "libbaz",
1305 srcs: ["mylib.cpp"],
1306 system_shared_libs: [],
1307 stl: "none",
1308 apex_available: [ "myapex2" ],
1309 }
1310
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001311 `)
1312
Jiyong Park83dc74b2020-01-14 18:38:44 +09001313 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001314 copyCmds := apexRule.Args["copy_commands"]
1315
1316 // Ensure that direct non-stubs dep is always included
1317 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1318
1319 // Ensure that indirect stubs dep is not included
1320 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1321
1322 // Ensure that dependency of stubs is not included
1323 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1324
Colin Crossaede88c2020-08-11 12:17:01 -07001325 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001326
1327 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001328 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001329 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001330 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001331
Jiyong Park3ff16992019-12-27 14:11:47 +09001332 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001333
1334 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1335 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001336
Artur Satayeva8bd1132020-04-27 18:07:06 +01001337 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001338 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001339
Artur Satayeva8bd1132020-04-27 18:07:06 +01001340 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001341 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001342}
1343
Jooyung Hand3639552019-08-09 12:57:43 +09001344func TestApexWithRuntimeLibsDependency(t *testing.T) {
1345 /*
1346 myapex
1347 |
1348 v (runtime_libs)
1349 mylib ------+------> libfoo [provides stub]
1350 |
1351 `------> libbar
1352 */
Colin Cross1c460562021-02-16 17:55:47 -08001353 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001354 apex {
1355 name: "myapex",
1356 key: "myapex.key",
1357 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001358 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001359 }
1360
1361 apex_key {
1362 name: "myapex.key",
1363 public_key: "testkey.avbpubkey",
1364 private_key: "testkey.pem",
1365 }
1366
1367 cc_library {
1368 name: "mylib",
1369 srcs: ["mylib.cpp"],
1370 runtime_libs: ["libfoo", "libbar"],
1371 system_shared_libs: [],
1372 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001373 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001374 }
1375
1376 cc_library {
1377 name: "libfoo",
1378 srcs: ["mylib.cpp"],
1379 system_shared_libs: [],
1380 stl: "none",
1381 stubs: {
1382 versions: ["10", "20", "30"],
1383 },
1384 }
1385
1386 cc_library {
1387 name: "libbar",
1388 srcs: ["mylib.cpp"],
1389 system_shared_libs: [],
1390 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001391 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001392 }
1393
1394 `)
1395
Sundong Ahnabb64432019-10-22 13:58:29 +09001396 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001397 copyCmds := apexRule.Args["copy_commands"]
1398
1399 // Ensure that direct non-stubs dep is always included
1400 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1401
1402 // Ensure that indirect stubs dep is not included
1403 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1404
1405 // Ensure that runtime_libs dep in included
1406 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1407
Sundong Ahnabb64432019-10-22 13:58:29 +09001408 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001409 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1410 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001411
1412}
1413
Paul Duffina02cae32021-03-09 01:44:06 +00001414var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1415 cc.PrepareForTestWithCcBuildComponents,
1416 PrepareForTestWithApexBuildComponents,
1417 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001418 apex {
1419 name: "com.android.runtime",
1420 key: "com.android.runtime.key",
1421 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001422 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001423 }
1424
1425 apex_key {
1426 name: "com.android.runtime.key",
1427 public_key: "testkey.avbpubkey",
1428 private_key: "testkey.pem",
1429 }
Paul Duffina02cae32021-03-09 01:44:06 +00001430 `),
1431 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1432)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001433
Paul Duffina02cae32021-03-09 01:44:06 +00001434func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001435 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001436 cc_library {
1437 name: "libc",
1438 no_libcrt: true,
1439 nocrt: true,
1440 stl: "none",
1441 system_shared_libs: [],
1442 stubs: { versions: ["1"] },
1443 apex_available: ["com.android.runtime"],
1444
1445 sanitize: {
1446 hwaddress: true,
1447 }
1448 }
1449
1450 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001451 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001452 no_libcrt: true,
1453 nocrt: true,
1454 stl: "none",
1455 system_shared_libs: [],
1456 srcs: [""],
1457 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001458 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001459
1460 sanitize: {
1461 never: true,
1462 },
Paul Duffina02cae32021-03-09 01:44:06 +00001463 } `)
1464 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001465
1466 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1467 "lib64/bionic/libc.so",
1468 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1469 })
1470
Colin Cross4c4c1be2022-02-10 11:41:18 -08001471 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001472
1473 installed := hwasan.Description("install libclang_rt.hwasan")
1474 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1475
1476 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1477 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1478 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1479}
1480
1481func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001482 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001483 prepareForTestOfRuntimeApexWithHwasan,
1484 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1485 variables.SanitizeDevice = []string{"hwaddress"}
1486 }),
1487 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001488 cc_library {
1489 name: "libc",
1490 no_libcrt: true,
1491 nocrt: true,
1492 stl: "none",
1493 system_shared_libs: [],
1494 stubs: { versions: ["1"] },
1495 apex_available: ["com.android.runtime"],
1496 }
1497
1498 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001499 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001500 no_libcrt: true,
1501 nocrt: true,
1502 stl: "none",
1503 system_shared_libs: [],
1504 srcs: [""],
1505 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001506 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001507
1508 sanitize: {
1509 never: true,
1510 },
1511 }
Paul Duffina02cae32021-03-09 01:44:06 +00001512 `)
1513 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001514
1515 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1516 "lib64/bionic/libc.so",
1517 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1518 })
1519
Colin Cross4c4c1be2022-02-10 11:41:18 -08001520 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001521
1522 installed := hwasan.Description("install libclang_rt.hwasan")
1523 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1524
1525 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1526 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1527 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1528}
1529
Jooyung Han61b66e92020-03-21 14:21:46 +00001530func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1531 testcases := []struct {
1532 name string
1533 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001534 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001535 shouldLink string
1536 shouldNotLink []string
1537 }{
1538 {
Jiyong Park55549df2021-02-26 23:57:23 +09001539 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001540 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001541 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001542 shouldLink: "current",
1543 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001544 },
1545 {
Jiyong Park55549df2021-02-26 23:57:23 +09001546 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001547 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001548 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001549 shouldLink: "current",
1550 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001551 },
1552 }
1553 for _, tc := range testcases {
1554 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001555 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001556 apex {
1557 name: "myapex",
1558 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001559 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001560 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001561 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001562 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001563
Jooyung Han61b66e92020-03-21 14:21:46 +00001564 apex_key {
1565 name: "myapex.key",
1566 public_key: "testkey.avbpubkey",
1567 private_key: "testkey.pem",
1568 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001569
Jooyung Han61b66e92020-03-21 14:21:46 +00001570 cc_library {
1571 name: "mylib",
1572 srcs: ["mylib.cpp"],
1573 vendor_available: true,
1574 shared_libs: ["libbar"],
1575 system_shared_libs: [],
1576 stl: "none",
1577 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001578 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001579 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001580
Jooyung Han61b66e92020-03-21 14:21:46 +00001581 cc_library {
1582 name: "libbar",
1583 srcs: ["mylib.cpp"],
1584 system_shared_libs: [],
1585 stl: "none",
1586 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001587 llndk: {
1588 symbol_file: "libbar.map.txt",
1589 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001590 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001591 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001592 withUnbundledBuild,
1593 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001594
Jooyung Han61b66e92020-03-21 14:21:46 +00001595 // Ensure that LLNDK dep is not included
1596 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1597 "lib64/mylib.so",
1598 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001599
Jooyung Han61b66e92020-03-21 14:21:46 +00001600 // Ensure that LLNDK dep is required
1601 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1602 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1603 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001604
Steven Moreland2c4000c2021-04-27 02:08:49 +00001605 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1606 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001607 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001608 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001609 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001610
Steven Moreland2c4000c2021-04-27 02:08:49 +00001611 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001612 ver := tc.shouldLink
1613 if tc.shouldLink == "current" {
1614 ver = strconv.Itoa(android.FutureApiLevelInt)
1615 }
1616 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001617 })
1618 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001619}
1620
Jiyong Park25fc6a92018-11-18 18:02:45 +09001621func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001622 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001623 apex {
1624 name: "myapex",
1625 key: "myapex.key",
1626 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001627 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001628 }
1629
1630 apex_key {
1631 name: "myapex.key",
1632 public_key: "testkey.avbpubkey",
1633 private_key: "testkey.pem",
1634 }
1635
1636 cc_library {
1637 name: "mylib",
1638 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001639 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001640 shared_libs: ["libdl#27"],
1641 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001642 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001643 }
1644
1645 cc_library_shared {
1646 name: "mylib_shared",
1647 srcs: ["mylib.cpp"],
1648 shared_libs: ["libdl#27"],
1649 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001650 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001651 }
1652
1653 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001654 name: "libBootstrap",
1655 srcs: ["mylib.cpp"],
1656 stl: "none",
1657 bootstrap: true,
1658 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001659 `)
1660
Sundong Ahnabb64432019-10-22 13:58:29 +09001661 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001662 copyCmds := apexRule.Args["copy_commands"]
1663
1664 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001665 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001666 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1667 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001668
1669 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001670 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001671
Colin Crossaede88c2020-08-11 12:17:01 -07001672 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1673 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1674 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001675
1676 // For dependency to libc
1677 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001678 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001679 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001680 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001681 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001682 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1683 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001684
1685 // For dependency to libm
1686 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001687 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001688 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001689 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001690 // ... and is not compiling with the stub
1691 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1692 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1693
1694 // For dependency to libdl
1695 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001696 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001697 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001698 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1699 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001700 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001701 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001702 // ... Cflags from stub is correctly exported to mylib
1703 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1704 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001705
1706 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001707 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1708 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1709 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1710 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001711}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001712
Jooyung Han749dc692020-04-15 11:03:39 +09001713func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001714 // there are three links between liba --> libz.
1715 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001716 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001717 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001718 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001719 apex {
1720 name: "myapex",
1721 key: "myapex.key",
1722 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001723 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001724 }
1725
1726 apex {
1727 name: "otherapex",
1728 key: "myapex.key",
1729 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001730 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001731 }
1732
1733 apex_key {
1734 name: "myapex.key",
1735 public_key: "testkey.avbpubkey",
1736 private_key: "testkey.pem",
1737 }
1738
1739 cc_library {
1740 name: "libx",
1741 shared_libs: ["liba"],
1742 system_shared_libs: [],
1743 stl: "none",
1744 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001745 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001746 }
1747
1748 cc_library {
1749 name: "liby",
1750 shared_libs: ["liba"],
1751 system_shared_libs: [],
1752 stl: "none",
1753 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001754 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001755 }
1756
1757 cc_library {
1758 name: "liba",
1759 shared_libs: ["libz"],
1760 system_shared_libs: [],
1761 stl: "none",
1762 apex_available: [
1763 "//apex_available:anyapex",
1764 "//apex_available:platform",
1765 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001766 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001767 }
1768
1769 cc_library {
1770 name: "libz",
1771 system_shared_libs: [],
1772 stl: "none",
1773 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001774 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001775 },
1776 }
Jooyung Han749dc692020-04-15 11:03:39 +09001777 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001778
1779 expectLink := func(from, from_variant, to, to_variant string) {
1780 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1781 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1782 }
1783 expectNoLink := func(from, from_variant, to, to_variant string) {
1784 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1785 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1786 }
1787 // platform liba is linked to non-stub version
1788 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001789 // liba in myapex is linked to current
1790 expectLink("liba", "shared_apex29", "libz", "shared_current")
1791 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001792 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001793 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001794 // liba in otherapex is linked to current
1795 expectLink("liba", "shared_apex30", "libz", "shared_current")
1796 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001797 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1798 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001799}
1800
Jooyung Hanaed150d2020-04-02 01:41:41 +09001801func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001802 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001803 apex {
1804 name: "myapex",
1805 key: "myapex.key",
1806 native_shared_libs: ["libx"],
1807 min_sdk_version: "R",
1808 }
1809
1810 apex_key {
1811 name: "myapex.key",
1812 public_key: "testkey.avbpubkey",
1813 private_key: "testkey.pem",
1814 }
1815
1816 cc_library {
1817 name: "libx",
1818 shared_libs: ["libz"],
1819 system_shared_libs: [],
1820 stl: "none",
1821 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001822 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001823 }
1824
1825 cc_library {
1826 name: "libz",
1827 system_shared_libs: [],
1828 stl: "none",
1829 stubs: {
1830 versions: ["29", "R"],
1831 },
1832 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001833 `,
1834 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1835 variables.Platform_version_active_codenames = []string{"R"}
1836 }),
1837 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001838
1839 expectLink := func(from, from_variant, to, to_variant string) {
1840 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1841 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1842 }
1843 expectNoLink := func(from, from_variant, to, to_variant string) {
1844 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1845 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1846 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001847 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1848 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001849 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1850 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001851}
1852
Jooyung Han4c4da062021-06-23 10:23:16 +09001853func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1854 testApex(t, `
1855 apex {
1856 name: "myapex",
1857 key: "myapex.key",
1858 java_libs: ["libx"],
1859 min_sdk_version: "S",
1860 }
1861
1862 apex_key {
1863 name: "myapex.key",
1864 public_key: "testkey.avbpubkey",
1865 private_key: "testkey.pem",
1866 }
1867
1868 java_library {
1869 name: "libx",
1870 srcs: ["a.java"],
1871 apex_available: [ "myapex" ],
1872 sdk_version: "current",
1873 min_sdk_version: "S", // should be okay
1874 }
1875 `,
1876 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1877 variables.Platform_version_active_codenames = []string{"S"}
1878 variables.Platform_sdk_codename = proptools.StringPtr("S")
1879 }),
1880 )
1881}
1882
Jooyung Han749dc692020-04-15 11:03:39 +09001883func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001884 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001885 apex {
1886 name: "myapex",
1887 key: "myapex.key",
1888 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001889 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001890 }
1891
1892 apex_key {
1893 name: "myapex.key",
1894 public_key: "testkey.avbpubkey",
1895 private_key: "testkey.pem",
1896 }
1897
1898 cc_library {
1899 name: "libx",
1900 shared_libs: ["libz"],
1901 system_shared_libs: [],
1902 stl: "none",
1903 apex_available: [ "myapex" ],
1904 }
1905
1906 cc_library {
1907 name: "libz",
1908 system_shared_libs: [],
1909 stl: "none",
1910 stubs: {
1911 versions: ["1", "2"],
1912 },
1913 }
1914 `)
1915
1916 expectLink := func(from, from_variant, to, to_variant string) {
1917 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1918 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1919 }
1920 expectNoLink := func(from, from_variant, to, to_variant string) {
1921 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1922 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1923 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001924 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001925 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001926 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001927 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001928}
1929
Jooyung Handfc864c2023-03-20 18:19:07 +09001930func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001931 ctx := testApex(t, `
1932 apex {
1933 name: "myapex",
1934 key: "myapex.key",
1935 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001936 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001937 vendor: true,
1938 min_sdk_version: "29",
1939 }
1940
1941 apex_key {
1942 name: "myapex.key",
1943 public_key: "testkey.avbpubkey",
1944 private_key: "testkey.pem",
1945 }
1946
1947 cc_library {
1948 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001949 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001950 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001951 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001952 shared_libs: ["libbar"],
1953 }
1954
1955 cc_library {
1956 name: "libbar",
1957 stubs: { versions: ["29", "30"] },
1958 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09001959 }
1960 `)
1961
1962 vendorVariant := "android_vendor.29_arm64_armv8-a"
1963
Jooyung Handfc864c2023-03-20 18:19:07 +09001964 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
1965
1966 // Ensure that mylib links with "current" LLNDK
1967 libFlags := names(mylib.Rule("ld").Args["libFlags"])
1968 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
1969
1970 // Ensure that mylib is targeting 29
1971 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
1972 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
1973
1974 // Ensure that the correct variant of crtbegin_so is used.
1975 crtBegin := mylib.Rule("ld").Args["crtBegin"]
1976 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09001977
1978 // Ensure that the crtbegin_so used by the APEX is targeting 29
1979 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1980 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1981}
1982
Jooyung Han03b51852020-02-26 22:45:42 +09001983func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001984 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001985 apex {
1986 name: "myapex",
1987 key: "myapex.key",
1988 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001989 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001990 }
1991
1992 apex_key {
1993 name: "myapex.key",
1994 public_key: "testkey.avbpubkey",
1995 private_key: "testkey.pem",
1996 }
1997
1998 cc_library {
1999 name: "libx",
2000 system_shared_libs: [],
2001 stl: "none",
2002 apex_available: [ "myapex" ],
2003 stubs: {
2004 versions: ["1", "2"],
2005 },
2006 }
2007
2008 cc_library {
2009 name: "libz",
2010 shared_libs: ["libx"],
2011 system_shared_libs: [],
2012 stl: "none",
2013 }
2014 `)
2015
2016 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002017 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002018 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2019 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2020 }
2021 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002022 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002023 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2024 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2025 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002026 expectLink("libz", "shared", "libx", "shared_current")
2027 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002028 expectNoLink("libz", "shared", "libz", "shared_1")
2029 expectNoLink("libz", "shared", "libz", "shared")
2030}
2031
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002032var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2033 func(variables android.FixtureProductVariables) {
2034 variables.SanitizeDevice = []string{"hwaddress"}
2035 },
2036)
2037
Jooyung Han75568392020-03-20 04:29:24 +09002038func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002039 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002040 apex {
2041 name: "myapex",
2042 key: "myapex.key",
2043 native_shared_libs: ["libx"],
2044 min_sdk_version: "29",
2045 }
2046
2047 apex_key {
2048 name: "myapex.key",
2049 public_key: "testkey.avbpubkey",
2050 private_key: "testkey.pem",
2051 }
2052
2053 cc_library {
2054 name: "libx",
2055 shared_libs: ["libbar"],
2056 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002057 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002058 }
2059
2060 cc_library {
2061 name: "libbar",
2062 stubs: {
2063 versions: ["29", "30"],
2064 },
2065 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002066 `,
2067 prepareForTestWithSantitizeHwaddress,
2068 )
Jooyung Han03b51852020-02-26 22:45:42 +09002069 expectLink := func(from, from_variant, to, to_variant string) {
2070 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2071 libFlags := ld.Args["libFlags"]
2072 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2073 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002074 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002075}
2076
Jooyung Han75568392020-03-20 04:29:24 +09002077func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002078 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002079 apex {
2080 name: "myapex",
2081 key: "myapex.key",
2082 native_shared_libs: ["libx"],
2083 min_sdk_version: "29",
2084 }
2085
2086 apex_key {
2087 name: "myapex.key",
2088 public_key: "testkey.avbpubkey",
2089 private_key: "testkey.pem",
2090 }
2091
2092 cc_library {
2093 name: "libx",
2094 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002095 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002096 }
Jooyung Han75568392020-03-20 04:29:24 +09002097 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002098
2099 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002100 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002101 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002102 // note that platform variant is not.
2103 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002104 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002105}
2106
Jooyung Han749dc692020-04-15 11:03:39 +09002107func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2108 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002109 apex {
2110 name: "myapex",
2111 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002112 native_shared_libs: ["mylib"],
2113 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002114 }
2115
2116 apex_key {
2117 name: "myapex.key",
2118 public_key: "testkey.avbpubkey",
2119 private_key: "testkey.pem",
2120 }
Jooyung Han749dc692020-04-15 11:03:39 +09002121
2122 cc_library {
2123 name: "mylib",
2124 srcs: ["mylib.cpp"],
2125 system_shared_libs: [],
2126 stl: "none",
2127 apex_available: [
2128 "myapex",
2129 ],
2130 min_sdk_version: "30",
2131 }
2132 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002133
2134 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2135 apex {
2136 name: "myapex",
2137 key: "myapex.key",
2138 native_shared_libs: ["libfoo.ffi"],
2139 min_sdk_version: "29",
2140 }
2141
2142 apex_key {
2143 name: "myapex.key",
2144 public_key: "testkey.avbpubkey",
2145 private_key: "testkey.pem",
2146 }
2147
2148 rust_ffi_shared {
2149 name: "libfoo.ffi",
2150 srcs: ["foo.rs"],
2151 crate_name: "foo",
2152 apex_available: [
2153 "myapex",
2154 ],
2155 min_sdk_version: "30",
2156 }
2157 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002158
2159 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2160 apex {
2161 name: "myapex",
2162 key: "myapex.key",
2163 java_libs: ["libfoo"],
2164 min_sdk_version: "29",
2165 }
2166
2167 apex_key {
2168 name: "myapex.key",
2169 public_key: "testkey.avbpubkey",
2170 private_key: "testkey.pem",
2171 }
2172
2173 java_import {
2174 name: "libfoo",
2175 jars: ["libfoo.jar"],
2176 apex_available: [
2177 "myapex",
2178 ],
2179 min_sdk_version: "30",
2180 }
2181 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002182
2183 // Skip check for modules compiling against core API surface
2184 testApex(t, `
2185 apex {
2186 name: "myapex",
2187 key: "myapex.key",
2188 java_libs: ["libfoo"],
2189 min_sdk_version: "29",
2190 }
2191
2192 apex_key {
2193 name: "myapex.key",
2194 public_key: "testkey.avbpubkey",
2195 private_key: "testkey.pem",
2196 }
2197
2198 java_library {
2199 name: "libfoo",
2200 srcs: ["Foo.java"],
2201 apex_available: [
2202 "myapex",
2203 ],
2204 // Compile against core API surface
2205 sdk_version: "core_current",
2206 min_sdk_version: "30",
2207 }
2208 `)
2209
Jooyung Han749dc692020-04-15 11:03:39 +09002210}
2211
2212func TestApexMinSdkVersion_Okay(t *testing.T) {
2213 testApex(t, `
2214 apex {
2215 name: "myapex",
2216 key: "myapex.key",
2217 native_shared_libs: ["libfoo"],
2218 java_libs: ["libbar"],
2219 min_sdk_version: "29",
2220 }
2221
2222 apex_key {
2223 name: "myapex.key",
2224 public_key: "testkey.avbpubkey",
2225 private_key: "testkey.pem",
2226 }
2227
2228 cc_library {
2229 name: "libfoo",
2230 srcs: ["mylib.cpp"],
2231 shared_libs: ["libfoo_dep"],
2232 apex_available: ["myapex"],
2233 min_sdk_version: "29",
2234 }
2235
2236 cc_library {
2237 name: "libfoo_dep",
2238 srcs: ["mylib.cpp"],
2239 apex_available: ["myapex"],
2240 min_sdk_version: "29",
2241 }
2242
2243 java_library {
2244 name: "libbar",
2245 sdk_version: "current",
2246 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002247 static_libs: [
2248 "libbar_dep",
2249 "libbar_import_dep",
2250 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002251 apex_available: ["myapex"],
2252 min_sdk_version: "29",
2253 }
2254
2255 java_library {
2256 name: "libbar_dep",
2257 sdk_version: "current",
2258 srcs: ["a.java"],
2259 apex_available: ["myapex"],
2260 min_sdk_version: "29",
2261 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002262
2263 java_import {
2264 name: "libbar_import_dep",
2265 jars: ["libbar.jar"],
2266 apex_available: ["myapex"],
2267 min_sdk_version: "29",
2268 }
Jooyung Han03b51852020-02-26 22:45:42 +09002269 `)
2270}
2271
Colin Cross8ca61c12022-10-06 21:00:14 -07002272func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2273 // Tests that an apex dependency with min_sdk_version higher than the
2274 // min_sdk_version of the apex is allowed as long as the dependency's
2275 // min_sdk_version is less than or equal to the api level that the
2276 // architecture was introduced in. In this case, arm64 didn't exist
2277 // until api level 21, so the arm64 code will never need to run on
2278 // an api level 20 device, even if other architectures of the apex
2279 // will.
2280 testApex(t, `
2281 apex {
2282 name: "myapex",
2283 key: "myapex.key",
2284 native_shared_libs: ["libfoo"],
2285 min_sdk_version: "20",
2286 }
2287
2288 apex_key {
2289 name: "myapex.key",
2290 public_key: "testkey.avbpubkey",
2291 private_key: "testkey.pem",
2292 }
2293
2294 cc_library {
2295 name: "libfoo",
2296 srcs: ["mylib.cpp"],
2297 apex_available: ["myapex"],
2298 min_sdk_version: "21",
2299 stl: "none",
2300 }
2301 `)
2302}
2303
Artur Satayev8cf899a2020-04-15 17:29:42 +01002304func TestJavaStableSdkVersion(t *testing.T) {
2305 testCases := []struct {
2306 name string
2307 expectedError string
2308 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002309 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002310 }{
2311 {
2312 name: "Non-updatable apex with non-stable dep",
2313 bp: `
2314 apex {
2315 name: "myapex",
2316 java_libs: ["myjar"],
2317 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002318 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002319 }
2320 apex_key {
2321 name: "myapex.key",
2322 public_key: "testkey.avbpubkey",
2323 private_key: "testkey.pem",
2324 }
2325 java_library {
2326 name: "myjar",
2327 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002328 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002329 apex_available: ["myapex"],
2330 }
2331 `,
2332 },
2333 {
2334 name: "Updatable apex with stable dep",
2335 bp: `
2336 apex {
2337 name: "myapex",
2338 java_libs: ["myjar"],
2339 key: "myapex.key",
2340 updatable: true,
2341 min_sdk_version: "29",
2342 }
2343 apex_key {
2344 name: "myapex.key",
2345 public_key: "testkey.avbpubkey",
2346 private_key: "testkey.pem",
2347 }
2348 java_library {
2349 name: "myjar",
2350 srcs: ["foo/bar/MyClass.java"],
2351 sdk_version: "current",
2352 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002353 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002354 }
2355 `,
2356 },
2357 {
2358 name: "Updatable apex with non-stable dep",
2359 expectedError: "cannot depend on \"myjar\"",
2360 bp: `
2361 apex {
2362 name: "myapex",
2363 java_libs: ["myjar"],
2364 key: "myapex.key",
2365 updatable: true,
2366 }
2367 apex_key {
2368 name: "myapex.key",
2369 public_key: "testkey.avbpubkey",
2370 private_key: "testkey.pem",
2371 }
2372 java_library {
2373 name: "myjar",
2374 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002375 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002376 apex_available: ["myapex"],
2377 }
2378 `,
2379 },
2380 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002381 name: "Updatable apex with non-stable legacy core platform dep",
2382 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2383 bp: `
2384 apex {
2385 name: "myapex",
2386 java_libs: ["myjar-uses-legacy"],
2387 key: "myapex.key",
2388 updatable: true,
2389 }
2390 apex_key {
2391 name: "myapex.key",
2392 public_key: "testkey.avbpubkey",
2393 private_key: "testkey.pem",
2394 }
2395 java_library {
2396 name: "myjar-uses-legacy",
2397 srcs: ["foo/bar/MyClass.java"],
2398 sdk_version: "core_platform",
2399 apex_available: ["myapex"],
2400 }
2401 `,
2402 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2403 },
2404 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002405 name: "Updatable apex with non-stable transitive dep",
2406 // This is not actually detecting that the transitive dependency is unstable, rather it is
2407 // detecting that the transitive dependency is building against a wider API surface than the
2408 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002409 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002410 bp: `
2411 apex {
2412 name: "myapex",
2413 java_libs: ["myjar"],
2414 key: "myapex.key",
2415 updatable: true,
2416 }
2417 apex_key {
2418 name: "myapex.key",
2419 public_key: "testkey.avbpubkey",
2420 private_key: "testkey.pem",
2421 }
2422 java_library {
2423 name: "myjar",
2424 srcs: ["foo/bar/MyClass.java"],
2425 sdk_version: "current",
2426 apex_available: ["myapex"],
2427 static_libs: ["transitive-jar"],
2428 }
2429 java_library {
2430 name: "transitive-jar",
2431 srcs: ["foo/bar/MyClass.java"],
2432 sdk_version: "core_platform",
2433 apex_available: ["myapex"],
2434 }
2435 `,
2436 },
2437 }
2438
2439 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002440 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2441 continue
2442 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002443 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002444 errorHandler := android.FixtureExpectsNoErrors
2445 if test.expectedError != "" {
2446 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002447 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002448 android.GroupFixturePreparers(
2449 java.PrepareForTestWithJavaDefaultModules,
2450 PrepareForTestWithApexBuildComponents,
2451 prepareForTestWithMyapex,
2452 android.OptionalFixturePreparer(test.preparer),
2453 ).
2454 ExtendWithErrorHandler(errorHandler).
2455 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002456 })
2457 }
2458}
2459
Jooyung Han749dc692020-04-15 11:03:39 +09002460func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2461 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2462 apex {
2463 name: "myapex",
2464 key: "myapex.key",
2465 native_shared_libs: ["mylib"],
2466 min_sdk_version: "29",
2467 }
2468
2469 apex_key {
2470 name: "myapex.key",
2471 public_key: "testkey.avbpubkey",
2472 private_key: "testkey.pem",
2473 }
2474
2475 cc_library {
2476 name: "mylib",
2477 srcs: ["mylib.cpp"],
2478 shared_libs: ["mylib2"],
2479 system_shared_libs: [],
2480 stl: "none",
2481 apex_available: [
2482 "myapex",
2483 ],
2484 min_sdk_version: "29",
2485 }
2486
2487 // indirect part of the apex
2488 cc_library {
2489 name: "mylib2",
2490 srcs: ["mylib.cpp"],
2491 system_shared_libs: [],
2492 stl: "none",
2493 apex_available: [
2494 "myapex",
2495 ],
2496 min_sdk_version: "30",
2497 }
2498 `)
2499}
2500
2501func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2502 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2503 apex {
2504 name: "myapex",
2505 key: "myapex.key",
2506 apps: ["AppFoo"],
2507 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002508 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002509 }
2510
2511 apex_key {
2512 name: "myapex.key",
2513 public_key: "testkey.avbpubkey",
2514 private_key: "testkey.pem",
2515 }
2516
2517 android_app {
2518 name: "AppFoo",
2519 srcs: ["foo/bar/MyClass.java"],
2520 sdk_version: "current",
2521 min_sdk_version: "29",
2522 system_modules: "none",
2523 stl: "none",
2524 static_libs: ["bar"],
2525 apex_available: [ "myapex" ],
2526 }
2527
2528 java_library {
2529 name: "bar",
2530 sdk_version: "current",
2531 srcs: ["a.java"],
2532 apex_available: [ "myapex" ],
2533 }
2534 `)
2535}
2536
2537func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002538 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002539 apex {
2540 name: "myapex",
2541 key: "myapex.key",
2542 native_shared_libs: ["mylib"],
2543 min_sdk_version: "29",
2544 }
2545
2546 apex_key {
2547 name: "myapex.key",
2548 public_key: "testkey.avbpubkey",
2549 private_key: "testkey.pem",
2550 }
2551
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002552 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002553 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2554 cc_library {
2555 name: "mylib",
2556 srcs: ["mylib.cpp"],
2557 shared_libs: ["mylib2"],
2558 system_shared_libs: [],
2559 stl: "none",
2560 apex_available: ["myapex", "otherapex"],
2561 min_sdk_version: "29",
2562 }
2563
2564 cc_library {
2565 name: "mylib2",
2566 srcs: ["mylib.cpp"],
2567 system_shared_libs: [],
2568 stl: "none",
2569 apex_available: ["otherapex"],
2570 stubs: { versions: ["29", "30"] },
2571 min_sdk_version: "30",
2572 }
2573
2574 apex {
2575 name: "otherapex",
2576 key: "myapex.key",
2577 native_shared_libs: ["mylib", "mylib2"],
2578 min_sdk_version: "30",
2579 }
2580 `)
2581 expectLink := func(from, from_variant, to, to_variant string) {
2582 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2583 libFlags := ld.Args["libFlags"]
2584 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2585 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002586 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002587 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002588}
2589
Jooyung Haned124c32021-01-26 11:43:46 +09002590func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002591 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2592 func(variables android.FixtureProductVariables) {
2593 variables.Platform_sdk_codename = proptools.StringPtr("S")
2594 variables.Platform_version_active_codenames = []string{"S"}
2595 },
2596 )
Jooyung Haned124c32021-01-26 11:43:46 +09002597 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2598 apex {
2599 name: "myapex",
2600 key: "myapex.key",
2601 native_shared_libs: ["libfoo"],
2602 min_sdk_version: "S",
2603 }
2604 apex_key {
2605 name: "myapex.key",
2606 public_key: "testkey.avbpubkey",
2607 private_key: "testkey.pem",
2608 }
2609 cc_library {
2610 name: "libfoo",
2611 shared_libs: ["libbar"],
2612 apex_available: ["myapex"],
2613 min_sdk_version: "29",
2614 }
2615 cc_library {
2616 name: "libbar",
2617 apex_available: ["myapex"],
2618 }
2619 `, withSAsActiveCodeNames)
2620}
2621
2622func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002623 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2624 variables.Platform_sdk_codename = proptools.StringPtr("S")
2625 variables.Platform_version_active_codenames = []string{"S", "T"}
2626 })
Colin Cross1c460562021-02-16 17:55:47 -08002627 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002628 apex {
2629 name: "myapex",
2630 key: "myapex.key",
2631 native_shared_libs: ["libfoo"],
2632 min_sdk_version: "S",
2633 }
2634 apex_key {
2635 name: "myapex.key",
2636 public_key: "testkey.avbpubkey",
2637 private_key: "testkey.pem",
2638 }
2639 cc_library {
2640 name: "libfoo",
2641 shared_libs: ["libbar"],
2642 apex_available: ["myapex"],
2643 min_sdk_version: "S",
2644 }
2645 cc_library {
2646 name: "libbar",
2647 stubs: {
2648 symbol_file: "libbar.map.txt",
2649 versions: ["30", "S", "T"],
2650 },
2651 }
2652 `, withSAsActiveCodeNames)
2653
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002654 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002655 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2656 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002657 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002658}
2659
Jiyong Park7c2ee712018-12-07 00:42:25 +09002660func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002661 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002662 apex {
2663 name: "myapex",
2664 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002665 native_shared_libs: ["mylib"],
2666 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002667 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002668 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002669 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002670 }
2671
2672 apex_key {
2673 name: "myapex.key",
2674 public_key: "testkey.avbpubkey",
2675 private_key: "testkey.pem",
2676 }
2677
2678 prebuilt_etc {
2679 name: "myetc",
2680 src: "myprebuilt",
2681 sub_dir: "foo/bar",
2682 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002683
2684 cc_library {
2685 name: "mylib",
2686 srcs: ["mylib.cpp"],
2687 relative_install_path: "foo/bar",
2688 system_shared_libs: [],
2689 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002690 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002691 }
2692
2693 cc_binary {
2694 name: "mybin",
2695 srcs: ["mylib.cpp"],
2696 relative_install_path: "foo/bar",
2697 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002698 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002699 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002700 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002701 `)
2702
Sundong Ahnabb64432019-10-22 13:58:29 +09002703 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002704 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002705
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002706 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002707 ensureContains(t, cmd, "/etc ")
2708 ensureContains(t, cmd, "/etc/foo ")
2709 ensureContains(t, cmd, "/etc/foo/bar ")
2710 ensureContains(t, cmd, "/lib64 ")
2711 ensureContains(t, cmd, "/lib64/foo ")
2712 ensureContains(t, cmd, "/lib64/foo/bar ")
2713 ensureContains(t, cmd, "/lib ")
2714 ensureContains(t, cmd, "/lib/foo ")
2715 ensureContains(t, cmd, "/lib/foo/bar ")
2716 ensureContains(t, cmd, "/bin ")
2717 ensureContains(t, cmd, "/bin/foo ")
2718 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002719}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002720
Jooyung Han35155c42020-02-06 17:33:20 +09002721func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002722 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002723 apex {
2724 name: "myapex",
2725 key: "myapex.key",
2726 multilib: {
2727 both: {
2728 native_shared_libs: ["mylib"],
2729 binaries: ["mybin"],
2730 },
2731 },
2732 compile_multilib: "both",
2733 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002734 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002735 }
2736
2737 apex_key {
2738 name: "myapex.key",
2739 public_key: "testkey.avbpubkey",
2740 private_key: "testkey.pem",
2741 }
2742
2743 cc_library {
2744 name: "mylib",
2745 relative_install_path: "foo/bar",
2746 system_shared_libs: [],
2747 stl: "none",
2748 apex_available: [ "myapex" ],
2749 native_bridge_supported: true,
2750 }
2751
2752 cc_binary {
2753 name: "mybin",
2754 relative_install_path: "foo/bar",
2755 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002756 stl: "none",
2757 apex_available: [ "myapex" ],
2758 native_bridge_supported: true,
2759 compile_multilib: "both", // default is "first" for binary
2760 multilib: {
2761 lib64: {
2762 suffix: "64",
2763 },
2764 },
2765 }
2766 `, withNativeBridgeEnabled)
2767 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2768 "bin/foo/bar/mybin",
2769 "bin/foo/bar/mybin64",
2770 "bin/arm/foo/bar/mybin",
2771 "bin/arm64/foo/bar/mybin64",
2772 "lib/foo/bar/mylib.so",
2773 "lib/arm/foo/bar/mylib.so",
2774 "lib64/foo/bar/mylib.so",
2775 "lib64/arm64/foo/bar/mylib.so",
2776 })
2777}
2778
Jooyung Han85d61762020-06-24 23:50:26 +09002779func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002780 result := android.GroupFixturePreparers(
2781 prepareForApexTest,
2782 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2783 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002784 apex {
2785 name: "myapex",
2786 key: "myapex.key",
2787 binaries: ["mybin"],
2788 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002789 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002790 }
2791 apex_key {
2792 name: "myapex.key",
2793 public_key: "testkey.avbpubkey",
2794 private_key: "testkey.pem",
2795 }
2796 cc_binary {
2797 name: "mybin",
2798 vendor: true,
2799 shared_libs: ["libfoo"],
2800 }
2801 cc_library {
2802 name: "libfoo",
2803 proprietary: true,
2804 }
2805 `)
2806
Colin Crossc68db4b2021-11-11 18:59:15 -08002807 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002808 "bin/mybin",
2809 "lib64/libfoo.so",
2810 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2811 "lib64/libc++.so",
2812 })
2813
Colin Crossc68db4b2021-11-11 18:59:15 -08002814 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2815 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002816 name := apexBundle.BaseModuleName()
2817 prefix := "TARGET_"
2818 var builder strings.Builder
2819 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002820 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002821 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002822 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002823
Colin Crossc68db4b2021-11-11 18:59:15 -08002824 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002825 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2826 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002827}
2828
Jooyung Hanc5a96762022-02-04 11:54:50 +09002829func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2830 testApexError(t, `Trying to include a VNDK library`, `
2831 apex {
2832 name: "myapex",
2833 key: "myapex.key",
2834 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2835 vendor: true,
2836 use_vndk_as_stable: true,
2837 updatable: false,
2838 }
2839 apex_key {
2840 name: "myapex.key",
2841 public_key: "testkey.avbpubkey",
2842 private_key: "testkey.pem",
2843 }`)
2844}
2845
Jooyung Handf78e212020-07-22 15:54:47 +09002846func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002847 // myapex myapex2
2848 // | |
2849 // mybin ------. mybin2
2850 // \ \ / |
2851 // (stable) .---\--------` |
2852 // \ / \ |
2853 // \ / \ /
2854 // libvndk libvendor
2855 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002856 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002857 apex {
2858 name: "myapex",
2859 key: "myapex.key",
2860 binaries: ["mybin"],
2861 vendor: true,
2862 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002863 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002864 }
2865 apex_key {
2866 name: "myapex.key",
2867 public_key: "testkey.avbpubkey",
2868 private_key: "testkey.pem",
2869 }
2870 cc_binary {
2871 name: "mybin",
2872 vendor: true,
2873 shared_libs: ["libvndk", "libvendor"],
2874 }
2875 cc_library {
2876 name: "libvndk",
2877 vndk: {
2878 enabled: true,
2879 },
2880 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002881 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002882 }
2883 cc_library {
2884 name: "libvendor",
2885 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002886 stl: "none",
2887 }
2888 apex {
2889 name: "myapex2",
2890 key: "myapex.key",
2891 binaries: ["mybin2"],
2892 vendor: true,
2893 use_vndk_as_stable: false,
2894 updatable: false,
2895 }
2896 cc_binary {
2897 name: "mybin2",
2898 vendor: true,
2899 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002900 }
2901 `)
2902
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002903 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002904
Jooyung Han91f92032022-02-04 12:36:33 +09002905 for _, tc := range []struct {
2906 name string
2907 apexName string
2908 moduleName string
2909 moduleVariant string
2910 libs []string
2911 contents []string
2912 requireVndkNamespace bool
2913 }{
2914 {
2915 name: "use_vndk_as_stable",
2916 apexName: "myapex",
2917 moduleName: "mybin",
2918 moduleVariant: vendorVariant + "_apex10000",
2919 libs: []string{
2920 // should link with vendor variants of VNDK libs(libvndk/libc++)
2921 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2922 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2923 // unstable Vendor libs as APEX variant
2924 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2925 },
2926 contents: []string{
2927 "bin/mybin",
2928 "lib64/libvendor.so",
2929 // VNDK libs (libvndk/libc++) are not included
2930 },
2931 requireVndkNamespace: true,
2932 },
2933 {
2934 name: "!use_vndk_as_stable",
2935 apexName: "myapex2",
2936 moduleName: "mybin2",
2937 moduleVariant: vendorVariant + "_myapex2",
2938 libs: []string{
2939 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2940 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2941 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2942 // unstable vendor libs have "merged" APEX variants
2943 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2944 },
2945 contents: []string{
2946 "bin/mybin2",
2947 "lib64/libvendor.so",
2948 // VNDK libs are included as well
2949 "lib64/libvndk.so",
2950 "lib64/libc++.so",
2951 },
2952 requireVndkNamespace: false,
2953 },
2954 } {
2955 t.Run(tc.name, func(t *testing.T) {
2956 // Check linked libs
2957 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2958 libs := names(ldRule.Args["libFlags"])
2959 for _, lib := range tc.libs {
2960 ensureListContains(t, libs, lib)
2961 }
2962 // Check apex contents
2963 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002964
Jooyung Han91f92032022-02-04 12:36:33 +09002965 // Check "requireNativeLibs"
2966 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2967 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2968 if tc.requireVndkNamespace {
2969 ensureListContains(t, requireNativeLibs, ":vndk")
2970 } else {
2971 ensureListNotContains(t, requireNativeLibs, ":vndk")
2972 }
2973 })
2974 }
Jooyung Handf78e212020-07-22 15:54:47 +09002975}
2976
Justin Yun13decfb2021-03-08 19:25:55 +09002977func TestProductVariant(t *testing.T) {
2978 ctx := testApex(t, `
2979 apex {
2980 name: "myapex",
2981 key: "myapex.key",
2982 updatable: false,
2983 product_specific: true,
2984 binaries: ["foo"],
2985 }
2986
2987 apex_key {
2988 name: "myapex.key",
2989 public_key: "testkey.avbpubkey",
2990 private_key: "testkey.pem",
2991 }
2992
2993 cc_binary {
2994 name: "foo",
2995 product_available: true,
2996 apex_available: ["myapex"],
2997 srcs: ["foo.cpp"],
2998 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002999 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3000 variables.ProductVndkVersion = proptools.StringPtr("current")
3001 }),
3002 )
Justin Yun13decfb2021-03-08 19:25:55 +09003003
3004 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003005 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003006 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3007 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3008 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3009 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3010}
3011
Jooyung Han8e5685d2020-09-21 11:02:57 +09003012func TestApex_withPrebuiltFirmware(t *testing.T) {
3013 testCases := []struct {
3014 name string
3015 additionalProp string
3016 }{
3017 {"system apex with prebuilt_firmware", ""},
3018 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3019 }
3020 for _, tc := range testCases {
3021 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003022 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003023 apex {
3024 name: "myapex",
3025 key: "myapex.key",
3026 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003027 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003028 `+tc.additionalProp+`
3029 }
3030 apex_key {
3031 name: "myapex.key",
3032 public_key: "testkey.avbpubkey",
3033 private_key: "testkey.pem",
3034 }
3035 prebuilt_firmware {
3036 name: "myfirmware",
3037 src: "myfirmware.bin",
3038 filename_from_src: true,
3039 `+tc.additionalProp+`
3040 }
3041 `)
3042 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3043 "etc/firmware/myfirmware.bin",
3044 })
3045 })
3046 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003047}
3048
Jooyung Hanefb184e2020-06-25 17:14:25 +09003049func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003050 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003051 apex {
3052 name: "myapex",
3053 key: "myapex.key",
3054 vendor: true,
3055 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003056 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003057 }
3058
3059 apex_key {
3060 name: "myapex.key",
3061 public_key: "testkey.avbpubkey",
3062 private_key: "testkey.pem",
3063 }
3064
3065 cc_library {
3066 name: "mylib",
3067 vendor_available: true,
3068 }
3069 `)
3070
3071 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003072 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003073 name := apexBundle.BaseModuleName()
3074 prefix := "TARGET_"
3075 var builder strings.Builder
3076 data.Custom(&builder, name, prefix, "", data)
3077 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00003078 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 +09003079}
3080
Jooyung Han2ed99d02020-06-24 23:26:26 +09003081func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003082 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003083 apex {
3084 name: "myapex",
3085 key: "myapex.key",
3086 vintf_fragments: ["fragment.xml"],
3087 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003088 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003089 }
3090 apex_key {
3091 name: "myapex.key",
3092 public_key: "testkey.avbpubkey",
3093 private_key: "testkey.pem",
3094 }
3095 cc_binary {
3096 name: "mybin",
3097 }
3098 `)
3099
3100 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003101 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003102 name := apexBundle.BaseModuleName()
3103 prefix := "TARGET_"
3104 var builder strings.Builder
3105 data.Custom(&builder, name, prefix, "", data)
3106 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003107 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003108 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003109}
3110
Jiyong Park16e91a02018-12-20 18:18:08 +09003111func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003112 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003113 apex {
3114 name: "myapex",
3115 key: "myapex.key",
3116 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003117 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003118 }
3119
3120 apex_key {
3121 name: "myapex.key",
3122 public_key: "testkey.avbpubkey",
3123 private_key: "testkey.pem",
3124 }
3125
3126 cc_library {
3127 name: "mylib",
3128 srcs: ["mylib.cpp"],
3129 system_shared_libs: [],
3130 stl: "none",
3131 stubs: {
3132 versions: ["1", "2", "3"],
3133 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003134 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003135 }
3136
3137 cc_binary {
3138 name: "not_in_apex",
3139 srcs: ["mylib.cpp"],
3140 static_libs: ["mylib"],
3141 static_executable: true,
3142 system_shared_libs: [],
3143 stl: "none",
3144 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003145 `)
3146
Colin Cross7113d202019-11-20 16:39:12 -08003147 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003148
3149 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003150 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003151}
Jiyong Park9335a262018-12-24 11:31:58 +09003152
3153func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003154 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003155 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003156 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003157 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003158 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003159 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003160 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003161 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003162 }
3163
3164 cc_library {
3165 name: "mylib",
3166 srcs: ["mylib.cpp"],
3167 system_shared_libs: [],
3168 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003169 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003170 }
3171
3172 apex_key {
3173 name: "myapex.key",
3174 public_key: "testkey.avbpubkey",
3175 private_key: "testkey.pem",
3176 }
3177
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003178 android_app_certificate {
3179 name: "myapex.certificate",
3180 certificate: "testkey",
3181 }
3182
3183 android_app_certificate {
3184 name: "myapex.certificate.override",
3185 certificate: "testkey.override",
3186 }
3187
Jiyong Park9335a262018-12-24 11:31:58 +09003188 `)
3189
3190 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003191 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003192
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003193 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3194 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003195 "vendor/foo/devkeys/testkey.avbpubkey")
3196 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003197 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3198 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003199 "vendor/foo/devkeys/testkey.pem")
3200 }
3201
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003202 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003203 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003204 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003205 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003206 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003207 }
3208}
Jiyong Park58e364a2019-01-19 19:24:06 +09003209
Jooyung Hanf121a652019-12-17 14:30:11 +09003210func TestCertificate(t *testing.T) {
3211 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003212 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003213 apex {
3214 name: "myapex",
3215 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003216 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003217 }
3218 apex_key {
3219 name: "myapex.key",
3220 public_key: "testkey.avbpubkey",
3221 private_key: "testkey.pem",
3222 }`)
3223 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3224 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3225 if actual := rule.Args["certificates"]; actual != expected {
3226 t.Errorf("certificates should be %q, not %q", expected, actual)
3227 }
3228 })
3229 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003230 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003231 apex {
3232 name: "myapex_keytest",
3233 key: "myapex.key",
3234 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003235 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003236 }
3237 apex_key {
3238 name: "myapex.key",
3239 public_key: "testkey.avbpubkey",
3240 private_key: "testkey.pem",
3241 }
3242 android_app_certificate {
3243 name: "myapex.certificate.override",
3244 certificate: "testkey.override",
3245 }`)
3246 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3247 expected := "testkey.override.x509.pem testkey.override.pk8"
3248 if actual := rule.Args["certificates"]; actual != expected {
3249 t.Errorf("certificates should be %q, not %q", expected, actual)
3250 }
3251 })
3252 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003253 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003254 apex {
3255 name: "myapex",
3256 key: "myapex.key",
3257 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003258 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003259 }
3260 apex_key {
3261 name: "myapex.key",
3262 public_key: "testkey.avbpubkey",
3263 private_key: "testkey.pem",
3264 }
3265 android_app_certificate {
3266 name: "myapex.certificate",
3267 certificate: "testkey",
3268 }`)
3269 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3270 expected := "testkey.x509.pem testkey.pk8"
3271 if actual := rule.Args["certificates"]; actual != expected {
3272 t.Errorf("certificates should be %q, not %q", expected, actual)
3273 }
3274 })
3275 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003276 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003277 apex {
3278 name: "myapex_keytest",
3279 key: "myapex.key",
3280 file_contexts: ":myapex-file_contexts",
3281 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003282 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003283 }
3284 apex_key {
3285 name: "myapex.key",
3286 public_key: "testkey.avbpubkey",
3287 private_key: "testkey.pem",
3288 }
3289 android_app_certificate {
3290 name: "myapex.certificate.override",
3291 certificate: "testkey.override",
3292 }`)
3293 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3294 expected := "testkey.override.x509.pem testkey.override.pk8"
3295 if actual := rule.Args["certificates"]; actual != expected {
3296 t.Errorf("certificates should be %q, not %q", expected, actual)
3297 }
3298 })
3299 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003300 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003301 apex {
3302 name: "myapex",
3303 key: "myapex.key",
3304 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003305 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003306 }
3307 apex_key {
3308 name: "myapex.key",
3309 public_key: "testkey.avbpubkey",
3310 private_key: "testkey.pem",
3311 }`)
3312 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3313 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3314 if actual := rule.Args["certificates"]; actual != expected {
3315 t.Errorf("certificates should be %q, not %q", expected, actual)
3316 }
3317 })
3318 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003319 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003320 apex {
3321 name: "myapex_keytest",
3322 key: "myapex.key",
3323 file_contexts: ":myapex-file_contexts",
3324 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003325 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003326 }
3327 apex_key {
3328 name: "myapex.key",
3329 public_key: "testkey.avbpubkey",
3330 private_key: "testkey.pem",
3331 }
3332 android_app_certificate {
3333 name: "myapex.certificate.override",
3334 certificate: "testkey.override",
3335 }`)
3336 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3337 expected := "testkey.override.x509.pem testkey.override.pk8"
3338 if actual := rule.Args["certificates"]; actual != expected {
3339 t.Errorf("certificates should be %q, not %q", expected, actual)
3340 }
3341 })
3342}
3343
Jiyong Park58e364a2019-01-19 19:24:06 +09003344func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003345 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003346 apex {
3347 name: "myapex",
3348 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003349 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003350 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003351 }
3352
3353 apex {
3354 name: "otherapex",
3355 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003356 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003357 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003358 }
3359
3360 apex_key {
3361 name: "myapex.key",
3362 public_key: "testkey.avbpubkey",
3363 private_key: "testkey.pem",
3364 }
3365
3366 cc_library {
3367 name: "mylib",
3368 srcs: ["mylib.cpp"],
3369 system_shared_libs: [],
3370 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003371 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003372 "myapex",
3373 "otherapex",
3374 ],
Jooyung Han24282772020-03-21 23:20:55 +09003375 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003376 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003377 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003378 cc_library {
3379 name: "mylib2",
3380 srcs: ["mylib.cpp"],
3381 system_shared_libs: [],
3382 stl: "none",
3383 apex_available: [
3384 "myapex",
3385 "otherapex",
3386 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003387 static_libs: ["mylib3"],
3388 recovery_available: true,
3389 min_sdk_version: "29",
3390 }
3391 cc_library {
3392 name: "mylib3",
3393 srcs: ["mylib.cpp"],
3394 system_shared_libs: [],
3395 stl: "none",
3396 apex_available: [
3397 "myapex",
3398 "otherapex",
3399 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003400 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003401 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003402 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003403 `)
3404
Jooyung Hanc87a0592020-03-02 17:44:33 +09003405 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003406 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003407 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003408
Vinh Tranf9754732023-01-19 22:41:46 -05003409 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003410 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003411 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003412
Vinh Tranf9754732023-01-19 22:41:46 -05003413 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003414 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003415 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003416
Colin Crossaede88c2020-08-11 12:17:01 -07003417 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3418 // each variant defines additional macros to distinguish which apex variant it is built for
3419
3420 // non-APEX variant does not have __ANDROID_APEX__ defined
3421 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3422 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3423
Vinh Tranf9754732023-01-19 22:41:46 -05003424 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003425 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3426 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003427
Jooyung Hanc87a0592020-03-02 17:44:33 +09003428 // non-APEX variant does not have __ANDROID_APEX__ defined
3429 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3430 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3431
Vinh Tranf9754732023-01-19 22:41:46 -05003432 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003433 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003434 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003435}
Jiyong Park7e636d02019-01-28 16:16:54 +09003436
3437func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003438 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003439 apex {
3440 name: "myapex",
3441 key: "myapex.key",
3442 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003443 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003444 }
3445
3446 apex_key {
3447 name: "myapex.key",
3448 public_key: "testkey.avbpubkey",
3449 private_key: "testkey.pem",
3450 }
3451
3452 cc_library_headers {
3453 name: "mylib_headers",
3454 export_include_dirs: ["my_include"],
3455 system_shared_libs: [],
3456 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003457 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003458 }
3459
3460 cc_library {
3461 name: "mylib",
3462 srcs: ["mylib.cpp"],
3463 system_shared_libs: [],
3464 stl: "none",
3465 header_libs: ["mylib_headers"],
3466 export_header_lib_headers: ["mylib_headers"],
3467 stubs: {
3468 versions: ["1", "2", "3"],
3469 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003470 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003471 }
3472
3473 cc_library {
3474 name: "otherlib",
3475 srcs: ["mylib.cpp"],
3476 system_shared_libs: [],
3477 stl: "none",
3478 shared_libs: ["mylib"],
3479 }
3480 `)
3481
Colin Cross7113d202019-11-20 16:39:12 -08003482 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003483
3484 // Ensure that the include path of the header lib is exported to 'otherlib'
3485 ensureContains(t, cFlags, "-Imy_include")
3486}
Alex Light9670d332019-01-29 18:07:33 -08003487
Jiyong Park7cd10e32020-01-14 09:22:18 +09003488type fileInApex struct {
3489 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003490 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003491 isLink bool
3492}
3493
Jooyung Han1724d582022-12-21 10:17:44 +09003494func (f fileInApex) String() string {
3495 return f.src + ":" + f.path
3496}
3497
3498func (f fileInApex) match(expectation string) bool {
3499 parts := strings.Split(expectation, ":")
3500 if len(parts) == 1 {
3501 match, _ := path.Match(parts[0], f.path)
3502 return match
3503 }
3504 if len(parts) == 2 {
3505 matchSrc, _ := path.Match(parts[0], f.src)
3506 matchDst, _ := path.Match(parts[1], f.path)
3507 return matchSrc && matchDst
3508 }
3509 panic("invalid expected file specification: " + expectation)
3510}
3511
Jooyung Hana57af4a2020-01-23 05:36:59 +00003512func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003513 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003514 module := ctx.ModuleForTests(moduleName, variant)
3515 apexRule := module.MaybeRule("apexRule")
3516 apexDir := "/image.apex/"
3517 if apexRule.Rule == nil {
3518 apexRule = module.Rule("zipApexRule")
3519 apexDir = "/image.zipapex/"
3520 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003521 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003522 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003523 for _, cmd := range strings.Split(copyCmds, "&&") {
3524 cmd = strings.TrimSpace(cmd)
3525 if cmd == "" {
3526 continue
3527 }
3528 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003529 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003530 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003531 switch terms[0] {
3532 case "mkdir":
3533 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003534 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003535 t.Fatal("copyCmds contains invalid cp command", cmd)
3536 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003537 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003538 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003539 isLink = false
3540 case "ln":
3541 if len(terms) != 3 && len(terms) != 4 {
3542 // ln LINK TARGET or ln -s LINK TARGET
3543 t.Fatal("copyCmds contains invalid ln command", cmd)
3544 }
3545 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003546 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003547 isLink = true
3548 default:
3549 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3550 }
3551 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003552 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003553 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003554 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003555 }
Jooyung Han1724d582022-12-21 10:17:44 +09003556 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003557 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003558 }
3559 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003560 return ret
3561}
3562
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003563func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003564 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003565 var failed bool
3566 var surplus []string
3567 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003568 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003569 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003570 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003571 if file.match(expected) {
3572 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003573 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003574 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003575 }
3576 }
Jooyung Han1724d582022-12-21 10:17:44 +09003577 if !matchFound {
3578 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003579 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003580 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003581
Jooyung Han31c470b2019-10-18 16:26:59 +09003582 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003583 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003584 t.Log("surplus files", surplus)
3585 failed = true
3586 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003587
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003588 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003589 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003590 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003591 if !filesMatched[expected] {
3592 missing = append(missing, expected)
3593 }
3594 }
3595 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003596 t.Log("missing files", missing)
3597 failed = true
3598 }
3599 if failed {
3600 t.Fail()
3601 }
3602}
3603
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003604func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3605 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3606}
3607
3608func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3609 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3610 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3611 if deapexer.Output != nil {
3612 outputs = append(outputs, deapexer.Output.String())
3613 }
3614 for _, output := range deapexer.ImplicitOutputs {
3615 outputs = append(outputs, output.String())
3616 }
3617 actualFiles := make([]fileInApex, 0, len(outputs))
3618 for _, output := range outputs {
3619 dir := "/deapexer/"
3620 pos := strings.LastIndex(output, dir)
3621 if pos == -1 {
3622 t.Fatal("Unknown deapexer output ", output)
3623 }
3624 path := output[pos+len(dir):]
3625 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3626 }
3627 assertFileListEquals(t, files, actualFiles)
3628}
3629
Jooyung Han344d5432019-08-23 11:17:39 +09003630func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003631 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003632 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003633 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003634 "etc/llndk.libraries.29.txt",
3635 "etc/vndkcore.libraries.29.txt",
3636 "etc/vndksp.libraries.29.txt",
3637 "etc/vndkprivate.libraries.29.txt",
3638 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003639 }
3640 testCases := []struct {
3641 vndkVersion string
3642 expectedFiles []string
3643 }{
3644 {
3645 vndkVersion: "current",
3646 expectedFiles: append(commonFiles,
3647 "lib/libvndk.so",
3648 "lib/libvndksp.so",
3649 "lib64/libvndk.so",
3650 "lib64/libvndksp.so"),
3651 },
3652 {
3653 vndkVersion: "",
3654 expectedFiles: append(commonFiles,
3655 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3656 "lib/libvndksp.so",
3657 "lib64/libvndksp.so"),
3658 },
3659 }
3660 for _, tc := range testCases {
3661 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3662 ctx := testApex(t, `
3663 apex_vndk {
3664 name: "com.android.vndk.current",
3665 key: "com.android.vndk.current.key",
3666 updatable: false,
3667 }
3668
3669 apex_key {
3670 name: "com.android.vndk.current.key",
3671 public_key: "testkey.avbpubkey",
3672 private_key: "testkey.pem",
3673 }
3674
3675 cc_library {
3676 name: "libvndk",
3677 srcs: ["mylib.cpp"],
3678 vendor_available: true,
3679 product_available: true,
3680 vndk: {
3681 enabled: true,
3682 },
3683 system_shared_libs: [],
3684 stl: "none",
3685 apex_available: [ "com.android.vndk.current" ],
3686 }
3687
3688 cc_library {
3689 name: "libvndksp",
3690 srcs: ["mylib.cpp"],
3691 vendor_available: true,
3692 product_available: true,
3693 vndk: {
3694 enabled: true,
3695 support_system_process: true,
3696 },
3697 system_shared_libs: [],
3698 stl: "none",
3699 apex_available: [ "com.android.vndk.current" ],
3700 }
3701
3702 // VNDK-Ext should not cause any problems
3703
3704 cc_library {
3705 name: "libvndk.ext",
3706 srcs: ["mylib2.cpp"],
3707 vendor: true,
3708 vndk: {
3709 enabled: true,
3710 extends: "libvndk",
3711 },
3712 system_shared_libs: [],
3713 stl: "none",
3714 }
3715
3716 cc_library {
3717 name: "libvndksp.ext",
3718 srcs: ["mylib2.cpp"],
3719 vendor: true,
3720 vndk: {
3721 enabled: true,
3722 support_system_process: true,
3723 extends: "libvndksp",
3724 },
3725 system_shared_libs: [],
3726 stl: "none",
3727 }
3728 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3729 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3730 }))
3731 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3732 })
3733 }
Jooyung Han344d5432019-08-23 11:17:39 +09003734}
3735
3736func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003737 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003738 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003739 name: "com.android.vndk.current",
3740 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003741 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003742 }
3743
3744 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003745 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003746 public_key: "testkey.avbpubkey",
3747 private_key: "testkey.pem",
3748 }
3749
3750 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003751 name: "libvndk",
3752 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003753 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003754 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003755 vndk: {
3756 enabled: true,
3757 },
3758 system_shared_libs: [],
3759 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003760 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003761 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003762
3763 cc_prebuilt_library_shared {
3764 name: "libvndk.arm",
3765 srcs: ["libvndk.arm.so"],
3766 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003767 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003768 vndk: {
3769 enabled: true,
3770 },
3771 enabled: false,
3772 arch: {
3773 arm: {
3774 enabled: true,
3775 },
3776 },
3777 system_shared_libs: [],
3778 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003779 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003780 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003781 `+vndkLibrariesTxtFiles("current"),
3782 withFiles(map[string][]byte{
3783 "libvndk.so": nil,
3784 "libvndk.arm.so": nil,
3785 }))
Colin Cross2807f002021-03-02 10:15:29 -08003786 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003787 "lib/libvndk.so",
3788 "lib/libvndk.arm.so",
3789 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003790 "lib/libc++.so",
3791 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003792 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003793 })
Jooyung Han344d5432019-08-23 11:17:39 +09003794}
3795
Jooyung Han39edb6c2019-11-06 16:53:07 +09003796func vndkLibrariesTxtFiles(vers ...string) (result string) {
3797 for _, v := range vers {
3798 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003799 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003800 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003801 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003802 name: "` + txt + `.libraries.txt",
3803 }
3804 `
3805 }
3806 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003807 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003808 result += `
3809 prebuilt_etc {
3810 name: "` + txt + `.libraries.` + v + `.txt",
3811 src: "dummy.txt",
3812 }
3813 `
3814 }
3815 }
3816 }
3817 return
3818}
3819
Jooyung Han344d5432019-08-23 11:17:39 +09003820func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003821 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003822 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003823 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003824 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003825 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003826 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003827 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003828 }
3829
3830 apex_key {
3831 name: "myapex.key",
3832 public_key: "testkey.avbpubkey",
3833 private_key: "testkey.pem",
3834 }
3835
Jooyung Han31c470b2019-10-18 16:26:59 +09003836 vndk_prebuilt_shared {
3837 name: "libvndk27",
3838 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003839 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003840 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003841 vndk: {
3842 enabled: true,
3843 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003844 target_arch: "arm64",
3845 arch: {
3846 arm: {
3847 srcs: ["libvndk27_arm.so"],
3848 },
3849 arm64: {
3850 srcs: ["libvndk27_arm64.so"],
3851 },
3852 },
Colin Cross2807f002021-03-02 10:15:29 -08003853 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003854 }
3855
3856 vndk_prebuilt_shared {
3857 name: "libvndk27",
3858 version: "27",
3859 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003860 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003861 vndk: {
3862 enabled: true,
3863 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003864 target_arch: "x86_64",
3865 arch: {
3866 x86: {
3867 srcs: ["libvndk27_x86.so"],
3868 },
3869 x86_64: {
3870 srcs: ["libvndk27_x86_64.so"],
3871 },
3872 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003873 }
3874 `+vndkLibrariesTxtFiles("27"),
3875 withFiles(map[string][]byte{
3876 "libvndk27_arm.so": nil,
3877 "libvndk27_arm64.so": nil,
3878 "libvndk27_x86.so": nil,
3879 "libvndk27_x86_64.so": nil,
3880 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003881
Colin Cross2807f002021-03-02 10:15:29 -08003882 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003883 "lib/libvndk27_arm.so",
3884 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003885 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003886 })
Jooyung Han344d5432019-08-23 11:17:39 +09003887}
3888
Jooyung Han90eee022019-10-01 20:02:42 +09003889func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003890 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003891 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003892 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003893 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003894 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003895 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003896 }
3897 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003898 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003899 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003900 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003901 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003902 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003903 }
3904 apex_key {
3905 name: "myapex.key",
3906 public_key: "testkey.avbpubkey",
3907 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003908 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003909
3910 assertApexName := func(expected, moduleName string) {
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09003911 module := ctx.ModuleForTests(moduleName, "android_common_image")
3912 apexManifestRule := module.Rule("apexManifestRule")
3913 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09003914 }
3915
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003916 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003917 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003918}
3919
Jooyung Han344d5432019-08-23 11:17:39 +09003920func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003921 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003922 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003923 name: "com.android.vndk.current",
3924 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003925 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003926 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003927 }
3928
3929 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003930 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003931 public_key: "testkey.avbpubkey",
3932 private_key: "testkey.pem",
3933 }
3934
3935 cc_library {
3936 name: "libvndk",
3937 srcs: ["mylib.cpp"],
3938 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003939 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003940 native_bridge_supported: true,
3941 host_supported: true,
3942 vndk: {
3943 enabled: true,
3944 },
3945 system_shared_libs: [],
3946 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003947 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003948 }
Colin Cross2807f002021-03-02 10:15:29 -08003949 `+vndkLibrariesTxtFiles("current"),
3950 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003951
Colin Cross2807f002021-03-02 10:15:29 -08003952 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003953 "lib/libvndk.so",
3954 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003955 "lib/libc++.so",
3956 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003957 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003958 })
Jooyung Han344d5432019-08-23 11:17:39 +09003959}
3960
3961func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003962 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003963 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003964 name: "com.android.vndk.current",
3965 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003966 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003967 native_bridge_supported: true,
3968 }
3969
3970 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003971 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003972 public_key: "testkey.avbpubkey",
3973 private_key: "testkey.pem",
3974 }
3975
3976 cc_library {
3977 name: "libvndk",
3978 srcs: ["mylib.cpp"],
3979 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003980 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003981 native_bridge_supported: true,
3982 host_supported: true,
3983 vndk: {
3984 enabled: true,
3985 },
3986 system_shared_libs: [],
3987 stl: "none",
3988 }
3989 `)
3990}
3991
Jooyung Han31c470b2019-10-18 16:26:59 +09003992func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003993 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003994 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003995 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003996 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003997 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003998 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003999 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004000 }
4001
4002 apex_key {
4003 name: "myapex.key",
4004 public_key: "testkey.avbpubkey",
4005 private_key: "testkey.pem",
4006 }
4007
4008 vndk_prebuilt_shared {
4009 name: "libvndk27",
4010 version: "27",
4011 target_arch: "arm",
4012 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004013 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004014 vndk: {
4015 enabled: true,
4016 },
4017 arch: {
4018 arm: {
4019 srcs: ["libvndk27.so"],
4020 }
4021 },
4022 }
4023
4024 vndk_prebuilt_shared {
4025 name: "libvndk27",
4026 version: "27",
4027 target_arch: "arm",
4028 binder32bit: true,
4029 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004030 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004031 vndk: {
4032 enabled: true,
4033 },
4034 arch: {
4035 arm: {
4036 srcs: ["libvndk27binder32.so"],
4037 }
4038 },
Colin Cross2807f002021-03-02 10:15:29 -08004039 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004040 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004041 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004042 withFiles(map[string][]byte{
4043 "libvndk27.so": nil,
4044 "libvndk27binder32.so": nil,
4045 }),
4046 withBinder32bit,
4047 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004048 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004049 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4050 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004051 },
4052 }),
4053 )
4054
Colin Cross2807f002021-03-02 10:15:29 -08004055 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004056 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004057 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004058 })
4059}
4060
Jooyung Han45a96772020-06-15 14:59:42 +09004061func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004062 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004063 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004064 name: "com.android.vndk.current",
4065 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004066 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004067 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004068 }
4069
4070 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004071 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004072 public_key: "testkey.avbpubkey",
4073 private_key: "testkey.pem",
4074 }
4075
4076 cc_library {
4077 name: "libz",
4078 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004079 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004080 vndk: {
4081 enabled: true,
4082 },
4083 stubs: {
4084 symbol_file: "libz.map.txt",
4085 versions: ["30"],
4086 }
4087 }
4088 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4089 "libz.map.txt": nil,
4090 }))
4091
Colin Cross2807f002021-03-02 10:15:29 -08004092 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004093 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4094 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09004095 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
4096 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4097 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4098 "*/*",
4099 })
Jooyung Han45a96772020-06-15 14:59:42 +09004100}
4101
Jooyung Hane1633032019-08-01 17:41:43 +09004102func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004103 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004104 apex {
4105 name: "myapex_nodep",
4106 key: "myapex.key",
4107 native_shared_libs: ["lib_nodep"],
4108 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004109 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004110 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004111 }
4112
4113 apex {
4114 name: "myapex_dep",
4115 key: "myapex.key",
4116 native_shared_libs: ["lib_dep"],
4117 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004118 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004119 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004120 }
4121
4122 apex {
4123 name: "myapex_provider",
4124 key: "myapex.key",
4125 native_shared_libs: ["libfoo"],
4126 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004127 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004128 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004129 }
4130
4131 apex {
4132 name: "myapex_selfcontained",
4133 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004134 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004135 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004136 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004137 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004138 }
4139
4140 apex_key {
4141 name: "myapex.key",
4142 public_key: "testkey.avbpubkey",
4143 private_key: "testkey.pem",
4144 }
4145
4146 cc_library {
4147 name: "lib_nodep",
4148 srcs: ["mylib.cpp"],
4149 system_shared_libs: [],
4150 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004151 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004152 }
4153
4154 cc_library {
4155 name: "lib_dep",
4156 srcs: ["mylib.cpp"],
4157 shared_libs: ["libfoo"],
4158 system_shared_libs: [],
4159 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004160 apex_available: [
4161 "myapex_dep",
4162 "myapex_provider",
4163 "myapex_selfcontained",
4164 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004165 }
4166
4167 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004168 name: "lib_dep_on_bar",
4169 srcs: ["mylib.cpp"],
4170 shared_libs: ["libbar"],
4171 system_shared_libs: [],
4172 stl: "none",
4173 apex_available: [
4174 "myapex_selfcontained",
4175 ],
4176 }
4177
4178
4179 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004180 name: "libfoo",
4181 srcs: ["mytest.cpp"],
4182 stubs: {
4183 versions: ["1"],
4184 },
4185 system_shared_libs: [],
4186 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004187 apex_available: [
4188 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004189 ],
4190 }
4191
4192 cc_library {
4193 name: "libbar",
4194 srcs: ["mytest.cpp"],
4195 stubs: {
4196 versions: ["1"],
4197 },
4198 system_shared_libs: [],
4199 stl: "none",
4200 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004201 "myapex_selfcontained",
4202 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004203 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004204
Jooyung Hane1633032019-08-01 17:41:43 +09004205 `)
4206
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004207 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004208 var provideNativeLibs, requireNativeLibs []string
4209
Sundong Ahnabb64432019-10-22 13:58:29 +09004210 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004211 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4212 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004213 ensureListEmpty(t, provideNativeLibs)
4214 ensureListEmpty(t, requireNativeLibs)
4215
Sundong Ahnabb64432019-10-22 13:58:29 +09004216 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004217 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4218 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004219 ensureListEmpty(t, provideNativeLibs)
4220 ensureListContains(t, requireNativeLibs, "libfoo.so")
4221
Sundong Ahnabb64432019-10-22 13:58:29 +09004222 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004223 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4224 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004225 ensureListContains(t, provideNativeLibs, "libfoo.so")
4226 ensureListEmpty(t, requireNativeLibs)
4227
Sundong Ahnabb64432019-10-22 13:58:29 +09004228 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004229 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4230 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004231 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004232 ensureListEmpty(t, requireNativeLibs)
4233}
4234
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004235func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4236 ctx := testApex(t, `
4237 apex {
4238 name: "myapex",
4239 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004240 native_shared_libs: ["mylib"],
4241 updatable: false,
4242 }
4243
4244 apex_key {
4245 name: "myapex.key",
4246 public_key: "testkey.avbpubkey",
4247 private_key: "testkey.pem",
4248 }
4249
4250 cc_library {
4251 name: "mylib",
4252 srcs: ["mylib.cpp"],
4253 system_shared_libs: [],
4254 stl: "none",
4255 apex_available: [
4256 "//apex_available:platform",
4257 "myapex",
4258 ],
4259 }
4260 `, android.FixtureMergeEnv(map[string]string{
4261 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4262 }))
4263
Jooyung Han63dff462023-02-09 00:11:27 +00004264 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004265 apexManifestRule := module.Rule("apexManifestRule")
4266 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4267}
4268
Vinh Tran8f5310f2022-10-07 18:16:47 -04004269func TestCompileMultilibProp(t *testing.T) {
4270 testCases := []struct {
4271 compileMultiLibProp string
4272 containedLibs []string
4273 notContainedLibs []string
4274 }{
4275 {
4276 containedLibs: []string{
4277 "image.apex/lib64/mylib.so",
4278 "image.apex/lib/mylib.so",
4279 },
4280 compileMultiLibProp: `compile_multilib: "both",`,
4281 },
4282 {
4283 containedLibs: []string{"image.apex/lib64/mylib.so"},
4284 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4285 compileMultiLibProp: `compile_multilib: "first",`,
4286 },
4287 {
4288 containedLibs: []string{"image.apex/lib64/mylib.so"},
4289 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4290 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4291 },
4292 {
4293 containedLibs: []string{"image.apex/lib64/mylib.so"},
4294 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4295 compileMultiLibProp: `compile_multilib: "64",`,
4296 },
4297 {
4298 containedLibs: []string{"image.apex/lib/mylib.so"},
4299 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4300 compileMultiLibProp: `compile_multilib: "32",`,
4301 },
4302 }
4303 for _, testCase := range testCases {
4304 ctx := testApex(t, fmt.Sprintf(`
4305 apex {
4306 name: "myapex",
4307 key: "myapex.key",
4308 %s
4309 native_shared_libs: ["mylib"],
4310 updatable: false,
4311 }
4312 apex_key {
4313 name: "myapex.key",
4314 public_key: "testkey.avbpubkey",
4315 private_key: "testkey.pem",
4316 }
4317 cc_library {
4318 name: "mylib",
4319 srcs: ["mylib.cpp"],
4320 apex_available: [
4321 "//apex_available:platform",
4322 "myapex",
4323 ],
4324 }
4325 `, testCase.compileMultiLibProp),
4326 )
4327 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4328 apexRule := module.Rule("apexRule")
4329 copyCmds := apexRule.Args["copy_commands"]
4330 for _, containedLib := range testCase.containedLibs {
4331 ensureContains(t, copyCmds, containedLib)
4332 }
4333 for _, notContainedLib := range testCase.notContainedLibs {
4334 ensureNotContains(t, copyCmds, notContainedLib)
4335 }
4336 }
4337}
4338
Alex Light0851b882019-02-07 13:20:53 -08004339func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004340 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004341 apex {
4342 name: "myapex",
4343 key: "myapex.key",
4344 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004345 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004346 }
4347
4348 apex_key {
4349 name: "myapex.key",
4350 public_key: "testkey.avbpubkey",
4351 private_key: "testkey.pem",
4352 }
4353
4354 cc_library {
4355 name: "mylib_common",
4356 srcs: ["mylib.cpp"],
4357 system_shared_libs: [],
4358 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004359 apex_available: [
4360 "//apex_available:platform",
4361 "myapex",
4362 ],
Alex Light0851b882019-02-07 13:20:53 -08004363 }
4364 `)
4365
Sundong Ahnabb64432019-10-22 13:58:29 +09004366 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004367 apexRule := module.Rule("apexRule")
4368 copyCmds := apexRule.Args["copy_commands"]
4369
4370 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4371 t.Log("Apex was a test apex!")
4372 t.Fail()
4373 }
4374 // Ensure that main rule creates an output
4375 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4376
4377 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004378 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004379
4380 // Ensure that both direct and indirect deps are copied into apex
4381 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4382
Colin Cross7113d202019-11-20 16:39:12 -08004383 // Ensure that the platform variant ends with _shared
4384 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004385
Colin Cross56a83212020-09-15 18:30:11 -07004386 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004387 t.Log("Found mylib_common not in any apex!")
4388 t.Fail()
4389 }
4390}
4391
4392func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004393 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004394 apex_test {
4395 name: "myapex",
4396 key: "myapex.key",
4397 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004398 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004399 }
4400
4401 apex_key {
4402 name: "myapex.key",
4403 public_key: "testkey.avbpubkey",
4404 private_key: "testkey.pem",
4405 }
4406
4407 cc_library {
4408 name: "mylib_common_test",
4409 srcs: ["mylib.cpp"],
4410 system_shared_libs: [],
4411 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004412 // TODO: remove //apex_available:platform
4413 apex_available: [
4414 "//apex_available:platform",
4415 "myapex",
4416 ],
Alex Light0851b882019-02-07 13:20:53 -08004417 }
4418 `)
4419
Sundong Ahnabb64432019-10-22 13:58:29 +09004420 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004421 apexRule := module.Rule("apexRule")
4422 copyCmds := apexRule.Args["copy_commands"]
4423
4424 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4425 t.Log("Apex was not a test apex!")
4426 t.Fail()
4427 }
4428 // Ensure that main rule creates an output
4429 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4430
4431 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004432 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004433
4434 // Ensure that both direct and indirect deps are copied into apex
4435 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4436
Colin Cross7113d202019-11-20 16:39:12 -08004437 // Ensure that the platform variant ends with _shared
4438 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004439}
4440
Alex Light9670d332019-01-29 18:07:33 -08004441func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004442 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004443 apex {
4444 name: "myapex",
4445 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004446 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004447 multilib: {
4448 first: {
4449 native_shared_libs: ["mylib_common"],
4450 }
4451 },
4452 target: {
4453 android: {
4454 multilib: {
4455 first: {
4456 native_shared_libs: ["mylib"],
4457 }
4458 }
4459 },
4460 host: {
4461 multilib: {
4462 first: {
4463 native_shared_libs: ["mylib2"],
4464 }
4465 }
4466 }
4467 }
4468 }
4469
4470 apex_key {
4471 name: "myapex.key",
4472 public_key: "testkey.avbpubkey",
4473 private_key: "testkey.pem",
4474 }
4475
4476 cc_library {
4477 name: "mylib",
4478 srcs: ["mylib.cpp"],
4479 system_shared_libs: [],
4480 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004481 // TODO: remove //apex_available:platform
4482 apex_available: [
4483 "//apex_available:platform",
4484 "myapex",
4485 ],
Alex Light9670d332019-01-29 18:07:33 -08004486 }
4487
4488 cc_library {
4489 name: "mylib_common",
4490 srcs: ["mylib.cpp"],
4491 system_shared_libs: [],
4492 stl: "none",
4493 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004494 // TODO: remove //apex_available:platform
4495 apex_available: [
4496 "//apex_available:platform",
4497 "myapex",
4498 ],
Alex Light9670d332019-01-29 18:07:33 -08004499 }
4500
4501 cc_library {
4502 name: "mylib2",
4503 srcs: ["mylib.cpp"],
4504 system_shared_libs: [],
4505 stl: "none",
4506 compile_multilib: "first",
4507 }
4508 `)
4509
Sundong Ahnabb64432019-10-22 13:58:29 +09004510 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004511 copyCmds := apexRule.Args["copy_commands"]
4512
4513 // Ensure that main rule creates an output
4514 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4515
4516 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004517 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4518 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4519 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004520
4521 // Ensure that both direct and indirect deps are copied into apex
4522 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4523 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4524 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4525
Colin Cross7113d202019-11-20 16:39:12 -08004526 // Ensure that the platform variant ends with _shared
4527 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4528 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4529 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004530}
Jiyong Park04480cf2019-02-06 00:16:29 +09004531
Jiyong Park59140302020-12-14 18:44:04 +09004532func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004533 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004534 apex {
4535 name: "myapex",
4536 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004537 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004538 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004539 arch: {
4540 arm64: {
4541 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004542 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004543 },
4544 x86_64: {
4545 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004546 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004547 },
4548 }
4549 }
4550
4551 apex_key {
4552 name: "myapex.key",
4553 public_key: "testkey.avbpubkey",
4554 private_key: "testkey.pem",
4555 }
4556
4557 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004558 name: "mylib.generic",
4559 srcs: ["mylib.cpp"],
4560 system_shared_libs: [],
4561 stl: "none",
4562 // TODO: remove //apex_available:platform
4563 apex_available: [
4564 "//apex_available:platform",
4565 "myapex",
4566 ],
4567 }
4568
4569 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004570 name: "mylib.arm64",
4571 srcs: ["mylib.cpp"],
4572 system_shared_libs: [],
4573 stl: "none",
4574 // TODO: remove //apex_available:platform
4575 apex_available: [
4576 "//apex_available:platform",
4577 "myapex",
4578 ],
4579 }
4580
4581 cc_library {
4582 name: "mylib.x64",
4583 srcs: ["mylib.cpp"],
4584 system_shared_libs: [],
4585 stl: "none",
4586 // TODO: remove //apex_available:platform
4587 apex_available: [
4588 "//apex_available:platform",
4589 "myapex",
4590 ],
4591 }
4592 `)
4593
4594 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4595 copyCmds := apexRule.Args["copy_commands"]
4596
4597 // Ensure that apex variant is created for the direct dep
4598 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004599 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004600 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4601
4602 // Ensure that both direct and indirect deps are copied into apex
4603 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4604 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4605}
4606
Jiyong Park04480cf2019-02-06 00:16:29 +09004607func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004608 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004609 apex {
4610 name: "myapex",
4611 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004612 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004613 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004614 }
4615
4616 apex_key {
4617 name: "myapex.key",
4618 public_key: "testkey.avbpubkey",
4619 private_key: "testkey.pem",
4620 }
4621
4622 sh_binary {
4623 name: "myscript",
4624 src: "mylib.cpp",
4625 filename: "myscript.sh",
4626 sub_dir: "script",
4627 }
4628 `)
4629
Sundong Ahnabb64432019-10-22 13:58:29 +09004630 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004631 copyCmds := apexRule.Args["copy_commands"]
4632
4633 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4634}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004635
Jooyung Han91df2082019-11-20 01:49:42 +09004636func TestApexInVariousPartition(t *testing.T) {
4637 testcases := []struct {
4638 propName, parition, flattenedPartition string
4639 }{
4640 {"", "system", "system_ext"},
4641 {"product_specific: true", "product", "product"},
4642 {"soc_specific: true", "vendor", "vendor"},
4643 {"proprietary: true", "vendor", "vendor"},
4644 {"vendor: true", "vendor", "vendor"},
4645 {"system_ext_specific: true", "system_ext", "system_ext"},
4646 }
4647 for _, tc := range testcases {
4648 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004649 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004650 apex {
4651 name: "myapex",
4652 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004653 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004654 `+tc.propName+`
4655 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004656
Jooyung Han91df2082019-11-20 01:49:42 +09004657 apex_key {
4658 name: "myapex.key",
4659 public_key: "testkey.avbpubkey",
4660 private_key: "testkey.pem",
4661 }
4662 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004663
Jooyung Han91df2082019-11-20 01:49:42 +09004664 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004665 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4666 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004667 if actual != expected {
4668 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4669 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004670
Jooyung Han91df2082019-11-20 01:49:42 +09004671 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004672 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4673 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004674 if actual != expected {
4675 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4676 }
4677 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004678 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004679}
Jiyong Park67882562019-03-21 01:11:21 +09004680
Jooyung Han580eb4f2020-06-24 19:33:06 +09004681func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004682 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004683 apex {
4684 name: "myapex",
4685 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004686 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004687 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004688
Jooyung Han580eb4f2020-06-24 19:33:06 +09004689 apex_key {
4690 name: "myapex.key",
4691 public_key: "testkey.avbpubkey",
4692 private_key: "testkey.pem",
4693 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004694 `)
4695 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004696 rule := module.Output("file_contexts")
4697 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4698}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004699
Jooyung Han580eb4f2020-06-24 19:33:06 +09004700func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004701 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004702 apex {
4703 name: "myapex",
4704 key: "myapex.key",
4705 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004706 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004707 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004708
Jooyung Han580eb4f2020-06-24 19:33:06 +09004709 apex_key {
4710 name: "myapex.key",
4711 public_key: "testkey.avbpubkey",
4712 private_key: "testkey.pem",
4713 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004714 `, withFiles(map[string][]byte{
4715 "my_own_file_contexts": nil,
4716 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004717}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004718
Jooyung Han580eb4f2020-06-24 19:33:06 +09004719func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004720 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004721 apex {
4722 name: "myapex",
4723 key: "myapex.key",
4724 product_specific: true,
4725 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004726 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004727 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004728
Jooyung Han580eb4f2020-06-24 19:33:06 +09004729 apex_key {
4730 name: "myapex.key",
4731 public_key: "testkey.avbpubkey",
4732 private_key: "testkey.pem",
4733 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004734 `)
4735
Colin Cross1c460562021-02-16 17:55:47 -08004736 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004737 apex {
4738 name: "myapex",
4739 key: "myapex.key",
4740 product_specific: true,
4741 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004742 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004743 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004744
Jooyung Han580eb4f2020-06-24 19:33:06 +09004745 apex_key {
4746 name: "myapex.key",
4747 public_key: "testkey.avbpubkey",
4748 private_key: "testkey.pem",
4749 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004750 `, withFiles(map[string][]byte{
4751 "product_specific_file_contexts": nil,
4752 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004753 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4754 rule := module.Output("file_contexts")
4755 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4756}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004757
Jooyung Han580eb4f2020-06-24 19:33:06 +09004758func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004759 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004760 apex {
4761 name: "myapex",
4762 key: "myapex.key",
4763 product_specific: true,
4764 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004765 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004766 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004767
Jooyung Han580eb4f2020-06-24 19:33:06 +09004768 apex_key {
4769 name: "myapex.key",
4770 public_key: "testkey.avbpubkey",
4771 private_key: "testkey.pem",
4772 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004773
Jooyung Han580eb4f2020-06-24 19:33:06 +09004774 filegroup {
4775 name: "my-file-contexts",
4776 srcs: ["product_specific_file_contexts"],
4777 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004778 `, withFiles(map[string][]byte{
4779 "product_specific_file_contexts": nil,
4780 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004781 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4782 rule := module.Output("file_contexts")
4783 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004784}
4785
Jiyong Park67882562019-03-21 01:11:21 +09004786func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004787 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004788 apex_key {
4789 name: "myapex.key",
4790 public_key: ":my.avbpubkey",
4791 private_key: ":my.pem",
4792 product_specific: true,
4793 }
4794
4795 filegroup {
4796 name: "my.avbpubkey",
4797 srcs: ["testkey2.avbpubkey"],
4798 }
4799
4800 filegroup {
4801 name: "my.pem",
4802 srcs: ["testkey2.pem"],
4803 }
4804 `)
4805
4806 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4807 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004808 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004809 if actual_pubkey != expected_pubkey {
4810 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4811 }
4812 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004813 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004814 if actual_privkey != expected_privkey {
4815 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4816 }
4817}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004818
4819func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004820 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004821 prebuilt_apex {
4822 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004823 arch: {
4824 arm64: {
4825 src: "myapex-arm64.apex",
4826 },
4827 arm: {
4828 src: "myapex-arm.apex",
4829 },
4830 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004831 }
4832 `)
4833
Wei Li340ee8e2022-03-18 17:33:24 -07004834 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4835 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004836
Jiyong Parkc95714e2019-03-29 14:23:10 +09004837 expectedInput := "myapex-arm64.apex"
4838 if prebuilt.inputApex.String() != expectedInput {
4839 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4840 }
Wei Li340ee8e2022-03-18 17:33:24 -07004841 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4842 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4843 rule := testingModule.Rule("genProvenanceMetaData")
4844 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4845 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4846 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4847 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004848
4849 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4850 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004851}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004852
Paul Duffinc0609c62021-03-01 17:27:16 +00004853func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004854 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004855 prebuilt_apex {
4856 name: "myapex",
4857 }
4858 `)
4859}
4860
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004861func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004862 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004863 prebuilt_apex {
4864 name: "myapex",
4865 src: "myapex-arm.apex",
4866 filename: "notmyapex.apex",
4867 }
4868 `)
4869
Wei Li340ee8e2022-03-18 17:33:24 -07004870 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4871 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004872
4873 expected := "notmyapex.apex"
4874 if p.installFilename != expected {
4875 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4876 }
Wei Li340ee8e2022-03-18 17:33:24 -07004877 rule := testingModule.Rule("genProvenanceMetaData")
4878 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4879 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4880 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4881 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004882}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004883
Samiul Islam7c02e262021-09-08 17:48:28 +01004884func TestApexSetFilenameOverride(t *testing.T) {
4885 testApex(t, `
4886 apex_set {
4887 name: "com.company.android.myapex",
4888 apex_name: "com.android.myapex",
4889 set: "company-myapex.apks",
4890 filename: "com.company.android.myapex.apex"
4891 }
4892 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4893
4894 testApex(t, `
4895 apex_set {
4896 name: "com.company.android.myapex",
4897 apex_name: "com.android.myapex",
4898 set: "company-myapex.apks",
4899 filename: "com.company.android.myapex.capex"
4900 }
4901 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4902
4903 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4904 apex_set {
4905 name: "com.company.android.myapex",
4906 apex_name: "com.android.myapex",
4907 set: "company-myapex.apks",
4908 filename: "some-random-suffix"
4909 }
4910 `)
4911}
4912
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004913func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004914 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004915 prebuilt_apex {
4916 name: "myapex.prebuilt",
4917 src: "myapex-arm.apex",
4918 overrides: [
4919 "myapex",
4920 ],
4921 }
4922 `)
4923
Wei Li340ee8e2022-03-18 17:33:24 -07004924 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4925 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004926
4927 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004928 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004929 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004930 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004931 }
Wei Li340ee8e2022-03-18 17:33:24 -07004932 rule := testingModule.Rule("genProvenanceMetaData")
4933 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4934 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4935 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4936 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004937}
4938
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004939func TestPrebuiltApexName(t *testing.T) {
4940 testApex(t, `
4941 prebuilt_apex {
4942 name: "com.company.android.myapex",
4943 apex_name: "com.android.myapex",
4944 src: "company-myapex-arm.apex",
4945 }
4946 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4947
4948 testApex(t, `
4949 apex_set {
4950 name: "com.company.android.myapex",
4951 apex_name: "com.android.myapex",
4952 set: "company-myapex.apks",
4953 }
4954 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4955}
4956
4957func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4958 _ = android.GroupFixturePreparers(
4959 java.PrepareForTestWithJavaDefaultModules,
4960 PrepareForTestWithApexBuildComponents,
4961 android.FixtureWithRootAndroidBp(`
4962 platform_bootclasspath {
4963 name: "platform-bootclasspath",
4964 fragments: [
4965 {
4966 apex: "com.android.art",
4967 module: "art-bootclasspath-fragment",
4968 },
4969 ],
4970 }
4971
4972 prebuilt_apex {
4973 name: "com.company.android.art",
4974 apex_name: "com.android.art",
4975 src: "com.company.android.art-arm.apex",
4976 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4977 }
4978
4979 prebuilt_bootclasspath_fragment {
4980 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004981 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004982 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004983 hidden_api: {
4984 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4985 metadata: "my-bootclasspath-fragment/metadata.csv",
4986 index: "my-bootclasspath-fragment/index.csv",
4987 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4988 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4989 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004990 }
4991
4992 java_import {
4993 name: "core-oj",
4994 jars: ["prebuilt.jar"],
4995 }
4996 `),
4997 ).RunTest(t)
4998}
4999
Paul Duffin092153d2021-01-26 11:42:39 +00005000// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5001// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005002func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005003 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005004
Paul Duffin89886cb2021-02-05 16:44:03 +00005005 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005006 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005007 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005008 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005009 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005010 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005011 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5012 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5013 android.NormalizePathForTesting(dexJarBuildPath))
5014 }
5015
5016 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005017 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005018 // Make sure the import has been given the correct path to the dex jar.
5019 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5020 dexJarBuildPath := p.DexJarInstallPath()
5021 stem := android.RemoveOptionalPrebuiltPrefix(name)
5022 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5023 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5024 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005025 }
5026
Paul Duffin39853512021-02-26 11:09:39 +00005027 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005028 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005029 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005030 android.AssertArrayString(t, "Check if there is no source variant",
5031 []string{"android_common"},
5032 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005033 }
5034
5035 t.Run("prebuilt only", func(t *testing.T) {
5036 bp := `
5037 prebuilt_apex {
5038 name: "myapex",
5039 arch: {
5040 arm64: {
5041 src: "myapex-arm64.apex",
5042 },
5043 arm: {
5044 src: "myapex-arm.apex",
5045 },
5046 },
Paul Duffin39853512021-02-26 11:09:39 +00005047 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005048 }
5049
5050 java_import {
5051 name: "libfoo",
5052 jars: ["libfoo.jar"],
5053 }
Paul Duffin39853512021-02-26 11:09:39 +00005054
5055 java_sdk_library_import {
5056 name: "libbar",
5057 public: {
5058 jars: ["libbar.jar"],
5059 },
5060 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005061 `
5062
5063 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5064 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5065
Martin Stjernholm44825602021-09-17 01:44:12 +01005066 deapexerName := deapexerModuleName("myapex")
5067 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5068
Paul Duffinf6932af2021-02-26 18:21:56 +00005069 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005070 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005071 rule := deapexer.Rule("deapexer")
5072 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5073 t.Errorf("expected: %q, found: %q", expected, actual)
5074 }
5075
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005076 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005077 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005078 rule = prebuiltApex.Rule("android/soong/android.Cp")
5079 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5080 t.Errorf("expected: %q, found: %q", expected, actual)
5081 }
5082
Paul Duffin89886cb2021-02-05 16:44:03 +00005083 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005084 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005085
5086 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005087 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005088 })
5089
5090 t.Run("prebuilt with source preferred", func(t *testing.T) {
5091
5092 bp := `
5093 prebuilt_apex {
5094 name: "myapex",
5095 arch: {
5096 arm64: {
5097 src: "myapex-arm64.apex",
5098 },
5099 arm: {
5100 src: "myapex-arm.apex",
5101 },
5102 },
Paul Duffin39853512021-02-26 11:09:39 +00005103 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005104 }
5105
5106 java_import {
5107 name: "libfoo",
5108 jars: ["libfoo.jar"],
5109 }
5110
5111 java_library {
5112 name: "libfoo",
5113 }
Paul Duffin39853512021-02-26 11:09:39 +00005114
5115 java_sdk_library_import {
5116 name: "libbar",
5117 public: {
5118 jars: ["libbar.jar"],
5119 },
5120 }
5121
5122 java_sdk_library {
5123 name: "libbar",
5124 srcs: ["foo/bar/MyClass.java"],
5125 unsafe_ignore_missing_latest_api: true,
5126 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005127 `
5128
5129 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5130 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5131
Paul Duffin89886cb2021-02-05 16:44:03 +00005132 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005133 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005134 ensureNoSourceVariant(t, ctx, "libfoo")
5135
5136 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005137 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005138 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005139 })
5140
5141 t.Run("prebuilt preferred with source", func(t *testing.T) {
5142 bp := `
5143 prebuilt_apex {
5144 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005145 arch: {
5146 arm64: {
5147 src: "myapex-arm64.apex",
5148 },
5149 arm: {
5150 src: "myapex-arm.apex",
5151 },
5152 },
Paul Duffin39853512021-02-26 11:09:39 +00005153 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005154 }
5155
5156 java_import {
5157 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005158 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005159 jars: ["libfoo.jar"],
5160 }
5161
5162 java_library {
5163 name: "libfoo",
5164 }
Paul Duffin39853512021-02-26 11:09:39 +00005165
5166 java_sdk_library_import {
5167 name: "libbar",
5168 prefer: true,
5169 public: {
5170 jars: ["libbar.jar"],
5171 },
5172 }
5173
5174 java_sdk_library {
5175 name: "libbar",
5176 srcs: ["foo/bar/MyClass.java"],
5177 unsafe_ignore_missing_latest_api: true,
5178 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005179 `
5180
5181 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5182 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5183
Paul Duffin89886cb2021-02-05 16:44:03 +00005184 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005185 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005186 ensureNoSourceVariant(t, ctx, "libfoo")
5187
5188 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005189 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005190 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005191 })
5192}
5193
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005194func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005195 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005196 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005197 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5198 // is disabled.
5199 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5200 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005201
Paul Duffin37856732021-02-26 14:24:15 +00005202 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5203 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005204 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005205 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005206 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005207 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005208 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005209 foundLibfooJar = true
5210 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005211 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005212 }
5213 }
5214 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005215 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 +00005216 }
5217 }
5218
Paul Duffin40a3f652021-07-19 13:11:24 +01005219 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005220 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005221 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005222 var rule android.TestingBuildParams
5223
5224 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5225 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005226 }
5227
Paul Duffin40a3f652021-07-19 13:11:24 +01005228 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5229 t.Helper()
5230 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5231 var rule android.TestingBuildParams
5232
5233 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5234 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5235 }
5236
Paul Duffin89f570a2021-06-16 01:42:33 +01005237 fragment := java.ApexVariantReference{
5238 Apex: proptools.StringPtr("myapex"),
5239 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5240 }
5241
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005242 t.Run("prebuilt only", func(t *testing.T) {
5243 bp := `
5244 prebuilt_apex {
5245 name: "myapex",
5246 arch: {
5247 arm64: {
5248 src: "myapex-arm64.apex",
5249 },
5250 arm: {
5251 src: "myapex-arm.apex",
5252 },
5253 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005254 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5255 }
5256
5257 prebuilt_bootclasspath_fragment {
5258 name: "my-bootclasspath-fragment",
5259 contents: ["libfoo", "libbar"],
5260 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005261 hidden_api: {
5262 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5263 metadata: "my-bootclasspath-fragment/metadata.csv",
5264 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005265 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5266 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5267 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005268 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005269 }
5270
5271 java_import {
5272 name: "libfoo",
5273 jars: ["libfoo.jar"],
5274 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005275 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005276 }
Paul Duffin37856732021-02-26 14:24:15 +00005277
5278 java_sdk_library_import {
5279 name: "libbar",
5280 public: {
5281 jars: ["libbar.jar"],
5282 },
5283 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005284 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005285 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005286 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005287 `
5288
Paul Duffin89f570a2021-06-16 01:42:33 +01005289 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005290 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5291 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005292
Paul Duffin537ea3d2021-05-14 10:38:00 +01005293 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005294 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005295 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005296 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005297 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5298 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005299 })
5300
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005301 t.Run("apex_set only", func(t *testing.T) {
5302 bp := `
5303 apex_set {
5304 name: "myapex",
5305 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005306 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005307 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005308 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5309 }
5310
5311 java_import {
5312 name: "myjavalib",
5313 jars: ["myjavalib.jar"],
5314 apex_available: ["myapex"],
5315 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005316 }
5317
5318 prebuilt_bootclasspath_fragment {
5319 name: "my-bootclasspath-fragment",
5320 contents: ["libfoo", "libbar"],
5321 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005322 hidden_api: {
5323 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5324 metadata: "my-bootclasspath-fragment/metadata.csv",
5325 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005326 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5327 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5328 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005329 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005330 }
5331
Liz Kammer2dc72442023-04-20 10:10:48 -04005332 prebuilt_systemserverclasspath_fragment {
5333 name: "my-systemserverclasspath-fragment",
5334 contents: ["libbaz"],
5335 apex_available: ["myapex"],
5336 }
5337
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005338 java_import {
5339 name: "libfoo",
5340 jars: ["libfoo.jar"],
5341 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005342 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005343 }
5344
5345 java_sdk_library_import {
5346 name: "libbar",
5347 public: {
5348 jars: ["libbar.jar"],
5349 },
5350 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005351 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005352 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005353 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005354
5355 java_sdk_library_import {
5356 name: "libbaz",
5357 public: {
5358 jars: ["libbaz.jar"],
5359 },
5360 apex_available: ["myapex"],
5361 shared_library: false,
5362 permitted_packages: ["baz"],
5363 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005364 `
5365
Paul Duffin89f570a2021-06-16 01:42:33 +01005366 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005367 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5368 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5369
Paul Duffin537ea3d2021-05-14 10:38:00 +01005370 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005371 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005372 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005373 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005374 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5375 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005376
5377 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5378
5379 overrideNames := []string{
5380 "",
5381 "myjavalib.myapex",
5382 "libfoo.myapex",
5383 "libbar.myapex",
5384 "libbaz.myapex",
5385 }
5386 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5387 for i, e := range mkEntries {
5388 g := e.OverrideName
5389 if w := overrideNames[i]; w != g {
5390 t.Errorf("Expected override name %q, got %q", w, g)
5391 }
5392 }
5393
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005394 })
5395
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005396 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5397 bp := `
5398 prebuilt_apex {
5399 name: "myapex",
5400 arch: {
5401 arm64: {
5402 src: "myapex-arm64.apex",
5403 },
5404 arm: {
5405 src: "myapex-arm.apex",
5406 },
5407 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005408 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5409 }
5410
5411 prebuilt_bootclasspath_fragment {
5412 name: "my-bootclasspath-fragment",
5413 contents: ["libfoo", "libbar"],
5414 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005415 hidden_api: {
5416 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5417 metadata: "my-bootclasspath-fragment/metadata.csv",
5418 index: "my-bootclasspath-fragment/index.csv",
5419 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5420 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5421 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005422 }
5423
5424 java_import {
5425 name: "libfoo",
5426 jars: ["libfoo.jar"],
5427 apex_available: ["myapex"],
5428 }
5429
5430 java_library {
5431 name: "libfoo",
5432 srcs: ["foo/bar/MyClass.java"],
5433 apex_available: ["myapex"],
5434 }
Paul Duffin37856732021-02-26 14:24:15 +00005435
5436 java_sdk_library_import {
5437 name: "libbar",
5438 public: {
5439 jars: ["libbar.jar"],
5440 },
5441 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005442 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005443 }
5444
5445 java_sdk_library {
5446 name: "libbar",
5447 srcs: ["foo/bar/MyClass.java"],
5448 unsafe_ignore_missing_latest_api: true,
5449 apex_available: ["myapex"],
5450 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005451 `
5452
5453 // In this test the source (java_library) libfoo is active since the
5454 // prebuilt (java_import) defaults to prefer:false. However the
5455 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5456 // find the dex boot jar in it. We either need to disable the source libfoo
5457 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005458 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005459 // dexbootjar check is skipped if AllowMissingDependencies is true
5460 preparerAllowMissingDeps := android.GroupFixturePreparers(
5461 preparer,
5462 android.PrepareForTestWithAllowMissingDependencies,
5463 )
5464 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005465 })
5466
5467 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5468 bp := `
5469 prebuilt_apex {
5470 name: "myapex",
5471 arch: {
5472 arm64: {
5473 src: "myapex-arm64.apex",
5474 },
5475 arm: {
5476 src: "myapex-arm.apex",
5477 },
5478 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005479 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5480 }
5481
5482 prebuilt_bootclasspath_fragment {
5483 name: "my-bootclasspath-fragment",
5484 contents: ["libfoo", "libbar"],
5485 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005486 hidden_api: {
5487 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5488 metadata: "my-bootclasspath-fragment/metadata.csv",
5489 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005490 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5491 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5492 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005493 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005494 }
5495
5496 java_import {
5497 name: "libfoo",
5498 prefer: true,
5499 jars: ["libfoo.jar"],
5500 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005501 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005502 }
5503
5504 java_library {
5505 name: "libfoo",
5506 srcs: ["foo/bar/MyClass.java"],
5507 apex_available: ["myapex"],
5508 }
Paul Duffin37856732021-02-26 14:24:15 +00005509
5510 java_sdk_library_import {
5511 name: "libbar",
5512 prefer: true,
5513 public: {
5514 jars: ["libbar.jar"],
5515 },
5516 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005517 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005518 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005519 }
5520
5521 java_sdk_library {
5522 name: "libbar",
5523 srcs: ["foo/bar/MyClass.java"],
5524 unsafe_ignore_missing_latest_api: true,
5525 apex_available: ["myapex"],
5526 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005527 `
5528
Paul Duffin89f570a2021-06-16 01:42:33 +01005529 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005530 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5531 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005532
Paul Duffin537ea3d2021-05-14 10:38:00 +01005533 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005534 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005535 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005536 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005537 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5538 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005539 })
5540
5541 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5542 bp := `
5543 apex {
5544 name: "myapex",
5545 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005546 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005547 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005548 }
5549
5550 apex_key {
5551 name: "myapex.key",
5552 public_key: "testkey.avbpubkey",
5553 private_key: "testkey.pem",
5554 }
5555
5556 prebuilt_apex {
5557 name: "myapex",
5558 arch: {
5559 arm64: {
5560 src: "myapex-arm64.apex",
5561 },
5562 arm: {
5563 src: "myapex-arm.apex",
5564 },
5565 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005566 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5567 }
5568
5569 prebuilt_bootclasspath_fragment {
5570 name: "my-bootclasspath-fragment",
5571 contents: ["libfoo", "libbar"],
5572 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005573 hidden_api: {
5574 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5575 metadata: "my-bootclasspath-fragment/metadata.csv",
5576 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005577 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5578 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5579 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005580 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005581 }
5582
5583 java_import {
5584 name: "libfoo",
5585 jars: ["libfoo.jar"],
5586 apex_available: ["myapex"],
5587 }
5588
5589 java_library {
5590 name: "libfoo",
5591 srcs: ["foo/bar/MyClass.java"],
5592 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005593 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005594 }
Paul Duffin37856732021-02-26 14:24:15 +00005595
5596 java_sdk_library_import {
5597 name: "libbar",
5598 public: {
5599 jars: ["libbar.jar"],
5600 },
5601 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005602 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005603 }
5604
5605 java_sdk_library {
5606 name: "libbar",
5607 srcs: ["foo/bar/MyClass.java"],
5608 unsafe_ignore_missing_latest_api: true,
5609 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005610 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005611 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005612 `
5613
Paul Duffin89f570a2021-06-16 01:42:33 +01005614 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005615 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5616 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005617
Paul Duffin537ea3d2021-05-14 10:38:00 +01005618 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005619 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005620 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005621 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005622 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5623 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005624 })
5625
5626 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5627 bp := `
5628 apex {
5629 name: "myapex",
5630 enabled: false,
5631 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005632 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005633 }
5634
5635 apex_key {
5636 name: "myapex.key",
5637 public_key: "testkey.avbpubkey",
5638 private_key: "testkey.pem",
5639 }
5640
5641 prebuilt_apex {
5642 name: "myapex",
5643 arch: {
5644 arm64: {
5645 src: "myapex-arm64.apex",
5646 },
5647 arm: {
5648 src: "myapex-arm.apex",
5649 },
5650 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005651 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5652 }
5653
5654 prebuilt_bootclasspath_fragment {
5655 name: "my-bootclasspath-fragment",
5656 contents: ["libfoo", "libbar"],
5657 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005658 hidden_api: {
5659 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5660 metadata: "my-bootclasspath-fragment/metadata.csv",
5661 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005662 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5663 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5664 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005665 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005666 }
5667
5668 java_import {
5669 name: "libfoo",
5670 prefer: true,
5671 jars: ["libfoo.jar"],
5672 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005673 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005674 }
5675
5676 java_library {
5677 name: "libfoo",
5678 srcs: ["foo/bar/MyClass.java"],
5679 apex_available: ["myapex"],
5680 }
Paul Duffin37856732021-02-26 14:24:15 +00005681
5682 java_sdk_library_import {
5683 name: "libbar",
5684 prefer: true,
5685 public: {
5686 jars: ["libbar.jar"],
5687 },
5688 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005689 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005690 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005691 }
5692
5693 java_sdk_library {
5694 name: "libbar",
5695 srcs: ["foo/bar/MyClass.java"],
5696 unsafe_ignore_missing_latest_api: true,
5697 apex_available: ["myapex"],
5698 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005699 `
5700
Paul Duffin89f570a2021-06-16 01:42:33 +01005701 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005702 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5703 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005704
Paul Duffin537ea3d2021-05-14 10:38:00 +01005705 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005706 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005707 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005708 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005709 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5710 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005711 })
5712}
5713
Roland Levillain630846d2019-06-26 12:48:34 +01005714func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005715 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005716 apex_test {
5717 name: "myapex",
5718 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005719 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005720 tests: [
5721 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005722 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005723 ],
5724 }
5725
5726 apex_key {
5727 name: "myapex.key",
5728 public_key: "testkey.avbpubkey",
5729 private_key: "testkey.pem",
5730 }
5731
Liz Kammer1c14a212020-05-12 15:26:55 -07005732 filegroup {
5733 name: "fg",
5734 srcs: [
5735 "baz",
5736 "bar/baz"
5737 ],
5738 }
5739
Roland Levillain630846d2019-06-26 12:48:34 +01005740 cc_test {
5741 name: "mytest",
5742 gtest: false,
5743 srcs: ["mytest.cpp"],
5744 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005745 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005746 system_shared_libs: [],
5747 static_executable: true,
5748 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005749 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005750 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005751
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005752 cc_library {
5753 name: "mylib",
5754 srcs: ["mylib.cpp"],
5755 system_shared_libs: [],
5756 stl: "none",
5757 }
5758
Liz Kammer5bd365f2020-05-27 15:15:11 -07005759 filegroup {
5760 name: "fg2",
5761 srcs: [
5762 "testdata/baz"
5763 ],
5764 }
5765
Roland Levillain9b5fde92019-06-28 15:41:19 +01005766 cc_test {
5767 name: "mytests",
5768 gtest: false,
5769 srcs: [
5770 "mytest1.cpp",
5771 "mytest2.cpp",
5772 "mytest3.cpp",
5773 ],
5774 test_per_src: true,
5775 relative_install_path: "test",
5776 system_shared_libs: [],
5777 static_executable: true,
5778 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005779 data: [
5780 ":fg",
5781 ":fg2",
5782 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005783 }
Roland Levillain630846d2019-06-26 12:48:34 +01005784 `)
5785
Sundong Ahnabb64432019-10-22 13:58:29 +09005786 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005787 copyCmds := apexRule.Args["copy_commands"]
5788
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005789 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005790 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005791 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005792
Liz Kammer1c14a212020-05-12 15:26:55 -07005793 //Ensure that test data are copied into apex.
5794 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5795 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5796
Roland Levillain9b5fde92019-06-28 15:41:19 +01005797 // Ensure that test deps built with `test_per_src` are copied into apex.
5798 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5799 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5800 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005801
5802 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005803 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005804 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005805 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005806 prefix := "TARGET_"
5807 var builder strings.Builder
5808 data.Custom(&builder, name, prefix, "", data)
5809 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005810 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5811 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5812 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5813 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
5814 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
5815 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005816 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005817
5818 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005819 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005820 data.Custom(&builder, name, prefix, "", data)
5821 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005822 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5823 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005824}
5825
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005826func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005827 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005828 apex {
5829 name: "myapex",
5830 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005831 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005832 }
5833 apex_key {
5834 name: "myapex.key",
5835 public_key: "testkey.avbpubkey",
5836 private_key: "testkey.pem",
5837 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005838 `,
5839 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5840 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5841 }),
5842 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005843 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00005844 ensureListContains(t, ab.makeModulesToInstall, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005845 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005846 var builder strings.Builder
5847 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5848 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005849 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex myapex.flattened\n")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005850}
5851
Jooyung Hand48f3c32019-08-23 11:18:57 +09005852func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5853 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5854 apex {
5855 name: "myapex",
5856 key: "myapex.key",
5857 native_shared_libs: ["libfoo"],
5858 }
5859
5860 apex_key {
5861 name: "myapex.key",
5862 public_key: "testkey.avbpubkey",
5863 private_key: "testkey.pem",
5864 }
5865
5866 cc_library {
5867 name: "libfoo",
5868 stl: "none",
5869 system_shared_libs: [],
5870 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005871 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005872 }
5873 `)
5874 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5875 apex {
5876 name: "myapex",
5877 key: "myapex.key",
5878 java_libs: ["myjar"],
5879 }
5880
5881 apex_key {
5882 name: "myapex.key",
5883 public_key: "testkey.avbpubkey",
5884 private_key: "testkey.pem",
5885 }
5886
5887 java_library {
5888 name: "myjar",
5889 srcs: ["foo/bar/MyClass.java"],
5890 sdk_version: "none",
5891 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005892 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005893 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005894 }
5895 `)
5896}
5897
Bill Peckhama41a6962021-01-11 10:58:54 -08005898func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005899 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005900 apex {
5901 name: "myapex",
5902 key: "myapex.key",
5903 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005904 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005905 }
5906
5907 apex_key {
5908 name: "myapex.key",
5909 public_key: "testkey.avbpubkey",
5910 private_key: "testkey.pem",
5911 }
5912
5913 java_import {
5914 name: "myjavaimport",
5915 apex_available: ["myapex"],
5916 jars: ["my.jar"],
5917 compile_dex: true,
5918 }
5919 `)
5920
5921 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5922 apexRule := module.Rule("apexRule")
5923 copyCmds := apexRule.Args["copy_commands"]
5924 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5925}
5926
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005927func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005928 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005929 apex {
5930 name: "myapex",
5931 key: "myapex.key",
5932 apps: [
5933 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005934 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005935 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005936 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005937 }
5938
5939 apex_key {
5940 name: "myapex.key",
5941 public_key: "testkey.avbpubkey",
5942 private_key: "testkey.pem",
5943 }
5944
5945 android_app {
5946 name: "AppFoo",
5947 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005948 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005949 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005950 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005951 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005952 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005953 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005954
5955 android_app {
5956 name: "AppFooPriv",
5957 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005958 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005959 system_modules: "none",
5960 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005961 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005962 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005963 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005964
5965 cc_library_shared {
5966 name: "libjni",
5967 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005968 shared_libs: ["libfoo"],
5969 stl: "none",
5970 system_shared_libs: [],
5971 apex_available: [ "myapex" ],
5972 sdk_version: "current",
5973 }
5974
5975 cc_library_shared {
5976 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005977 stl: "none",
5978 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005979 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005980 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005981 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005982 `)
5983
Sundong Ahnabb64432019-10-22 13:58:29 +09005984 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005985 apexRule := module.Rule("apexRule")
5986 copyCmds := apexRule.Args["copy_commands"]
5987
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005988 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5989 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005990
Colin Crossaede88c2020-08-11 12:17:01 -07005991 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005992 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005993 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005994 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005995 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005996 // JNI libraries including transitive deps are
5997 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005998 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005999 // ... embedded inside APK (jnilibs.zip)
6000 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6001 // ... and not directly inside the APEX
6002 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6003 }
Dario Frenicde2a032019-10-27 00:29:22 +01006004}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006005
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006006func TestApexWithAppImportBuildId(t *testing.T) {
6007 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6008 for _, id := range invalidBuildIds {
6009 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6010 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6011 variables.BuildId = proptools.StringPtr(id)
6012 })
6013 testApexError(t, message, `apex {
6014 name: "myapex",
6015 key: "myapex.key",
6016 apps: ["AppFooPrebuilt"],
6017 updatable: false,
6018 }
6019
6020 apex_key {
6021 name: "myapex.key",
6022 public_key: "testkey.avbpubkey",
6023 private_key: "testkey.pem",
6024 }
6025
6026 android_app_import {
6027 name: "AppFooPrebuilt",
6028 apk: "PrebuiltAppFoo.apk",
6029 presigned: true,
6030 apex_available: ["myapex"],
6031 }
6032 `, fixture)
6033 }
6034}
6035
Dario Frenicde2a032019-10-27 00:29:22 +01006036func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006037 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006038 apex {
6039 name: "myapex",
6040 key: "myapex.key",
6041 apps: [
6042 "AppFooPrebuilt",
6043 "AppFooPrivPrebuilt",
6044 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006045 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006046 }
6047
6048 apex_key {
6049 name: "myapex.key",
6050 public_key: "testkey.avbpubkey",
6051 private_key: "testkey.pem",
6052 }
6053
6054 android_app_import {
6055 name: "AppFooPrebuilt",
6056 apk: "PrebuiltAppFoo.apk",
6057 presigned: true,
6058 dex_preopt: {
6059 enabled: false,
6060 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006061 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006062 }
6063
6064 android_app_import {
6065 name: "AppFooPrivPrebuilt",
6066 apk: "PrebuiltAppFooPriv.apk",
6067 privileged: true,
6068 presigned: true,
6069 dex_preopt: {
6070 enabled: false,
6071 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006072 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006073 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006074 }
6075 `)
6076
Sundong Ahnabb64432019-10-22 13:58:29 +09006077 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01006078 apexRule := module.Rule("apexRule")
6079 copyCmds := apexRule.Args["copy_commands"]
6080
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006081 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6082 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006083}
6084
6085func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006086 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006087 apex {
6088 name: "myapex",
6089 key: "myapex.key",
6090 apps: [
6091 "AppFoo",
6092 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006093 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006094 }
6095
6096 apex_key {
6097 name: "myapex.key",
6098 public_key: "testkey.avbpubkey",
6099 private_key: "testkey.pem",
6100 }
6101
6102 android_app {
6103 name: "AppFoo",
6104 srcs: ["foo/bar/MyClass.java"],
6105 sdk_version: "none",
6106 system_modules: "none",
6107 apex_available: [ "myapex" ],
6108 }
6109
6110 android_app_import {
6111 name: "AppFoo",
6112 apk: "AppFooPrebuilt.apk",
6113 filename: "AppFooPrebuilt.apk",
6114 presigned: true,
6115 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006116 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006117 }
6118 `, withFiles(map[string][]byte{
6119 "AppFooPrebuilt.apk": nil,
6120 }))
6121
6122 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006123 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006124 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006125}
6126
Dario Freni6f3937c2019-12-20 22:58:03 +00006127func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006128 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006129 apex {
6130 name: "myapex",
6131 key: "myapex.key",
6132 apps: [
6133 "TesterHelpAppFoo",
6134 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006135 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006136 }
6137
6138 apex_key {
6139 name: "myapex.key",
6140 public_key: "testkey.avbpubkey",
6141 private_key: "testkey.pem",
6142 }
6143
6144 android_test_helper_app {
6145 name: "TesterHelpAppFoo",
6146 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006147 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006148 }
6149
6150 `)
6151
6152 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6153 apexRule := module.Rule("apexRule")
6154 copyCmds := apexRule.Args["copy_commands"]
6155
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006156 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006157}
6158
Jooyung Han18020ea2019-11-13 10:50:48 +09006159func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6160 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006161 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006162 apex {
6163 name: "myapex",
6164 key: "myapex.key",
6165 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006166 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006167 }
6168
6169 apex_key {
6170 name: "myapex.key",
6171 public_key: "testkey.avbpubkey",
6172 private_key: "testkey.pem",
6173 }
6174
6175 apex {
6176 name: "otherapex",
6177 key: "myapex.key",
6178 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006179 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006180 }
6181
6182 cc_defaults {
6183 name: "libfoo-defaults",
6184 apex_available: ["otherapex"],
6185 }
6186
6187 cc_library {
6188 name: "libfoo",
6189 defaults: ["libfoo-defaults"],
6190 stl: "none",
6191 system_shared_libs: [],
6192 }`)
6193}
6194
Paul Duffine52e66f2020-03-30 17:54:29 +01006195func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006196 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006197 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006198 apex {
6199 name: "myapex",
6200 key: "myapex.key",
6201 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006202 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006203 }
6204
6205 apex_key {
6206 name: "myapex.key",
6207 public_key: "testkey.avbpubkey",
6208 private_key: "testkey.pem",
6209 }
6210
6211 apex {
6212 name: "otherapex",
6213 key: "otherapex.key",
6214 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006215 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006216 }
6217
6218 apex_key {
6219 name: "otherapex.key",
6220 public_key: "testkey.avbpubkey",
6221 private_key: "testkey.pem",
6222 }
6223
6224 cc_library {
6225 name: "libfoo",
6226 stl: "none",
6227 system_shared_libs: [],
6228 apex_available: ["otherapex"],
6229 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006230}
Jiyong Park127b40b2019-09-30 16:04:35 +09006231
Paul Duffine52e66f2020-03-30 17:54:29 +01006232func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006233 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006234 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006235.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006236.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006237.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006238.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006239.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006240.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006241 apex {
6242 name: "myapex",
6243 key: "myapex.key",
6244 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006245 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006246 }
6247
6248 apex_key {
6249 name: "myapex.key",
6250 public_key: "testkey.avbpubkey",
6251 private_key: "testkey.pem",
6252 }
6253
Jiyong Park127b40b2019-09-30 16:04:35 +09006254 cc_library {
6255 name: "libfoo",
6256 stl: "none",
6257 shared_libs: ["libbar"],
6258 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006259 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006260 }
6261
6262 cc_library {
6263 name: "libbar",
6264 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006265 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006266 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006267 apex_available: ["myapex"],
6268 }
6269
6270 cc_library {
6271 name: "libbaz",
6272 stl: "none",
6273 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006274 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006275}
Jiyong Park127b40b2019-09-30 16:04:35 +09006276
Paul Duffine52e66f2020-03-30 17:54:29 +01006277func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006278 testApexError(t, "\"otherapex\" is not a valid module name", `
6279 apex {
6280 name: "myapex",
6281 key: "myapex.key",
6282 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006283 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006284 }
6285
6286 apex_key {
6287 name: "myapex.key",
6288 public_key: "testkey.avbpubkey",
6289 private_key: "testkey.pem",
6290 }
6291
6292 cc_library {
6293 name: "libfoo",
6294 stl: "none",
6295 system_shared_libs: [],
6296 apex_available: ["otherapex"],
6297 }`)
6298
Paul Duffine52e66f2020-03-30 17:54:29 +01006299 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006300 apex {
6301 name: "myapex",
6302 key: "myapex.key",
6303 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006304 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006305 }
6306
6307 apex_key {
6308 name: "myapex.key",
6309 public_key: "testkey.avbpubkey",
6310 private_key: "testkey.pem",
6311 }
6312
6313 cc_library {
6314 name: "libfoo",
6315 stl: "none",
6316 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006317 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006318 apex_available: ["myapex"],
6319 }
6320
6321 cc_library {
6322 name: "libbar",
6323 stl: "none",
6324 system_shared_libs: [],
6325 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006326 }
6327
6328 cc_library {
6329 name: "libbaz",
6330 stl: "none",
6331 system_shared_libs: [],
6332 stubs: {
6333 versions: ["10", "20", "30"],
6334 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006335 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006336}
Jiyong Park127b40b2019-09-30 16:04:35 +09006337
Jiyong Park89e850a2020-04-07 16:37:39 +09006338func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006339 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006340 apex {
6341 name: "myapex",
6342 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006343 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006344 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006345 }
6346
6347 apex_key {
6348 name: "myapex.key",
6349 public_key: "testkey.avbpubkey",
6350 private_key: "testkey.pem",
6351 }
6352
6353 cc_library {
6354 name: "libfoo",
6355 stl: "none",
6356 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006357 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006358 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006359 }
6360
6361 cc_library {
6362 name: "libfoo2",
6363 stl: "none",
6364 system_shared_libs: [],
6365 shared_libs: ["libbaz"],
6366 apex_available: ["//apex_available:platform"],
6367 }
6368
6369 cc_library {
6370 name: "libbar",
6371 stl: "none",
6372 system_shared_libs: [],
6373 apex_available: ["myapex"],
6374 }
6375
6376 cc_library {
6377 name: "libbaz",
6378 stl: "none",
6379 system_shared_libs: [],
6380 apex_available: ["myapex"],
6381 stubs: {
6382 versions: ["1"],
6383 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006384 }`)
6385
Jiyong Park89e850a2020-04-07 16:37:39 +09006386 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6387 // because it depends on libbar which isn't available to platform
6388 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6389 if libfoo.NotAvailableForPlatform() != true {
6390 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6391 }
6392
6393 // libfoo2 however can be available to platform because it depends on libbaz which provides
6394 // stubs
6395 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6396 if libfoo2.NotAvailableForPlatform() == true {
6397 t.Errorf("%q should be available to platform", libfoo2.String())
6398 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006399}
Jiyong Parka90ca002019-10-07 15:47:24 +09006400
Paul Duffine52e66f2020-03-30 17:54:29 +01006401func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006402 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006403 apex {
6404 name: "myapex",
6405 key: "myapex.key",
6406 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006407 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006408 }
6409
6410 apex_key {
6411 name: "myapex.key",
6412 public_key: "testkey.avbpubkey",
6413 private_key: "testkey.pem",
6414 }
6415
6416 cc_library {
6417 name: "libfoo",
6418 stl: "none",
6419 system_shared_libs: [],
6420 apex_available: ["myapex"],
6421 static: {
6422 apex_available: ["//apex_available:platform"],
6423 },
6424 }`)
6425
Jiyong Park89e850a2020-04-07 16:37:39 +09006426 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6427 if libfooShared.NotAvailableForPlatform() != true {
6428 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6429 }
6430 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6431 if libfooStatic.NotAvailableForPlatform() != false {
6432 t.Errorf("%q should be available to platform", libfooStatic.String())
6433 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006434}
6435
Jiyong Park5d790c32019-11-15 18:40:32 +09006436func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006437 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006438 apex {
6439 name: "myapex",
6440 key: "myapex.key",
6441 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006442 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006443 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006444 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006445 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006446 }
6447
6448 override_apex {
6449 name: "override_myapex",
6450 base: "myapex",
6451 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006452 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006453 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006454 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006455 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006456 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006457 key: "mynewapex.key",
6458 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006459 }
6460
6461 apex_key {
6462 name: "myapex.key",
6463 public_key: "testkey.avbpubkey",
6464 private_key: "testkey.pem",
6465 }
6466
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006467 apex_key {
6468 name: "mynewapex.key",
6469 public_key: "testkey2.avbpubkey",
6470 private_key: "testkey2.pem",
6471 }
6472
6473 android_app_certificate {
6474 name: "myapex.certificate",
6475 certificate: "testkey",
6476 }
6477
Jiyong Park5d790c32019-11-15 18:40:32 +09006478 android_app {
6479 name: "app",
6480 srcs: ["foo/bar/MyClass.java"],
6481 package_name: "foo",
6482 sdk_version: "none",
6483 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006484 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006485 }
6486
6487 override_android_app {
6488 name: "override_app",
6489 base: "app",
6490 package_name: "bar",
6491 }
markchien7c803b82021-08-26 22:10:06 +08006492
6493 bpf {
6494 name: "bpf",
6495 srcs: ["bpf.c"],
6496 }
6497
6498 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006499 name: "overrideBpf",
6500 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006501 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006502
6503 prebuilt_etc {
6504 name: "myetc",
6505 src: "myprebuilt",
6506 }
6507
6508 prebuilt_etc {
6509 name: "override_myetc",
6510 src: "override_myprebuilt",
6511 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006512 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006513
Jiyong Park317645e2019-12-05 13:20:58 +09006514 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6515 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6516 if originalVariant.GetOverriddenBy() != "" {
6517 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6518 }
6519 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6520 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6521 }
6522
Jiyong Park5d790c32019-11-15 18:40:32 +09006523 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6524 apexRule := module.Rule("apexRule")
6525 copyCmds := apexRule.Args["copy_commands"]
6526
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006527 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6528 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006529
markchien7c803b82021-08-26 22:10:06 +08006530 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006531 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006532
Daniel Norman5a3ce132021-08-26 15:44:43 -07006533 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6534 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6535
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006536 apexBundle := module.Module().(*apexBundle)
6537 name := apexBundle.Name()
6538 if name != "override_myapex" {
6539 t.Errorf("name should be \"override_myapex\", but was %q", name)
6540 }
6541
Baligh Uddin004d7172020-02-19 21:29:28 -08006542 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6543 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6544 }
6545
Jiyong Park20bacab2020-03-03 11:45:41 +09006546 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006547 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006548 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6549
6550 signApkRule := module.Rule("signapk")
6551 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006552
Colin Crossaa255532020-07-03 13:18:24 -07006553 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006554 var builder strings.Builder
6555 data.Custom(&builder, name, "TARGET_", "", data)
6556 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006557 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6558 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
6559 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006560 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006561 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006562 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006563 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006564 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006565 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
6566 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006567}
6568
Albert Martineefabcf2022-03-21 20:11:16 +00006569func TestMinSdkVersionOverride(t *testing.T) {
6570 // Override from 29 to 31
6571 minSdkOverride31 := "31"
6572 ctx := testApex(t, `
6573 apex {
6574 name: "myapex",
6575 key: "myapex.key",
6576 native_shared_libs: ["mylib"],
6577 updatable: true,
6578 min_sdk_version: "29"
6579 }
6580
6581 override_apex {
6582 name: "override_myapex",
6583 base: "myapex",
6584 logging_parent: "com.foo.bar",
6585 package_name: "test.overridden.package"
6586 }
6587
6588 apex_key {
6589 name: "myapex.key",
6590 public_key: "testkey.avbpubkey",
6591 private_key: "testkey.pem",
6592 }
6593
6594 cc_library {
6595 name: "mylib",
6596 srcs: ["mylib.cpp"],
6597 runtime_libs: ["libbar"],
6598 system_shared_libs: [],
6599 stl: "none",
6600 apex_available: [ "myapex" ],
6601 min_sdk_version: "apex_inherit"
6602 }
6603
6604 cc_library {
6605 name: "libbar",
6606 srcs: ["mylib.cpp"],
6607 system_shared_libs: [],
6608 stl: "none",
6609 apex_available: [ "myapex" ],
6610 min_sdk_version: "apex_inherit"
6611 }
6612
6613 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6614
6615 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6616 copyCmds := apexRule.Args["copy_commands"]
6617
6618 // Ensure that direct non-stubs dep is always included
6619 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6620
6621 // Ensure that runtime_libs dep in included
6622 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6623
6624 // Ensure libraries target overridden min_sdk_version value
6625 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6626}
6627
6628func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6629 // Attempt to override from 31 to 29, should be a NOOP
6630 minSdkOverride29 := "29"
6631 ctx := testApex(t, `
6632 apex {
6633 name: "myapex",
6634 key: "myapex.key",
6635 native_shared_libs: ["mylib"],
6636 updatable: true,
6637 min_sdk_version: "31"
6638 }
6639
6640 override_apex {
6641 name: "override_myapex",
6642 base: "myapex",
6643 logging_parent: "com.foo.bar",
6644 package_name: "test.overridden.package"
6645 }
6646
6647 apex_key {
6648 name: "myapex.key",
6649 public_key: "testkey.avbpubkey",
6650 private_key: "testkey.pem",
6651 }
6652
6653 cc_library {
6654 name: "mylib",
6655 srcs: ["mylib.cpp"],
6656 runtime_libs: ["libbar"],
6657 system_shared_libs: [],
6658 stl: "none",
6659 apex_available: [ "myapex" ],
6660 min_sdk_version: "apex_inherit"
6661 }
6662
6663 cc_library {
6664 name: "libbar",
6665 srcs: ["mylib.cpp"],
6666 system_shared_libs: [],
6667 stl: "none",
6668 apex_available: [ "myapex" ],
6669 min_sdk_version: "apex_inherit"
6670 }
6671
6672 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6673
6674 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6675 copyCmds := apexRule.Args["copy_commands"]
6676
6677 // Ensure that direct non-stubs dep is always included
6678 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6679
6680 // Ensure that runtime_libs dep in included
6681 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6682
6683 // Ensure libraries target the original min_sdk_version value rather than the overridden
6684 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6685}
6686
Jooyung Han214bf372019-11-12 13:03:50 +09006687func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006688 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006689 apex {
6690 name: "myapex",
6691 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006692 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006693 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006694 }
6695
6696 apex_key {
6697 name: "myapex.key",
6698 public_key: "testkey.avbpubkey",
6699 private_key: "testkey.pem",
6700 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006701
6702 cc_library {
6703 name: "mylib",
6704 srcs: ["mylib.cpp"],
6705 stl: "libc++",
6706 system_shared_libs: [],
6707 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006708 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006709 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006710 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006711
6712 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6713 args := module.Rule("apexRule").Args
6714 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006715 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006716
6717 // The copies of the libraries in the apex should have one more dependency than
6718 // the ones outside the apex, namely the unwinder. Ideally we should check
6719 // the dependency names directly here but for some reason the names are blank in
6720 // this test.
6721 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006722 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006723 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6724 if len(apexImplicits) != len(nonApexImplicits)+1 {
6725 t.Errorf("%q missing unwinder dep", lib)
6726 }
6727 }
Jooyung Han214bf372019-11-12 13:03:50 +09006728}
6729
Paul Duffine05480a2021-03-08 15:07:14 +00006730var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006731 "api/current.txt": nil,
6732 "api/removed.txt": nil,
6733 "api/system-current.txt": nil,
6734 "api/system-removed.txt": nil,
6735 "api/test-current.txt": nil,
6736 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006737
Anton Hanssondff2c782020-12-21 17:10:01 +00006738 "100/public/api/foo.txt": nil,
6739 "100/public/api/foo-removed.txt": nil,
6740 "100/system/api/foo.txt": nil,
6741 "100/system/api/foo-removed.txt": nil,
6742
Paul Duffineedc5d52020-06-12 17:46:39 +01006743 // For java_sdk_library_import
6744 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006745}
6746
Jooyung Han58f26ab2019-12-18 15:34:32 +09006747func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006748 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006749 apex {
6750 name: "myapex",
6751 key: "myapex.key",
6752 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006753 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006754 }
6755
6756 apex_key {
6757 name: "myapex.key",
6758 public_key: "testkey.avbpubkey",
6759 private_key: "testkey.pem",
6760 }
6761
6762 java_sdk_library {
6763 name: "foo",
6764 srcs: ["a.java"],
6765 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006766 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006767 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006768
6769 prebuilt_apis {
6770 name: "sdk",
6771 api_dirs: ["100"],
6772 }
Paul Duffin9b879592020-05-26 13:21:35 +01006773 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006774
6775 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006776 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006777 "javalib/foo.jar",
6778 "etc/permissions/foo.xml",
6779 })
6780 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006781 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006782 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 +09006783}
6784
Paul Duffin9b879592020-05-26 13:21:35 +01006785func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006786 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006787 apex {
6788 name: "myapex",
6789 key: "myapex.key",
6790 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006791 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006792 }
6793
6794 apex_key {
6795 name: "myapex.key",
6796 public_key: "testkey.avbpubkey",
6797 private_key: "testkey.pem",
6798 }
6799
6800 java_sdk_library {
6801 name: "foo",
6802 srcs: ["a.java"],
6803 api_packages: ["foo"],
6804 apex_available: ["myapex"],
6805 sdk_version: "none",
6806 system_modules: "none",
6807 }
6808
6809 java_library {
6810 name: "bar",
6811 srcs: ["a.java"],
6812 libs: ["foo"],
6813 apex_available: ["myapex"],
6814 sdk_version: "none",
6815 system_modules: "none",
6816 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006817
6818 prebuilt_apis {
6819 name: "sdk",
6820 api_dirs: ["100"],
6821 }
Paul Duffin9b879592020-05-26 13:21:35 +01006822 `, withFiles(filesForSdkLibrary))
6823
6824 // java_sdk_library installs both impl jar and permission XML
6825 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6826 "javalib/bar.jar",
6827 "javalib/foo.jar",
6828 "etc/permissions/foo.xml",
6829 })
6830
6831 // The bar library should depend on the implementation jar.
6832 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006833 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006834 t.Errorf("expected %q, found %#q", expected, actual)
6835 }
6836}
6837
6838func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006839 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006840 apex {
6841 name: "myapex",
6842 key: "myapex.key",
6843 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006844 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006845 }
6846
6847 apex_key {
6848 name: "myapex.key",
6849 public_key: "testkey.avbpubkey",
6850 private_key: "testkey.pem",
6851 }
6852
6853 java_sdk_library {
6854 name: "foo",
6855 srcs: ["a.java"],
6856 api_packages: ["foo"],
6857 apex_available: ["myapex"],
6858 sdk_version: "none",
6859 system_modules: "none",
6860 }
6861
6862 java_library {
6863 name: "bar",
6864 srcs: ["a.java"],
6865 libs: ["foo"],
6866 sdk_version: "none",
6867 system_modules: "none",
6868 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006869
6870 prebuilt_apis {
6871 name: "sdk",
6872 api_dirs: ["100"],
6873 }
Paul Duffin9b879592020-05-26 13:21:35 +01006874 `, withFiles(filesForSdkLibrary))
6875
6876 // java_sdk_library installs both impl jar and permission XML
6877 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6878 "javalib/foo.jar",
6879 "etc/permissions/foo.xml",
6880 })
6881
6882 // The bar library should depend on the stubs jar.
6883 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006884 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006885 t.Errorf("expected %q, found %#q", expected, actual)
6886 }
6887}
6888
Paul Duffineedc5d52020-06-12 17:46:39 +01006889func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006890 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006891 prebuilt_apis {
6892 name: "sdk",
6893 api_dirs: ["100"],
6894 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006895 withFiles(map[string][]byte{
6896 "apex/a.java": nil,
6897 "apex/apex_manifest.json": nil,
6898 "apex/Android.bp": []byte(`
6899 package {
6900 default_visibility: ["//visibility:private"],
6901 }
6902
6903 apex {
6904 name: "myapex",
6905 key: "myapex.key",
6906 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006907 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006908 }
6909
6910 apex_key {
6911 name: "myapex.key",
6912 public_key: "testkey.avbpubkey",
6913 private_key: "testkey.pem",
6914 }
6915
6916 java_library {
6917 name: "bar",
6918 srcs: ["a.java"],
6919 libs: ["foo"],
6920 apex_available: ["myapex"],
6921 sdk_version: "none",
6922 system_modules: "none",
6923 }
6924`),
6925 "source/a.java": nil,
6926 "source/api/current.txt": nil,
6927 "source/api/removed.txt": nil,
6928 "source/Android.bp": []byte(`
6929 package {
6930 default_visibility: ["//visibility:private"],
6931 }
6932
6933 java_sdk_library {
6934 name: "foo",
6935 visibility: ["//apex"],
6936 srcs: ["a.java"],
6937 api_packages: ["foo"],
6938 apex_available: ["myapex"],
6939 sdk_version: "none",
6940 system_modules: "none",
6941 public: {
6942 enabled: true,
6943 },
6944 }
6945`),
6946 "prebuilt/a.jar": nil,
6947 "prebuilt/Android.bp": []byte(`
6948 package {
6949 default_visibility: ["//visibility:private"],
6950 }
6951
6952 java_sdk_library_import {
6953 name: "foo",
6954 visibility: ["//apex", "//source"],
6955 apex_available: ["myapex"],
6956 prefer: true,
6957 public: {
6958 jars: ["a.jar"],
6959 },
6960 }
6961`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006962 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006963 )
6964
6965 // java_sdk_library installs both impl jar and permission XML
6966 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6967 "javalib/bar.jar",
6968 "javalib/foo.jar",
6969 "etc/permissions/foo.xml",
6970 })
6971
6972 // The bar library should depend on the implementation jar.
6973 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006974 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006975 t.Errorf("expected %q, found %#q", expected, actual)
6976 }
6977}
6978
6979func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6980 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6981 apex {
6982 name: "myapex",
6983 key: "myapex.key",
6984 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006985 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006986 }
6987
6988 apex_key {
6989 name: "myapex.key",
6990 public_key: "testkey.avbpubkey",
6991 private_key: "testkey.pem",
6992 }
6993
6994 java_sdk_library_import {
6995 name: "foo",
6996 apex_available: ["myapex"],
6997 prefer: true,
6998 public: {
6999 jars: ["a.jar"],
7000 },
7001 }
7002
7003 `, withFiles(filesForSdkLibrary))
7004}
7005
atrost6e126252020-01-27 17:01:16 +00007006func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007007 result := android.GroupFixturePreparers(
7008 prepareForApexTest,
7009 java.PrepareForTestWithPlatformCompatConfig,
7010 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007011 apex {
7012 name: "myapex",
7013 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007014 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007015 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007016 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007017 }
7018
7019 apex_key {
7020 name: "myapex.key",
7021 public_key: "testkey.avbpubkey",
7022 private_key: "testkey.pem",
7023 }
7024
7025 platform_compat_config {
7026 name: "myjar-platform-compat-config",
7027 src: ":myjar",
7028 }
7029
7030 java_library {
7031 name: "myjar",
7032 srcs: ["foo/bar/MyClass.java"],
7033 sdk_version: "none",
7034 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007035 apex_available: [ "myapex" ],
7036 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007037
7038 // Make sure that a preferred prebuilt does not affect the apex contents.
7039 prebuilt_platform_compat_config {
7040 name: "myjar-platform-compat-config",
7041 metadata: "compat-config/metadata.xml",
7042 prefer: true,
7043 }
atrost6e126252020-01-27 17:01:16 +00007044 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007045 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007046 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7047 "etc/compatconfig/myjar-platform-compat-config.xml",
7048 "javalib/myjar.jar",
7049 })
7050}
7051
Jooyung Han862c0d62022-12-21 10:15:37 +09007052func TestNoDupeApexFiles(t *testing.T) {
7053 android.GroupFixturePreparers(
7054 android.PrepareForTestWithAndroidBuildComponents,
7055 PrepareForTestWithApexBuildComponents,
7056 prepareForTestWithMyapex,
7057 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7058 ).
7059 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7060 RunTestWithBp(t, `
7061 apex {
7062 name: "myapex",
7063 key: "myapex.key",
7064 prebuilts: ["foo", "bar"],
7065 updatable: false,
7066 }
7067
7068 apex_key {
7069 name: "myapex.key",
7070 public_key: "testkey.avbpubkey",
7071 private_key: "testkey.pem",
7072 }
7073
7074 prebuilt_etc {
7075 name: "foo",
7076 src: "myprebuilt",
7077 filename_from_src: true,
7078 }
7079
7080 prebuilt_etc {
7081 name: "bar",
7082 src: "myprebuilt",
7083 filename_from_src: true,
7084 }
7085 `)
7086}
7087
Jiyong Park479321d2019-12-16 11:47:12 +09007088func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7089 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7090 apex {
7091 name: "myapex",
7092 key: "myapex.key",
7093 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007094 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007095 }
7096
7097 apex_key {
7098 name: "myapex.key",
7099 public_key: "testkey.avbpubkey",
7100 private_key: "testkey.pem",
7101 }
7102
7103 java_library {
7104 name: "myjar",
7105 srcs: ["foo/bar/MyClass.java"],
7106 sdk_version: "none",
7107 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007108 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007109 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007110 }
7111 `)
7112}
7113
Jiyong Park7afd1072019-12-30 16:56:33 +09007114func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007115 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007116 apex {
7117 name: "myapex",
7118 key: "myapex.key",
7119 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007120 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007121 }
7122
7123 apex_key {
7124 name: "myapex.key",
7125 public_key: "testkey.avbpubkey",
7126 private_key: "testkey.pem",
7127 }
7128
7129 cc_library {
7130 name: "mylib",
7131 srcs: ["mylib.cpp"],
7132 system_shared_libs: [],
7133 stl: "none",
7134 required: ["a", "b"],
7135 host_required: ["c", "d"],
7136 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007137 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007138 }
7139 `)
7140
7141 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007142 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007143 name := apexBundle.BaseModuleName()
7144 prefix := "TARGET_"
7145 var builder strings.Builder
7146 data.Custom(&builder, name, prefix, "", data)
7147 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007148 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 -08007149 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7150 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007151}
7152
Jiyong Park7cd10e32020-01-14 09:22:18 +09007153func TestSymlinksFromApexToSystem(t *testing.T) {
7154 bp := `
7155 apex {
7156 name: "myapex",
7157 key: "myapex.key",
7158 native_shared_libs: ["mylib"],
7159 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007160 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007161 }
7162
Jiyong Park9d677202020-02-19 16:29:35 +09007163 apex {
7164 name: "myapex.updatable",
7165 key: "myapex.key",
7166 native_shared_libs: ["mylib"],
7167 java_libs: ["myjar"],
7168 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007169 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007170 }
7171
Jiyong Park7cd10e32020-01-14 09:22:18 +09007172 apex_key {
7173 name: "myapex.key",
7174 public_key: "testkey.avbpubkey",
7175 private_key: "testkey.pem",
7176 }
7177
7178 cc_library {
7179 name: "mylib",
7180 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007181 shared_libs: [
7182 "myotherlib",
7183 "myotherlib_ext",
7184 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007185 system_shared_libs: [],
7186 stl: "none",
7187 apex_available: [
7188 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007189 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007190 "//apex_available:platform",
7191 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007192 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007193 }
7194
7195 cc_library {
7196 name: "myotherlib",
7197 srcs: ["mylib.cpp"],
7198 system_shared_libs: [],
7199 stl: "none",
7200 apex_available: [
7201 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007202 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007203 "//apex_available:platform",
7204 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007205 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007206 }
7207
Jiyong Parkce243632023-02-17 18:22:25 +09007208 cc_library {
7209 name: "myotherlib_ext",
7210 srcs: ["mylib.cpp"],
7211 system_shared_libs: [],
7212 system_ext_specific: true,
7213 stl: "none",
7214 apex_available: [
7215 "myapex",
7216 "myapex.updatable",
7217 "//apex_available:platform",
7218 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007219 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007220 }
7221
Jiyong Park7cd10e32020-01-14 09:22:18 +09007222 java_library {
7223 name: "myjar",
7224 srcs: ["foo/bar/MyClass.java"],
7225 sdk_version: "none",
7226 system_modules: "none",
7227 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007228 apex_available: [
7229 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007230 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007231 "//apex_available:platform",
7232 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007233 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007234 }
7235
7236 java_library {
7237 name: "myotherjar",
7238 srcs: ["foo/bar/MyClass.java"],
7239 sdk_version: "none",
7240 system_modules: "none",
7241 apex_available: [
7242 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007243 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007244 "//apex_available:platform",
7245 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007246 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007247 }
7248 `
7249
7250 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7251 for _, f := range files {
7252 if f.path == file {
7253 if f.isLink {
7254 t.Errorf("%q is not a real file", file)
7255 }
7256 return
7257 }
7258 }
7259 t.Errorf("%q is not found", file)
7260 }
7261
Jiyong Parkce243632023-02-17 18:22:25 +09007262 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007263 for _, f := range files {
7264 if f.path == file {
7265 if !f.isLink {
7266 t.Errorf("%q is not a symlink", file)
7267 }
Jiyong Parkce243632023-02-17 18:22:25 +09007268 if f.src != target {
7269 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7270 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007271 return
7272 }
7273 }
7274 t.Errorf("%q is not found", file)
7275 }
7276
Jiyong Park9d677202020-02-19 16:29:35 +09007277 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7278 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007279 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007280 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007281 ensureRealfileExists(t, files, "javalib/myjar.jar")
7282 ensureRealfileExists(t, files, "lib64/mylib.so")
7283 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007284 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007285
Jiyong Park9d677202020-02-19 16:29:35 +09007286 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7287 ensureRealfileExists(t, files, "javalib/myjar.jar")
7288 ensureRealfileExists(t, files, "lib64/mylib.so")
7289 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007290 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007291
7292 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007293 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007294 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007295 ensureRealfileExists(t, files, "javalib/myjar.jar")
7296 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007297 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7298 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007299
7300 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7301 ensureRealfileExists(t, files, "javalib/myjar.jar")
7302 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007303 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7304 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007305}
7306
Yo Chiange8128052020-07-23 20:09:18 +08007307func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007308 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007309 apex {
7310 name: "myapex",
7311 key: "myapex.key",
7312 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007313 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007314 }
7315
7316 apex_key {
7317 name: "myapex.key",
7318 public_key: "testkey.avbpubkey",
7319 private_key: "testkey.pem",
7320 }
7321
7322 cc_library_shared {
7323 name: "mylib",
7324 srcs: ["mylib.cpp"],
7325 shared_libs: ["myotherlib"],
7326 system_shared_libs: [],
7327 stl: "none",
7328 apex_available: [
7329 "myapex",
7330 "//apex_available:platform",
7331 ],
7332 }
7333
7334 cc_prebuilt_library_shared {
7335 name: "myotherlib",
7336 srcs: ["prebuilt.so"],
7337 system_shared_libs: [],
7338 stl: "none",
7339 apex_available: [
7340 "myapex",
7341 "//apex_available:platform",
7342 ],
7343 }
7344 `)
7345
Prerana Patilb1896c82022-11-09 18:14:34 +00007346 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007347 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007348 var builder strings.Builder
7349 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7350 androidMk := builder.String()
7351 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007352 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007353 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7354 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7355 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007356 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 +08007357}
7358
Jooyung Han643adc42020-02-27 13:50:06 +09007359func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007360 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007361 apex {
7362 name: "myapex",
7363 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007364 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007365 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007366 }
7367
7368 apex_key {
7369 name: "myapex.key",
7370 public_key: "testkey.avbpubkey",
7371 private_key: "testkey.pem",
7372 }
7373
7374 cc_library {
7375 name: "mylib",
7376 srcs: ["mylib.cpp"],
7377 shared_libs: ["mylib2"],
7378 system_shared_libs: [],
7379 stl: "none",
7380 apex_available: [ "myapex" ],
7381 }
7382
7383 cc_library {
7384 name: "mylib2",
7385 srcs: ["mylib.cpp"],
7386 system_shared_libs: [],
7387 stl: "none",
7388 apex_available: [ "myapex" ],
7389 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007390
7391 rust_ffi_shared {
7392 name: "libfoo.rust",
7393 crate_name: "foo",
7394 srcs: ["foo.rs"],
7395 shared_libs: ["libfoo.shared_from_rust"],
7396 prefer_rlib: true,
7397 apex_available: ["myapex"],
7398 }
7399
7400 cc_library_shared {
7401 name: "libfoo.shared_from_rust",
7402 srcs: ["mylib.cpp"],
7403 system_shared_libs: [],
7404 stl: "none",
7405 stubs: {
7406 versions: ["10", "11", "12"],
7407 },
7408 }
7409
Jooyung Han643adc42020-02-27 13:50:06 +09007410 `)
7411
7412 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7413 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007414 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007415 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7416 "lib64/mylib.so",
7417 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007418 "lib64/libfoo.rust.so",
7419 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7420 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007421 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007422
7423 // b/220397949
7424 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007425}
7426
Jooyung Han49f67012020-04-17 13:43:10 +09007427func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007428 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007429 apex {
7430 name: "myapex",
7431 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007432 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007433 }
7434 apex_key {
7435 name: "myapex.key",
7436 public_key: "testkey.avbpubkey",
7437 private_key: "testkey.pem",
7438 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007439 `,
7440 android.FixtureModifyConfig(func(config android.Config) {
7441 delete(config.Targets, android.Android)
7442 config.AndroidCommonTarget = android.Target{}
7443 }),
7444 )
Jooyung Han49f67012020-04-17 13:43:10 +09007445
7446 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7447 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7448 }
7449}
7450
Jiyong Parkbd159612020-02-28 15:22:21 +09007451func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007452 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007453 apex {
7454 name: "myapex",
7455 key: "myapex.key",
7456 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007457 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007458 }
7459
7460 apex_key {
7461 name: "myapex.key",
7462 public_key: "testkey.avbpubkey",
7463 private_key: "testkey.pem",
7464 }
7465
7466 android_app {
7467 name: "AppFoo",
7468 srcs: ["foo/bar/MyClass.java"],
7469 sdk_version: "none",
7470 system_modules: "none",
7471 apex_available: [ "myapex" ],
7472 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007473 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007474
Colin Crosscf371cc2020-11-13 11:48:42 -08007475 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007476 content := bundleConfigRule.Args["content"]
7477
7478 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007479 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 +09007480}
7481
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007482func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007483 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007484 apex {
7485 name: "myapex",
7486 key: "myapex.key",
7487 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007488 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007489 }
7490
7491 apex_key {
7492 name: "myapex.key",
7493 public_key: "testkey.avbpubkey",
7494 private_key: "testkey.pem",
7495 }
7496
7497 android_app_set {
7498 name: "AppSet",
7499 set: "AppSet.apks",
7500 }`)
7501 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007502 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007503 content := bundleConfigRule.Args["content"]
7504 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7505 s := mod.Rule("apexRule").Args["copy_commands"]
7506 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007507 if len(copyCmds) != 4 {
7508 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007509 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007510 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7511 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007512 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7513 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007514
7515 // Ensure that canned_fs_config has an entry for the app set zip file
7516 generateFsRule := mod.Rule("generateFsConfig")
7517 cmd := generateFsRule.RuleParams.Command
7518 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007519}
7520
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007521func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007522 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007523 apex_set {
7524 name: "myapex",
7525 filename: "foo_v2.apex",
7526 sanitized: {
7527 none: { set: "myapex.apks", },
7528 hwaddress: { set: "myapex.hwasan.apks", },
7529 },
Paul Duffin24704672021-04-06 16:09:30 +01007530 }
7531 `
7532 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007533
Paul Duffin24704672021-04-06 16:09:30 +01007534 // Check that the extractor produces the correct output file from the correct input file.
7535 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007536
Paul Duffin24704672021-04-06 16:09:30 +01007537 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7538 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007539
Paul Duffin24704672021-04-06 16:09:30 +01007540 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7541
7542 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007543 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7544 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007545
7546 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007547}
7548
Pranav Guptaeba03b02022-09-27 00:27:08 +00007549func TestApexSetApksModuleAssignment(t *testing.T) {
7550 ctx := testApex(t, `
7551 apex_set {
7552 name: "myapex",
7553 set: ":myapex_apks_file",
7554 }
7555
7556 filegroup {
7557 name: "myapex_apks_file",
7558 srcs: ["myapex.apks"],
7559 }
7560 `)
7561
7562 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7563
7564 // Check that the extractor produces the correct apks file from the input module
7565 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7566 extractedApex := m.Output(extractorOutput)
7567
7568 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7569}
7570
Paul Duffin89f570a2021-06-16 01:42:33 +01007571func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007572 t.Helper()
7573
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007574 bp := `
7575 java_library {
7576 name: "some-updatable-apex-lib",
7577 srcs: ["a.java"],
7578 sdk_version: "current",
7579 apex_available: [
7580 "some-updatable-apex",
7581 ],
satayevabcd5972021-08-06 17:49:46 +01007582 permitted_packages: ["some.updatable.apex.lib"],
Spandan Dascc9d9422023-04-06 18:07:43 +00007583 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007584 }
7585
7586 java_library {
7587 name: "some-non-updatable-apex-lib",
7588 srcs: ["a.java"],
7589 apex_available: [
7590 "some-non-updatable-apex",
7591 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007592 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007593 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007594 }
7595
7596 bootclasspath_fragment {
7597 name: "some-non-updatable-fragment",
7598 contents: ["some-non-updatable-apex-lib"],
7599 apex_available: [
7600 "some-non-updatable-apex",
7601 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007602 hidden_api: {
7603 split_packages: ["*"],
7604 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007605 }
7606
7607 java_library {
7608 name: "some-platform-lib",
7609 srcs: ["a.java"],
7610 sdk_version: "current",
7611 installable: true,
7612 }
7613
7614 java_library {
7615 name: "some-art-lib",
7616 srcs: ["a.java"],
7617 sdk_version: "current",
7618 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007619 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007620 ],
7621 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007622 compile_dex: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007623 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007624 }
7625
7626 apex {
7627 name: "some-updatable-apex",
7628 key: "some-updatable-apex.key",
7629 java_libs: ["some-updatable-apex-lib"],
7630 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007631 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007632 }
7633
7634 apex {
7635 name: "some-non-updatable-apex",
7636 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007637 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007638 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007639 }
7640
7641 apex_key {
7642 name: "some-updatable-apex.key",
7643 }
7644
7645 apex_key {
7646 name: "some-non-updatable-apex.key",
7647 }
7648
7649 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007650 name: "com.android.art.debug",
7651 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007652 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007653 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007654 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007655 }
7656
Paul Duffinf23bc472021-04-27 12:42:20 +01007657 bootclasspath_fragment {
7658 name: "art-bootclasspath-fragment",
7659 image_name: "art",
7660 contents: ["some-art-lib"],
7661 apex_available: [
7662 "com.android.art.debug",
7663 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007664 hidden_api: {
7665 split_packages: ["*"],
7666 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007667 }
7668
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007669 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007670 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007671 }
7672
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007673 filegroup {
7674 name: "some-updatable-apex-file_contexts",
7675 srcs: [
7676 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7677 ],
7678 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007679
7680 filegroup {
7681 name: "some-non-updatable-apex-file_contexts",
7682 srcs: [
7683 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7684 ],
7685 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007686 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007687
Paul Duffin89f570a2021-06-16 01:42:33 +01007688 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007689}
7690
Paul Duffin89f570a2021-06-16 01:42:33 +01007691func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007692 t.Helper()
7693
Paul Duffin55607122021-03-30 23:32:51 +01007694 fs := android.MockFS{
7695 "a.java": nil,
7696 "a.jar": nil,
7697 "apex_manifest.json": nil,
7698 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007699 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007700 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7701 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7702 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007703 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007704 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007705
Paul Duffin55607122021-03-30 23:32:51 +01007706 errorHandler := android.FixtureExpectsNoErrors
7707 if errmsg != "" {
7708 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007709 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007710
Paul Duffin55607122021-03-30 23:32:51 +01007711 result := android.GroupFixturePreparers(
7712 cc.PrepareForTestWithCcDefaultModules,
7713 java.PrepareForTestWithHiddenApiBuildComponents,
7714 java.PrepareForTestWithJavaDefaultModules,
7715 java.PrepareForTestWithJavaSdkLibraryFiles,
7716 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007717 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007718 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007719 android.FixtureModifyMockFS(func(fs android.MockFS) {
7720 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7721 insert := ""
7722 for _, fragment := range fragments {
7723 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7724 }
7725 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7726 platform_bootclasspath {
7727 name: "platform-bootclasspath",
7728 fragments: [
7729 %s
7730 ],
7731 }
7732 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007733 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007734 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007735 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007736 ).
7737 ExtendWithErrorHandler(errorHandler).
7738 RunTestWithBp(t, bp)
7739
7740 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007741}
7742
Paul Duffin5556c5f2022-06-09 17:32:21 +00007743func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007744 preparers := android.GroupFixturePreparers(
7745 java.PrepareForTestWithJavaDefaultModules,
7746 PrepareForTestWithApexBuildComponents,
7747 ).
7748 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7749 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7750
7751 bpBase := `
7752 apex_set {
7753 name: "com.android.myapex",
7754 installable: true,
7755 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7756 set: "myapex.apks",
7757 }
7758
7759 apex_set {
7760 name: "com.mycompany.android.myapex",
7761 apex_name: "com.android.myapex",
7762 installable: true,
7763 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7764 set: "company-myapex.apks",
7765 }
7766
7767 prebuilt_bootclasspath_fragment {
7768 name: "my-bootclasspath-fragment",
7769 apex_available: ["com.android.myapex"],
7770 %s
7771 }
7772 `
7773
7774 t.Run("java_import", func(t *testing.T) {
7775 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7776 java_import {
7777 name: "libfoo",
7778 jars: ["libfoo.jar"],
7779 apex_available: ["com.android.myapex"],
7780 }
7781 `)
7782 })
7783
7784 t.Run("java_sdk_library_import", func(t *testing.T) {
7785 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7786 java_sdk_library_import {
7787 name: "libfoo",
7788 public: {
7789 jars: ["libbar.jar"],
7790 },
7791 apex_available: ["com.android.myapex"],
7792 }
7793 `)
7794 })
7795
7796 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7797 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7798 image_name: "art",
7799 contents: ["libfoo"],
7800 `)+`
7801 java_sdk_library_import {
7802 name: "libfoo",
7803 public: {
7804 jars: ["libbar.jar"],
7805 },
7806 apex_available: ["com.android.myapex"],
7807 }
7808 `)
7809 })
7810}
7811
Paul Duffin5556c5f2022-06-09 17:32:21 +00007812func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7813 preparers := android.GroupFixturePreparers(
7814 java.PrepareForTestWithJavaDefaultModules,
7815 PrepareForTestWithApexBuildComponents,
7816 )
7817
7818 bpBase := `
7819 apex_set {
7820 name: "com.android.myapex",
7821 installable: true,
7822 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7823 set: "myapex.apks",
7824 }
7825
7826 apex_set {
7827 name: "com.android.myapex_compressed",
7828 apex_name: "com.android.myapex",
7829 installable: true,
7830 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7831 set: "myapex_compressed.apks",
7832 }
7833
7834 prebuilt_bootclasspath_fragment {
7835 name: "my-bootclasspath-fragment",
7836 apex_available: [
7837 "com.android.myapex",
7838 "com.android.myapex_compressed",
7839 ],
7840 hidden_api: {
7841 annotation_flags: "annotation-flags.csv",
7842 metadata: "metadata.csv",
7843 index: "index.csv",
7844 signature_patterns: "signature_patterns.csv",
7845 },
7846 %s
7847 }
7848 `
7849
7850 t.Run("java_import", func(t *testing.T) {
7851 result := preparers.RunTestWithBp(t,
7852 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7853 java_import {
7854 name: "libfoo",
7855 jars: ["libfoo.jar"],
7856 apex_available: [
7857 "com.android.myapex",
7858 "com.android.myapex_compressed",
7859 ],
7860 }
7861 `)
7862
7863 module := result.Module("libfoo", "android_common_com.android.myapex")
7864 usesLibraryDep := module.(java.UsesLibraryDependency)
7865 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7866 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7867 usesLibraryDep.DexJarBuildPath().Path())
7868 })
7869
7870 t.Run("java_sdk_library_import", func(t *testing.T) {
7871 result := preparers.RunTestWithBp(t,
7872 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7873 java_sdk_library_import {
7874 name: "libfoo",
7875 public: {
7876 jars: ["libbar.jar"],
7877 },
7878 apex_available: [
7879 "com.android.myapex",
7880 "com.android.myapex_compressed",
7881 ],
7882 compile_dex: true,
7883 }
7884 `)
7885
7886 module := result.Module("libfoo", "android_common_com.android.myapex")
7887 usesLibraryDep := module.(java.UsesLibraryDependency)
7888 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7889 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7890 usesLibraryDep.DexJarBuildPath().Path())
7891 })
7892
7893 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7894 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7895 image_name: "art",
7896 contents: ["libfoo"],
7897 `)+`
7898 java_sdk_library_import {
7899 name: "libfoo",
7900 public: {
7901 jars: ["libbar.jar"],
7902 },
7903 apex_available: [
7904 "com.android.myapex",
7905 "com.android.myapex_compressed",
7906 ],
7907 compile_dex: true,
7908 }
7909 `)
7910 })
7911}
7912
Jooyung Han548640b2020-04-27 12:10:30 +09007913func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7914 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7915 apex {
7916 name: "myapex",
7917 key: "myapex.key",
7918 updatable: true,
7919 }
7920
7921 apex_key {
7922 name: "myapex.key",
7923 public_key: "testkey.avbpubkey",
7924 private_key: "testkey.pem",
7925 }
7926 `)
7927}
7928
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007929func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7930 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7931 apex {
7932 name: "myapex",
7933 key: "myapex.key",
7934 }
7935
7936 apex_key {
7937 name: "myapex.key",
7938 public_key: "testkey.avbpubkey",
7939 private_key: "testkey.pem",
7940 }
7941 `)
7942}
7943
Jooyung Handfc864c2023-03-20 18:19:07 +09007944func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
7945 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08007946 apex {
7947 name: "myapex",
7948 key: "myapex.key",
7949 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09007950 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08007951 soc_specific: true,
7952 }
7953
7954 apex_key {
7955 name: "myapex.key",
7956 public_key: "testkey.avbpubkey",
7957 private_key: "testkey.pem",
7958 }
7959 `)
7960}
7961
Jooyung Han02873da2023-03-22 17:41:03 +09007962func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
7963 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
7964 apex {
7965 name: "myapex",
7966 key: "myapex.key",
7967 updatable: false,
7968 min_sdk_version: "29",
7969 use_vndk_as_stable: true,
7970 vendor: true,
7971 }
7972
7973 apex_key {
7974 name: "myapex.key",
7975 public_key: "testkey.avbpubkey",
7976 private_key: "testkey.pem",
7977 }
7978 `)
7979}
7980
Jooyung Handfc864c2023-03-20 18:19:07 +09007981func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
7982 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
7983 apex {
7984 name: "myapex",
7985 key: "myapex.key",
7986 updatable: false,
7987 use_vndk_as_stable: true,
7988 }
7989
7990 apex_key {
7991 name: "myapex.key",
7992 public_key: "testkey.avbpubkey",
7993 private_key: "testkey.pem",
7994 }
7995 `)
7996}
7997
satayevb98371c2021-06-15 16:49:50 +01007998func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7999 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8000 apex {
8001 name: "myapex",
8002 key: "myapex.key",
8003 systemserverclasspath_fragments: [
8004 "mysystemserverclasspathfragment",
8005 ],
8006 min_sdk_version: "29",
8007 updatable: true,
8008 }
8009
8010 apex_key {
8011 name: "myapex.key",
8012 public_key: "testkey.avbpubkey",
8013 private_key: "testkey.pem",
8014 }
8015
8016 java_library {
8017 name: "foo",
8018 srcs: ["b.java"],
8019 min_sdk_version: "29",
8020 installable: true,
8021 apex_available: [
8022 "myapex",
8023 ],
8024 }
8025
8026 systemserverclasspath_fragment {
8027 name: "mysystemserverclasspathfragment",
8028 generate_classpaths_proto: false,
8029 contents: [
8030 "foo",
8031 ],
8032 apex_available: [
8033 "myapex",
8034 ],
8035 }
satayevabcd5972021-08-06 17:49:46 +01008036 `,
8037 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8038 )
satayevb98371c2021-06-15 16:49:50 +01008039}
8040
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008041func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008042 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
8043 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
8044 // modules to be included in the BootJars.
8045 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
8046 return android.GroupFixturePreparers(
8047 dexpreopt.FixtureSetBootJars(bootJars...),
8048 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8049 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8050 }),
8051 )
8052 }
8053
8054 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
8055 // same value. This can result in an invalid configuration as it allows non art apex jars to be
8056 // specified in the ArtApexJars configuration.
8057 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
8058 return android.GroupFixturePreparers(
8059 dexpreopt.FixtureSetArtBootJars(bootJars...),
8060 dexpreopt.FixtureSetBootJars(bootJars...),
8061 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8062 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8063 }),
8064 )
8065 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008066
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008067 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008068 preparer := android.GroupFixturePreparers(
8069 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
8070 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8071 )
8072 fragments := []java.ApexVariantReference{
8073 {
8074 Apex: proptools.StringPtr("com.android.art.debug"),
8075 Module: proptools.StringPtr("art-bootclasspath-fragment"),
8076 },
8077 {
8078 Apex: proptools.StringPtr("some-non-updatable-apex"),
8079 Module: proptools.StringPtr("some-non-updatable-fragment"),
8080 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008081 }
satayevabcd5972021-08-06 17:49:46 +01008082 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008083 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008084
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008085 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008086 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
8087 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01008088 preparer := android.GroupFixturePreparers(
8089 prepareSetBootJars("com.android.art.debug:some-art-lib"),
8090 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8091 )
Paul Duffin60264a02021-04-12 20:02:36 +01008092 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008093 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008094
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008095 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 +01008096 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 +01008097 // Update the dexpreopt ArtApexJars directly.
8098 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
8099 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008100 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008101
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008102 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 +01008103 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 +01008104 // Update the dexpreopt ArtApexJars directly.
8105 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
8106 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008107 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008108
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008109 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 +01008110 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 +01008111 preparer := android.GroupFixturePreparers(
8112 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
8113 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8114 )
Paul Duffin60264a02021-04-12 20:02:36 +01008115 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008116 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008117
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008118 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 +01008119 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01008120 fragment := java.ApexVariantReference{
8121 Apex: proptools.StringPtr("some-non-updatable-apex"),
8122 Module: proptools.StringPtr("some-non-updatable-fragment"),
8123 }
8124 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008125 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008126
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008127 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008128 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008129 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8130 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008131 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008132
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008133 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008134 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008135 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8136 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008137 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008138
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008139 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008140 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01008141 // Update the dexpreopt ArtApexJars directly.
8142 preparer := prepareSetArtJars("platform:some-platform-lib")
8143 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008144 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008145
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008146 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008147 preparer := android.GroupFixturePreparers(
8148 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8149 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8150 )
8151 fragments := []java.ApexVariantReference{
8152 {
8153 Apex: proptools.StringPtr("some-non-updatable-apex"),
8154 Module: proptools.StringPtr("some-non-updatable-fragment"),
8155 },
8156 }
8157 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008158 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008159}
8160
8161func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008162 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008163 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008164 fragment := java.ApexVariantReference{
8165 Apex: proptools.StringPtr("myapex"),
8166 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8167 }
8168
Paul Duffin064b70c2020-11-02 17:32:38 +00008169 testDexpreoptWithApexes(t, `
8170 prebuilt_apex {
8171 name: "myapex" ,
8172 arch: {
8173 arm64: {
8174 src: "myapex-arm64.apex",
8175 },
8176 arm: {
8177 src: "myapex-arm.apex",
8178 },
8179 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008180 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8181 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008182
Paul Duffin89f570a2021-06-16 01:42:33 +01008183 prebuilt_bootclasspath_fragment {
8184 name: "my-bootclasspath-fragment",
8185 contents: ["libfoo"],
8186 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008187 hidden_api: {
8188 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8189 metadata: "my-bootclasspath-fragment/metadata.csv",
8190 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008191 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8192 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8193 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008194 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008195 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008196
Paul Duffin89f570a2021-06-16 01:42:33 +01008197 java_import {
8198 name: "libfoo",
8199 jars: ["libfoo.jar"],
8200 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008201 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008202 }
8203 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008204 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008205}
8206
Spandan Dasf14e2542021-11-12 00:01:37 +00008207func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008208 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008209 bp += `
8210 apex_key {
8211 name: "myapex.key",
8212 public_key: "testkey.avbpubkey",
8213 private_key: "testkey.pem",
8214 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008215 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008216 "lib1/src/A.java": nil,
8217 "lib2/src/B.java": nil,
8218 "system/sepolicy/apex/myapex-file_contexts": nil,
8219 }
8220
Paul Duffin45338f02021-03-30 23:07:52 +01008221 errorHandler := android.FixtureExpectsNoErrors
8222 if errmsg != "" {
8223 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008224 }
Colin Crossae8600b2020-10-29 17:09:13 -07008225
Paul Duffin45338f02021-03-30 23:07:52 +01008226 android.GroupFixturePreparers(
8227 android.PrepareForTestWithAndroidBuildComponents,
8228 java.PrepareForTestWithJavaBuildComponents,
8229 PrepareForTestWithApexBuildComponents,
8230 android.PrepareForTestWithNeverallowRules(rules),
8231 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008232 apexBootJars := make([]string, 0, len(bootJars))
8233 for _, apexBootJar := range bootJars {
8234 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008235 }
satayevd604b212021-07-21 14:23:52 +01008236 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008237 }),
8238 fs.AddToFixture(),
8239 ).
8240 ExtendWithErrorHandler(errorHandler).
8241 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008242}
8243
8244func TestApexPermittedPackagesRules(t *testing.T) {
8245 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008246 name string
8247 expectedError string
8248 bp string
8249 bootJars []string
8250 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008251 }{
8252
8253 {
8254 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8255 expectedError: "",
8256 bp: `
8257 java_library {
8258 name: "bcp_lib1",
8259 srcs: ["lib1/src/*.java"],
8260 permitted_packages: ["foo.bar"],
8261 apex_available: ["myapex"],
8262 sdk_version: "none",
8263 system_modules: "none",
8264 }
8265 java_library {
8266 name: "nonbcp_lib2",
8267 srcs: ["lib2/src/*.java"],
8268 apex_available: ["myapex"],
8269 permitted_packages: ["a.b"],
8270 sdk_version: "none",
8271 system_modules: "none",
8272 }
8273 apex {
8274 name: "myapex",
8275 key: "myapex.key",
8276 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008277 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008278 }`,
8279 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008280 bcpPermittedPackages: map[string][]string{
8281 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008282 "foo.bar",
8283 },
8284 },
8285 },
8286 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008287 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008288 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 +01008289 bp: `
8290 java_library {
8291 name: "bcp_lib1",
8292 srcs: ["lib1/src/*.java"],
8293 apex_available: ["myapex"],
8294 permitted_packages: ["foo.bar"],
8295 sdk_version: "none",
8296 system_modules: "none",
8297 }
8298 java_library {
8299 name: "bcp_lib2",
8300 srcs: ["lib2/src/*.java"],
8301 apex_available: ["myapex"],
8302 permitted_packages: ["foo.bar", "bar.baz"],
8303 sdk_version: "none",
8304 system_modules: "none",
8305 }
8306 apex {
8307 name: "myapex",
8308 key: "myapex.key",
8309 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008310 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008311 }
8312 `,
8313 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008314 bcpPermittedPackages: map[string][]string{
8315 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008316 "foo.bar",
8317 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008318 "bcp_lib2": []string{
8319 "foo.bar",
8320 },
8321 },
8322 },
8323 {
8324 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8325 expectedError: "",
8326 bp: `
8327 java_library {
8328 name: "bcp_lib_restricted",
8329 srcs: ["lib1/src/*.java"],
8330 apex_available: ["myapex"],
8331 permitted_packages: ["foo.bar"],
8332 sdk_version: "none",
8333 min_sdk_version: "29",
8334 system_modules: "none",
8335 }
8336 java_library {
8337 name: "bcp_lib_unrestricted",
8338 srcs: ["lib2/src/*.java"],
8339 apex_available: ["myapex"],
8340 permitted_packages: ["foo.bar", "bar.baz"],
8341 sdk_version: "none",
8342 min_sdk_version: "29",
8343 system_modules: "none",
8344 }
8345 apex {
8346 name: "myapex",
8347 key: "myapex.key",
8348 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8349 updatable: true,
8350 min_sdk_version: "29",
8351 }
8352 `,
8353 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8354 bcpPermittedPackages: map[string][]string{
8355 "bcp_lib1_non_updateable": []string{
8356 "foo.bar",
8357 },
8358 // 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 +01008359 },
8360 },
8361 }
8362 for _, tc := range testcases {
8363 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008364 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8365 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008366 })
8367 }
8368}
8369
Jiyong Park62304bb2020-04-13 16:19:48 +09008370func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008371 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008372 apex {
8373 name: "myapex",
8374 key: "myapex.key",
8375 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008376 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008377 }
8378
8379 apex_key {
8380 name: "myapex.key",
8381 public_key: "testkey.avbpubkey",
8382 private_key: "testkey.pem",
8383 }
8384
8385 cc_library {
8386 name: "mylib",
8387 srcs: ["mylib.cpp"],
8388 system_shared_libs: [],
8389 stl: "none",
8390 stubs: {
8391 versions: ["1"],
8392 },
8393 apex_available: ["myapex"],
8394 }
8395
8396 cc_library {
8397 name: "myprivlib",
8398 srcs: ["mylib.cpp"],
8399 system_shared_libs: [],
8400 stl: "none",
8401 apex_available: ["myapex"],
8402 }
8403
8404
8405 cc_test {
8406 name: "mytest",
8407 gtest: false,
8408 srcs: ["mylib.cpp"],
8409 system_shared_libs: [],
8410 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008411 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008412 test_for: ["myapex"]
8413 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008414
8415 cc_library {
8416 name: "mytestlib",
8417 srcs: ["mylib.cpp"],
8418 system_shared_libs: [],
8419 shared_libs: ["mylib", "myprivlib"],
8420 stl: "none",
8421 test_for: ["myapex"],
8422 }
8423
8424 cc_benchmark {
8425 name: "mybench",
8426 srcs: ["mylib.cpp"],
8427 system_shared_libs: [],
8428 shared_libs: ["mylib", "myprivlib"],
8429 stl: "none",
8430 test_for: ["myapex"],
8431 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008432 `)
8433
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008434 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008435 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008436 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8437 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8438 }
8439
8440 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008441 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008442 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8443 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8444 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8445}
Jiyong Park46a512f2020-12-04 18:02:13 +09008446
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008447func TestIndirectTestFor(t *testing.T) {
8448 ctx := testApex(t, `
8449 apex {
8450 name: "myapex",
8451 key: "myapex.key",
8452 native_shared_libs: ["mylib", "myprivlib"],
8453 updatable: false,
8454 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008455
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008456 apex_key {
8457 name: "myapex.key",
8458 public_key: "testkey.avbpubkey",
8459 private_key: "testkey.pem",
8460 }
8461
8462 cc_library {
8463 name: "mylib",
8464 srcs: ["mylib.cpp"],
8465 system_shared_libs: [],
8466 stl: "none",
8467 stubs: {
8468 versions: ["1"],
8469 },
8470 apex_available: ["myapex"],
8471 }
8472
8473 cc_library {
8474 name: "myprivlib",
8475 srcs: ["mylib.cpp"],
8476 system_shared_libs: [],
8477 stl: "none",
8478 shared_libs: ["mylib"],
8479 apex_available: ["myapex"],
8480 }
8481
8482 cc_library {
8483 name: "mytestlib",
8484 srcs: ["mylib.cpp"],
8485 system_shared_libs: [],
8486 shared_libs: ["myprivlib"],
8487 stl: "none",
8488 test_for: ["myapex"],
8489 }
8490 `)
8491
8492 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008493 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008494 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8495 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8496 }
8497
8498 // The platform variant of mytestlib links to the platform variant of the
8499 // internal myprivlib.
8500 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8501
8502 // The platform variant of myprivlib links to the platform variant of mylib
8503 // and bypasses its stubs.
8504 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 +09008505}
8506
Martin Stjernholmec009002021-03-27 15:18:31 +00008507func TestTestForForLibInOtherApex(t *testing.T) {
8508 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8509 _ = testApex(t, `
8510 apex {
8511 name: "com.android.art",
8512 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008513 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008514 updatable: false,
8515 }
8516
8517 apex {
8518 name: "com.android.art.debug",
8519 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008520 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008521 updatable: false,
8522 }
8523
8524 apex_key {
8525 name: "myapex.key",
8526 public_key: "testkey.avbpubkey",
8527 private_key: "testkey.pem",
8528 }
8529
8530 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008531 name: "libnativebridge",
8532 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008533 system_shared_libs: [],
8534 stl: "none",
8535 stubs: {
8536 versions: ["1"],
8537 },
8538 apex_available: ["com.android.art", "com.android.art.debug"],
8539 }
8540
8541 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008542 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008543 srcs: ["mylib.cpp"],
8544 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008545 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008546 stl: "none",
8547 apex_available: ["com.android.art.debug"],
8548 test_for: ["com.android.art"],
8549 }
8550 `,
8551 android.MockFS{
8552 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8553 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8554 }.AddToFixture())
8555}
8556
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008557// TODO(jungjw): Move this to proptools
8558func intPtr(i int) *int {
8559 return &i
8560}
8561
8562func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008563 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008564 apex_set {
8565 name: "myapex",
8566 set: "myapex.apks",
8567 filename: "foo_v2.apex",
8568 overrides: ["foo"],
8569 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008570 `,
8571 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8572 variables.Platform_sdk_version = intPtr(30)
8573 }),
8574 android.FixtureModifyConfig(func(config android.Config) {
8575 config.Targets[android.Android] = []android.Target{
8576 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8577 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8578 }
8579 }),
8580 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008581
Paul Duffin24704672021-04-06 16:09:30 +01008582 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008583
8584 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008585 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008586 actual := extractedApex.Args["abis"]
8587 expected := "ARMEABI_V7A,ARM64_V8A"
8588 if actual != expected {
8589 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8590 }
8591 actual = extractedApex.Args["sdk-version"]
8592 expected = "30"
8593 if actual != expected {
8594 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8595 }
8596
Paul Duffin6717d882021-06-15 19:09:41 +01008597 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008598 a := m.Module().(*ApexSet)
8599 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008600 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008601 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8602 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8603 }
8604}
8605
Anton Hansson805e0a52022-11-25 14:06:46 +00008606func TestApexSet_NativeBridge(t *testing.T) {
8607 ctx := testApex(t, `
8608 apex_set {
8609 name: "myapex",
8610 set: "myapex.apks",
8611 filename: "foo_v2.apex",
8612 overrides: ["foo"],
8613 }
8614 `,
8615 android.FixtureModifyConfig(func(config android.Config) {
8616 config.Targets[android.Android] = []android.Target{
8617 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8618 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8619 }
8620 }),
8621 )
8622
8623 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8624
8625 // Check extract_apks tool parameters. No native bridge arch expected
8626 extractedApex := m.Output("extracted/myapex.apks")
8627 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8628}
8629
Jiyong Park7d95a512020-05-10 15:16:24 +09008630func TestNoStaticLinkingToStubsLib(t *testing.T) {
8631 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8632 apex {
8633 name: "myapex",
8634 key: "myapex.key",
8635 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008636 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008637 }
8638
8639 apex_key {
8640 name: "myapex.key",
8641 public_key: "testkey.avbpubkey",
8642 private_key: "testkey.pem",
8643 }
8644
8645 cc_library {
8646 name: "mylib",
8647 srcs: ["mylib.cpp"],
8648 static_libs: ["otherlib"],
8649 system_shared_libs: [],
8650 stl: "none",
8651 apex_available: [ "myapex" ],
8652 }
8653
8654 cc_library {
8655 name: "otherlib",
8656 srcs: ["mylib.cpp"],
8657 system_shared_libs: [],
8658 stl: "none",
8659 stubs: {
8660 versions: ["1", "2", "3"],
8661 },
8662 apex_available: [ "myapex" ],
8663 }
8664 `)
8665}
8666
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008667func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008668 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008669 apex {
8670 name: "myapex",
8671 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008672 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008673 custom_sign_tool: "sign_myapex",
8674 }
8675
8676 apex_key {
8677 name: "myapex.key",
8678 public_key: "testkey.avbpubkey",
8679 private_key: "testkey.pem",
8680 }
8681 `)
8682
8683 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8684 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8685 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"`)
8686}
8687
8688func TestApexKeysTxtOverrides(t *testing.T) {
8689 ctx := testApex(t, `
8690 apex {
8691 name: "myapex",
8692 key: "myapex.key",
8693 updatable: false,
8694 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008695 }
8696
8697 apex_key {
8698 name: "myapex.key",
8699 public_key: "testkey.avbpubkey",
8700 private_key: "testkey.pem",
8701 }
8702
8703 prebuilt_apex {
8704 name: "myapex",
8705 prefer: true,
8706 arch: {
8707 arm64: {
8708 src: "myapex-arm64.apex",
8709 },
8710 arm: {
8711 src: "myapex-arm.apex",
8712 },
8713 },
8714 }
8715
8716 apex_set {
8717 name: "myapex_set",
8718 set: "myapex.apks",
8719 filename: "myapex_set.apex",
8720 overrides: ["myapex"],
8721 }
8722 `)
8723
8724 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8725 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8726 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 +09008727 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 +09008728}
8729
Jooyung Han938b5932020-06-20 12:47:47 +09008730func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008731 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008732 apex {
8733 name: "myapex",
8734 key: "myapex.key",
8735 apps: ["app"],
8736 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008737 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008738 }
8739
8740 apex_key {
8741 name: "myapex.key",
8742 public_key: "testkey.avbpubkey",
8743 private_key: "testkey.pem",
8744 }
8745
8746 android_app {
8747 name: "app",
8748 srcs: ["foo/bar/MyClass.java"],
8749 package_name: "foo",
8750 sdk_version: "none",
8751 system_modules: "none",
8752 apex_available: [ "myapex" ],
8753 }
8754 `, withFiles(map[string][]byte{
8755 "sub/Android.bp": []byte(`
8756 override_apex {
8757 name: "override_myapex",
8758 base: "myapex",
8759 apps: ["override_app"],
8760 allowed_files: ":allowed",
8761 }
8762 // Overridable "path" property should be referenced indirectly
8763 filegroup {
8764 name: "allowed",
8765 srcs: ["allowed.txt"],
8766 }
8767 override_android_app {
8768 name: "override_app",
8769 base: "app",
8770 package_name: "bar",
8771 }
8772 `),
8773 }))
8774
8775 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8776 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8777 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8778 }
8779
8780 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8781 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8782 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8783 }
8784}
8785
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008786func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008787 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008788 apex {
8789 name: "myapex",
8790 key: "myapex.key",
8791 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008792 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008793 }
8794
8795 apex_key {
8796 name: "myapex.key",
8797 public_key: "testkey.avbpubkey",
8798 private_key: "testkey.pem",
8799 }
8800
8801 cc_library {
8802 name: "mylib",
8803 srcs: ["mylib.cpp"],
8804 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008805 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008806 },
8807 apex_available: ["myapex"],
8808 }
8809
8810 cc_prebuilt_library_shared {
8811 name: "mylib",
8812 prefer: false,
8813 srcs: ["prebuilt.so"],
8814 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008815 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008816 },
8817 apex_available: ["myapex"],
8818 }
8819 `)
8820}
8821
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008822func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008823 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008824 apex {
8825 name: "myapex",
8826 key: "myapex.key",
8827 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008828 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008829 }
8830 apex_key {
8831 name: "myapex.key",
8832 public_key: "testkey.avbpubkey",
8833 private_key: "testkey.pem",
8834 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008835 `,
8836 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8837 variables.CompressedApex = proptools.BoolPtr(true)
8838 }),
8839 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008840
8841 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8842 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8843
8844 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8845 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8846
8847 // Make sure output of bundle is .capex
8848 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8849 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8850
8851 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008852 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008853 var builder strings.Builder
8854 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8855 androidMk := builder.String()
8856 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8857}
8858
Martin Stjernholm2856c662020-12-02 15:03:42 +00008859func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008860 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008861 apex {
8862 name: "myapex",
8863 key: "myapex.key",
8864 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008865 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008866 }
8867
8868 apex_key {
8869 name: "myapex.key",
8870 public_key: "testkey.avbpubkey",
8871 private_key: "testkey.pem",
8872 }
8873
8874 cc_library {
8875 name: "mylib",
8876 srcs: ["mylib.cpp"],
8877 apex_available: ["myapex"],
8878 shared_libs: ["otherlib"],
8879 system_shared_libs: [],
8880 }
8881
8882 cc_library {
8883 name: "otherlib",
8884 srcs: ["mylib.cpp"],
8885 stubs: {
8886 versions: ["current"],
8887 },
8888 }
8889
8890 cc_prebuilt_library_shared {
8891 name: "otherlib",
8892 prefer: true,
8893 srcs: ["prebuilt.so"],
8894 stubs: {
8895 versions: ["current"],
8896 },
8897 }
8898 `)
8899
8900 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008901 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008902 var builder strings.Builder
8903 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8904 androidMk := builder.String()
8905
8906 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8907 // a thing there.
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008908 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 +00008909}
8910
Jiyong Parke3867542020-12-03 17:28:25 +09008911func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008912 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008913 apex {
8914 name: "myapex",
8915 key: "myapex.key",
8916 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008917 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008918 }
8919
8920 apex_key {
8921 name: "myapex.key",
8922 public_key: "testkey.avbpubkey",
8923 private_key: "testkey.pem",
8924 }
8925
8926 cc_library {
8927 name: "mylib",
8928 srcs: ["mylib.cpp"],
8929 system_shared_libs: [],
8930 stl: "none",
8931 apex_available: ["myapex"],
8932 shared_libs: ["mylib2"],
8933 target: {
8934 apex: {
8935 exclude_shared_libs: ["mylib2"],
8936 },
8937 },
8938 }
8939
8940 cc_library {
8941 name: "mylib2",
8942 srcs: ["mylib.cpp"],
8943 system_shared_libs: [],
8944 stl: "none",
8945 }
8946 `)
8947
8948 // Check if mylib is linked to mylib2 for the non-apex target
8949 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8950 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8951
8952 // Make sure that the link doesn't occur for the apex target
8953 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8954 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8955
8956 // It shouldn't appear in the copy cmd as well.
8957 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8958 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8959}
8960
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008961func TestPrebuiltStubLibDep(t *testing.T) {
8962 bpBase := `
8963 apex {
8964 name: "myapex",
8965 key: "myapex.key",
8966 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008967 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008968 }
8969 apex_key {
8970 name: "myapex.key",
8971 public_key: "testkey.avbpubkey",
8972 private_key: "testkey.pem",
8973 }
8974 cc_library {
8975 name: "mylib",
8976 srcs: ["mylib.cpp"],
8977 apex_available: ["myapex"],
8978 shared_libs: ["stublib"],
8979 system_shared_libs: [],
8980 }
8981 apex {
8982 name: "otherapex",
8983 enabled: %s,
8984 key: "myapex.key",
8985 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008986 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008987 }
8988 `
8989
8990 stublibSourceBp := `
8991 cc_library {
8992 name: "stublib",
8993 srcs: ["mylib.cpp"],
8994 apex_available: ["otherapex"],
8995 system_shared_libs: [],
8996 stl: "none",
8997 stubs: {
8998 versions: ["1"],
8999 },
9000 }
9001 `
9002
9003 stublibPrebuiltBp := `
9004 cc_prebuilt_library_shared {
9005 name: "stublib",
9006 srcs: ["prebuilt.so"],
9007 apex_available: ["otherapex"],
9008 stubs: {
9009 versions: ["1"],
9010 },
9011 %s
9012 }
9013 `
9014
9015 tests := []struct {
9016 name string
9017 stublibBp string
9018 usePrebuilt bool
9019 modNames []string // Modules to collect AndroidMkEntries for
9020 otherApexEnabled []string
9021 }{
9022 {
9023 name: "only_source",
9024 stublibBp: stublibSourceBp,
9025 usePrebuilt: false,
9026 modNames: []string{"stublib"},
9027 otherApexEnabled: []string{"true", "false"},
9028 },
9029 {
9030 name: "source_preferred",
9031 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9032 usePrebuilt: false,
9033 modNames: []string{"stublib", "prebuilt_stublib"},
9034 otherApexEnabled: []string{"true", "false"},
9035 },
9036 {
9037 name: "prebuilt_preferred",
9038 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9039 usePrebuilt: true,
9040 modNames: []string{"stublib", "prebuilt_stublib"},
9041 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9042 },
9043 {
9044 name: "only_prebuilt",
9045 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9046 usePrebuilt: true,
9047 modNames: []string{"stublib"},
9048 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9049 },
9050 }
9051
9052 for _, test := range tests {
9053 t.Run(test.name, func(t *testing.T) {
9054 for _, otherApexEnabled := range test.otherApexEnabled {
9055 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009056 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009057
9058 type modAndMkEntries struct {
9059 mod *cc.Module
9060 mkEntries android.AndroidMkEntries
9061 }
9062 entries := []*modAndMkEntries{}
9063
9064 // Gather shared lib modules that are installable
9065 for _, modName := range test.modNames {
9066 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9067 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9068 continue
9069 }
9070 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009071 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009072 continue
9073 }
Colin Crossaa255532020-07-03 13:18:24 -07009074 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009075 if ent.Disabled {
9076 continue
9077 }
9078 entries = append(entries, &modAndMkEntries{
9079 mod: mod,
9080 mkEntries: ent,
9081 })
9082 }
9083 }
9084 }
9085
9086 var entry *modAndMkEntries = nil
9087 for _, ent := range entries {
9088 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9089 if entry != nil {
9090 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9091 } else {
9092 entry = ent
9093 }
9094 }
9095 }
9096
9097 if entry == nil {
9098 t.Errorf("AndroidMk entry for \"stublib\" missing")
9099 } else {
9100 isPrebuilt := entry.mod.Prebuilt() != nil
9101 if isPrebuilt != test.usePrebuilt {
9102 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9103 }
9104 if !entry.mod.IsStubs() {
9105 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9106 }
9107 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9108 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9109 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009110 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009111 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009112 if !android.InList(expected, cflags) {
9113 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9114 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009115 }
9116 })
9117 }
9118 })
9119 }
9120}
9121
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009122func TestHostApexInHostOnlyBuild(t *testing.T) {
9123 testApex(t, `
9124 apex {
9125 name: "myapex",
9126 host_supported: true,
9127 key: "myapex.key",
9128 updatable: false,
9129 payload_type: "zip",
9130 }
9131 apex_key {
9132 name: "myapex.key",
9133 public_key: "testkey.avbpubkey",
9134 private_key: "testkey.pem",
9135 }
9136 `,
9137 android.FixtureModifyConfig(func(config android.Config) {
9138 // We may not have device targets in all builds, e.g. in
9139 // prebuilts/build-tools/build-prebuilts.sh
9140 config.Targets[android.Android] = []android.Target{}
9141 }))
9142}
9143
Colin Crossc33e5212021-05-25 18:16:02 -07009144func TestApexJavaCoverage(t *testing.T) {
9145 bp := `
9146 apex {
9147 name: "myapex",
9148 key: "myapex.key",
9149 java_libs: ["mylib"],
9150 bootclasspath_fragments: ["mybootclasspathfragment"],
9151 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9152 updatable: false,
9153 }
9154
9155 apex_key {
9156 name: "myapex.key",
9157 public_key: "testkey.avbpubkey",
9158 private_key: "testkey.pem",
9159 }
9160
9161 java_library {
9162 name: "mylib",
9163 srcs: ["mylib.java"],
9164 apex_available: ["myapex"],
9165 compile_dex: true,
9166 }
9167
9168 bootclasspath_fragment {
9169 name: "mybootclasspathfragment",
9170 contents: ["mybootclasspathlib"],
9171 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009172 hidden_api: {
9173 split_packages: ["*"],
9174 },
Colin Crossc33e5212021-05-25 18:16:02 -07009175 }
9176
9177 java_library {
9178 name: "mybootclasspathlib",
9179 srcs: ["mybootclasspathlib.java"],
9180 apex_available: ["myapex"],
9181 compile_dex: true,
9182 }
9183
9184 systemserverclasspath_fragment {
9185 name: "mysystemserverclasspathfragment",
9186 contents: ["mysystemserverclasspathlib"],
9187 apex_available: ["myapex"],
9188 }
9189
9190 java_library {
9191 name: "mysystemserverclasspathlib",
9192 srcs: ["mysystemserverclasspathlib.java"],
9193 apex_available: ["myapex"],
9194 compile_dex: true,
9195 }
9196 `
9197
9198 result := android.GroupFixturePreparers(
9199 PrepareForTestWithApexBuildComponents,
9200 prepareForTestWithMyapex,
9201 java.PrepareForTestWithJavaDefaultModules,
9202 android.PrepareForTestWithAndroidBuildComponents,
9203 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009204 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9205 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009206 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009207 ).RunTest(t)
9208
9209 // Make sure jacoco ran on both mylib and mybootclasspathlib
9210 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9211 t.Errorf("Failed to find jacoco rule for mylib")
9212 }
9213 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9214 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9215 }
9216 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9217 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9218 }
9219}
9220
Jiyong Park192600a2021-08-03 07:52:17 +00009221func TestProhibitStaticExecutable(t *testing.T) {
9222 testApexError(t, `executable mybin is static`, `
9223 apex {
9224 name: "myapex",
9225 key: "myapex.key",
9226 binaries: ["mybin"],
9227 min_sdk_version: "29",
9228 }
9229
9230 apex_key {
9231 name: "myapex.key",
9232 public_key: "testkey.avbpubkey",
9233 private_key: "testkey.pem",
9234 }
9235
9236 cc_binary {
9237 name: "mybin",
9238 srcs: ["mylib.cpp"],
9239 relative_install_path: "foo/bar",
9240 static_executable: true,
9241 system_shared_libs: [],
9242 stl: "none",
9243 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009244 min_sdk_version: "29",
9245 }
9246 `)
9247
9248 testApexError(t, `executable mybin.rust is static`, `
9249 apex {
9250 name: "myapex",
9251 key: "myapex.key",
9252 binaries: ["mybin.rust"],
9253 min_sdk_version: "29",
9254 }
9255
9256 apex_key {
9257 name: "myapex.key",
9258 public_key: "testkey.avbpubkey",
9259 private_key: "testkey.pem",
9260 }
9261
9262 rust_binary {
9263 name: "mybin.rust",
9264 srcs: ["foo.rs"],
9265 static_executable: true,
9266 apex_available: ["myapex"],
9267 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009268 }
9269 `)
9270}
9271
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009272func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9273 ctx := testApex(t, `
9274 apex {
9275 name: "myapex",
9276 key: "myapex.key",
9277 updatable: false,
9278 java_libs: ["foo"],
9279 }
9280
9281 apex_key {
9282 name: "myapex.key",
9283 public_key: "testkey.avbpubkey",
9284 private_key: "testkey.pem",
9285 }
9286
9287 java_library {
9288 name: "foo",
9289 srcs: ["foo.java"],
9290 apex_available: ["myapex"],
9291 installable: true,
9292 }
9293 `,
9294 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9295 )
9296
9297 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9298 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9299 var builder strings.Builder
9300 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9301 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009302 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 +00009303}
9304
9305func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9306 ctx := testApex(t, `
9307 prebuilt_apex {
9308 name: "myapex",
9309 arch: {
9310 arm64: {
9311 src: "myapex-arm64.apex",
9312 },
9313 arm: {
9314 src: "myapex-arm.apex",
9315 },
9316 },
9317 exported_java_libs: ["foo"],
9318 }
9319
9320 java_import {
9321 name: "foo",
9322 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009323 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009324 }
9325 `,
9326 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9327 )
9328
9329 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9330 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9331 mainModuleEntries := entriesList[0]
9332 android.AssertArrayString(t,
9333 "LOCAL_REQUIRED_MODULES",
9334 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9335 []string{
9336 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9337 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9338 })
9339}
9340
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009341func TestAndroidMk_RequiredModules(t *testing.T) {
9342 ctx := testApex(t, `
9343 apex {
9344 name: "myapex",
9345 key: "myapex.key",
9346 updatable: false,
9347 java_libs: ["foo"],
9348 required: ["otherapex"],
9349 }
9350
9351 apex {
9352 name: "otherapex",
9353 key: "myapex.key",
9354 updatable: false,
9355 java_libs: ["foo"],
9356 required: ["otherapex"],
9357 }
9358
9359 apex_key {
9360 name: "myapex.key",
9361 public_key: "testkey.avbpubkey",
9362 private_key: "testkey.pem",
9363 }
9364
9365 java_library {
9366 name: "foo",
9367 srcs: ["foo.java"],
9368 apex_available: ["myapex", "otherapex"],
9369 installable: true,
9370 }
9371 `)
9372
9373 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9374 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9375 var builder strings.Builder
9376 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9377 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009378 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009379}
9380
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009381func TestAndroidMk_RequiredDeps(t *testing.T) {
9382 ctx := testApex(t, `
9383 apex {
9384 name: "myapex",
9385 key: "myapex.key",
9386 updatable: false,
9387 }
9388
9389 apex_key {
9390 name: "myapex.key",
9391 public_key: "testkey.avbpubkey",
9392 private_key: "testkey.pem",
9393 }
9394 `)
9395
9396 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009397 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009398 data := android.AndroidMkDataForTest(t, ctx, bundle)
9399 var builder strings.Builder
9400 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9401 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009402 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009403
9404 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009405 flattenedBundle.makeModulesToInstall = append(flattenedBundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009406 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9407 var flattenedBuilder strings.Builder
9408 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9409 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009410 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009411}
9412
Jooyung Hana6d36672022-02-24 13:58:07 +09009413func TestApexOutputFileProducer(t *testing.T) {
9414 for _, tc := range []struct {
9415 name string
9416 ref string
9417 expected_data []string
9418 }{
9419 {
9420 name: "test_using_output",
9421 ref: ":myapex",
9422 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9423 },
9424 {
9425 name: "test_using_apex",
9426 ref: ":myapex{.apex}",
9427 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9428 },
9429 } {
9430 t.Run(tc.name, func(t *testing.T) {
9431 ctx := testApex(t, `
9432 apex {
9433 name: "myapex",
9434 key: "myapex.key",
9435 compressible: true,
9436 updatable: false,
9437 }
9438
9439 apex_key {
9440 name: "myapex.key",
9441 public_key: "testkey.avbpubkey",
9442 private_key: "testkey.pem",
9443 }
9444
9445 java_test {
9446 name: "`+tc.name+`",
9447 srcs: ["a.java"],
9448 data: ["`+tc.ref+`"],
9449 }
9450 `,
9451 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9452 variables.CompressedApex = proptools.BoolPtr(true)
9453 }))
9454 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9455 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9456 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9457 })
9458 }
9459}
9460
satayev758968a2021-12-06 11:42:40 +00009461func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9462 preparer := android.GroupFixturePreparers(
9463 PrepareForTestWithApexBuildComponents,
9464 prepareForTestWithMyapex,
9465 java.PrepareForTestWithJavaSdkLibraryFiles,
9466 java.PrepareForTestWithJavaDefaultModules,
9467 android.PrepareForTestWithAndroidBuildComponents,
9468 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9469 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9470 )
9471
9472 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9473 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9474 preparer.RunTestWithBp(t, `
9475 apex {
9476 name: "myapex",
9477 key: "myapex.key",
9478 bootclasspath_fragments: ["mybootclasspathfragment"],
9479 min_sdk_version: "30",
9480 updatable: false,
9481 }
9482
9483 apex_key {
9484 name: "myapex.key",
9485 public_key: "testkey.avbpubkey",
9486 private_key: "testkey.pem",
9487 }
9488
9489 bootclasspath_fragment {
9490 name: "mybootclasspathfragment",
9491 contents: ["mybootclasspathlib"],
9492 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009493 hidden_api: {
9494 split_packages: ["*"],
9495 },
satayev758968a2021-12-06 11:42:40 +00009496 }
9497
9498 java_sdk_library {
9499 name: "mybootclasspathlib",
9500 srcs: ["mybootclasspathlib.java"],
9501 apex_available: ["myapex"],
9502 compile_dex: true,
9503 unsafe_ignore_missing_latest_api: true,
9504 min_sdk_version: "31",
9505 static_libs: ["util"],
9506 }
9507
9508 java_library {
9509 name: "util",
9510 srcs: ["a.java"],
9511 apex_available: ["myapex"],
9512 min_sdk_version: "31",
9513 static_libs: ["another_util"],
9514 }
9515
9516 java_library {
9517 name: "another_util",
9518 srcs: ["a.java"],
9519 min_sdk_version: "31",
9520 apex_available: ["myapex"],
9521 }
9522 `)
9523 })
9524
9525 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9526 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9527 preparer.RunTestWithBp(t, `
9528 apex {
9529 name: "myapex",
9530 key: "myapex.key",
9531 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9532 min_sdk_version: "30",
9533 updatable: false,
9534 }
9535
9536 apex_key {
9537 name: "myapex.key",
9538 public_key: "testkey.avbpubkey",
9539 private_key: "testkey.pem",
9540 }
9541
9542 systemserverclasspath_fragment {
9543 name: "mysystemserverclasspathfragment",
9544 contents: ["mysystemserverclasspathlib"],
9545 apex_available: ["myapex"],
9546 }
9547
9548 java_sdk_library {
9549 name: "mysystemserverclasspathlib",
9550 srcs: ["mysystemserverclasspathlib.java"],
9551 apex_available: ["myapex"],
9552 compile_dex: true,
9553 min_sdk_version: "32",
9554 unsafe_ignore_missing_latest_api: true,
9555 static_libs: ["util"],
9556 }
9557
9558 java_library {
9559 name: "util",
9560 srcs: ["a.java"],
9561 apex_available: ["myapex"],
9562 min_sdk_version: "31",
9563 static_libs: ["another_util"],
9564 }
9565
9566 java_library {
9567 name: "another_util",
9568 srcs: ["a.java"],
9569 min_sdk_version: "31",
9570 apex_available: ["myapex"],
9571 }
9572 `)
9573 })
9574
9575 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9576 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9577 RunTestWithBp(t, `
9578 apex {
9579 name: "myapex",
9580 key: "myapex.key",
9581 bootclasspath_fragments: ["mybootclasspathfragment"],
9582 min_sdk_version: "30",
9583 updatable: false,
9584 }
9585
9586 apex_key {
9587 name: "myapex.key",
9588 public_key: "testkey.avbpubkey",
9589 private_key: "testkey.pem",
9590 }
9591
9592 bootclasspath_fragment {
9593 name: "mybootclasspathfragment",
9594 contents: ["mybootclasspathlib"],
9595 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009596 hidden_api: {
9597 split_packages: ["*"],
9598 },
satayev758968a2021-12-06 11:42:40 +00009599 }
9600
9601 java_sdk_library {
9602 name: "mybootclasspathlib",
9603 srcs: ["mybootclasspathlib.java"],
9604 apex_available: ["myapex"],
9605 compile_dex: true,
9606 unsafe_ignore_missing_latest_api: true,
9607 }
9608 `)
9609 })
9610
9611 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9612 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9613 RunTestWithBp(t, `
9614 apex {
9615 name: "myapex",
9616 key: "myapex.key",
9617 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9618 min_sdk_version: "30",
9619 updatable: false,
9620 }
9621
9622 apex_key {
9623 name: "myapex.key",
9624 public_key: "testkey.avbpubkey",
9625 private_key: "testkey.pem",
9626 }
9627
9628 systemserverclasspath_fragment {
9629 name: "mysystemserverclasspathfragment",
9630 contents: ["mysystemserverclasspathlib"],
9631 apex_available: ["myapex"],
9632 }
9633
9634 java_sdk_library {
9635 name: "mysystemserverclasspathlib",
9636 srcs: ["mysystemserverclasspathlib.java"],
9637 apex_available: ["myapex"],
9638 compile_dex: true,
9639 unsafe_ignore_missing_latest_api: true,
9640 }
9641 `)
9642 })
9643}
9644
Jiakai Zhang6decef92022-01-12 17:56:19 +00009645// Verifies that the APEX depends on all the Make modules in the list.
9646func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9647 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9648 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009649 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009650 }
9651}
9652
9653// Verifies that the APEX does not depend on any of the Make modules in the list.
9654func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9655 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9656 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009657 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009658 }
9659}
9660
Cole Faust1021ccd2023-02-26 21:15:25 -08009661// TODO(b/193460475): Re-enable this test
9662//func TestApexStrictUpdtabilityLint(t *testing.T) {
9663// bpTemplate := `
9664// apex {
9665// name: "myapex",
9666// key: "myapex.key",
9667// java_libs: ["myjavalib"],
9668// updatable: %v,
9669// min_sdk_version: "29",
9670// }
9671// apex_key {
9672// name: "myapex.key",
9673// }
9674// java_library {
9675// name: "myjavalib",
9676// srcs: ["MyClass.java"],
9677// apex_available: [ "myapex" ],
9678// lint: {
9679// strict_updatability_linting: %v,
9680// },
9681// sdk_version: "current",
9682// min_sdk_version: "29",
9683// }
9684// `
9685// fs := android.MockFS{
9686// "lint-baseline.xml": nil,
9687// }
9688//
9689// testCases := []struct {
9690// testCaseName string
9691// apexUpdatable bool
9692// javaStrictUpdtabilityLint bool
9693// lintFileExists bool
9694// disallowedFlagExpected bool
9695// }{
9696// {
9697// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9698// apexUpdatable: true,
9699// javaStrictUpdtabilityLint: true,
9700// lintFileExists: false,
9701// disallowedFlagExpected: false,
9702// },
9703// {
9704// testCaseName: "non-updatable apex respects strict_updatability of javalib",
9705// apexUpdatable: false,
9706// javaStrictUpdtabilityLint: false,
9707// lintFileExists: true,
9708// disallowedFlagExpected: false,
9709// },
9710// {
9711// testCaseName: "non-updatable apex respects strict updatability of javalib",
9712// apexUpdatable: false,
9713// javaStrictUpdtabilityLint: true,
9714// lintFileExists: true,
9715// disallowedFlagExpected: true,
9716// },
9717// {
9718// testCaseName: "updatable apex sets strict updatability of javalib to true",
9719// apexUpdatable: true,
9720// javaStrictUpdtabilityLint: false, // will be set to true by mutator
9721// lintFileExists: true,
9722// disallowedFlagExpected: true,
9723// },
9724// }
9725//
9726// for _, testCase := range testCases {
9727// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9728// fixtures := []android.FixturePreparer{}
9729// if testCase.lintFileExists {
9730// fixtures = append(fixtures, fs.AddToFixture())
9731// }
9732//
9733// result := testApex(t, bp, fixtures...)
9734// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9735// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9736// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9737//
9738// if disallowedFlagActual != testCase.disallowedFlagExpected {
9739// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9740// }
9741// }
9742//}
9743//
9744//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9745// bp := `
9746// apex {
9747// name: "myapex",
9748// key: "myapex.key",
9749// java_libs: ["myjavalib"],
9750// updatable: true,
9751// min_sdk_version: "29",
9752// }
9753// apex_key {
9754// name: "myapex.key",
9755// }
9756// java_library {
9757// name: "myjavalib",
9758// srcs: ["MyClass.java"],
9759// apex_available: [ "myapex" ],
9760// sdk_version: "current",
9761// min_sdk_version: "29",
9762// }
9763// `
9764//
9765// testCases := []struct {
9766// testCaseName string
9767// moduleDirectory string
9768// disallowedFlagExpected bool
9769// }{
9770// {
9771// testCaseName: "lintable module defined outside libcore",
9772// moduleDirectory: "",
9773// disallowedFlagExpected: true,
9774// },
9775// {
9776// testCaseName: "lintable module defined in libcore root directory",
9777// moduleDirectory: "libcore/",
9778// disallowedFlagExpected: false,
9779// },
9780// {
9781// testCaseName: "lintable module defined in libcore child directory",
9782// moduleDirectory: "libcore/childdir/",
9783// disallowedFlagExpected: true,
9784// },
9785// }
9786//
9787// for _, testCase := range testCases {
9788// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9789// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9790// result := testApex(t, "", lintFileCreator, bpFileCreator)
9791// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9792// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9793// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9794// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9795//
9796// if disallowedFlagActual != testCase.disallowedFlagExpected {
9797// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9798// }
9799// }
9800//}
9801//
9802//// checks transtive deps of an apex coming from bootclasspath_fragment
9803//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9804// bp := `
9805// apex {
9806// name: "myapex",
9807// key: "myapex.key",
9808// bootclasspath_fragments: ["mybootclasspathfragment"],
9809// updatable: true,
9810// min_sdk_version: "29",
9811// }
9812// apex_key {
9813// name: "myapex.key",
9814// }
9815// bootclasspath_fragment {
9816// name: "mybootclasspathfragment",
9817// contents: ["myjavalib"],
9818// apex_available: ["myapex"],
9819// hidden_api: {
9820// split_packages: ["*"],
9821// },
9822// }
9823// java_library {
9824// name: "myjavalib",
9825// srcs: ["MyClass.java"],
9826// apex_available: [ "myapex" ],
9827// sdk_version: "current",
9828// min_sdk_version: "29",
9829// compile_dex: true,
9830// }
9831// `
9832// fs := android.MockFS{
9833// "lint-baseline.xml": nil,
9834// }
9835//
9836// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9837// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9838// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9839// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9840// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9841// }
9842//}
Spandan Das66773252022-01-15 00:23:18 +00009843
Spandan Das42e89502022-05-06 22:12:55 +00009844// updatable apexes should propagate updatable=true to its apps
9845func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9846 bp := `
9847 apex {
9848 name: "myapex",
9849 key: "myapex.key",
9850 updatable: %v,
9851 apps: [
9852 "myapp",
9853 ],
9854 min_sdk_version: "30",
9855 }
9856 apex_key {
9857 name: "myapex.key",
9858 }
9859 android_app {
9860 name: "myapp",
9861 updatable: %v,
9862 apex_available: [
9863 "myapex",
9864 ],
9865 sdk_version: "current",
9866 min_sdk_version: "30",
9867 }
9868 `
9869 testCases := []struct {
9870 name string
9871 apex_is_updatable_bp bool
9872 app_is_updatable_bp bool
9873 app_is_updatable_expected bool
9874 }{
9875 {
9876 name: "Non-updatable apex respects updatable property of non-updatable app",
9877 apex_is_updatable_bp: false,
9878 app_is_updatable_bp: false,
9879 app_is_updatable_expected: false,
9880 },
9881 {
9882 name: "Non-updatable apex respects updatable property of updatable app",
9883 apex_is_updatable_bp: false,
9884 app_is_updatable_bp: true,
9885 app_is_updatable_expected: true,
9886 },
9887 {
9888 name: "Updatable apex respects updatable property of updatable app",
9889 apex_is_updatable_bp: true,
9890 app_is_updatable_bp: true,
9891 app_is_updatable_expected: true,
9892 },
9893 {
9894 name: "Updatable apex sets updatable=true on non-updatable app",
9895 apex_is_updatable_bp: true,
9896 app_is_updatable_bp: false,
9897 app_is_updatable_expected: true,
9898 },
9899 }
9900 for _, testCase := range testCases {
9901 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9902 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9903 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9904 }
9905}
9906
Kiyoung Kim487689e2022-07-26 09:48:22 +09009907func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9908 bp := `
9909 apex {
9910 name: "myapex",
9911 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009912 native_shared_libs: ["libbaz"],
9913 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +09009914 min_sdk_version: "29",
9915 }
9916 apex_key {
9917 name: "myapex.key",
9918 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009919 cc_binary {
9920 name: "binfoo",
9921 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +09009922 apex_available: ["myapex"],
9923 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009924 recovery_available: false,
9925 }
9926 cc_library {
9927 name: "libbar",
9928 srcs: ["libbar.cc"],
9929 stubs: {
9930 symbol_file: "libbar.map.txt",
9931 versions: [
9932 "29",
9933 ],
9934 },
9935 }
9936 cc_library {
9937 name: "libbaz",
9938 srcs: ["libbaz.cc"],
9939 apex_available: ["myapex"],
9940 min_sdk_version: "29",
9941 stubs: {
9942 symbol_file: "libbaz.map.txt",
9943 versions: [
9944 "29",
9945 ],
9946 },
Kiyoung Kim487689e2022-07-26 09:48:22 +09009947 }
9948 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009949 name: "libbar",
9950 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +09009951 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009952 variants: ["apex.29"],
9953 }
9954 cc_api_variant {
9955 name: "libbar",
9956 variant: "apex",
9957 version: "29",
9958 src: "libbar_apex_29.so",
9959 }
9960 cc_api_library {
9961 name: "libbaz",
9962 src: "libbaz_stub.so",
9963 min_sdk_version: "29",
9964 variants: ["apex.29"],
9965 }
9966 cc_api_variant {
9967 name: "libbaz",
9968 variant: "apex",
9969 version: "29",
9970 src: "libbaz_apex_29.so",
9971 }
9972 cc_api_library {
9973 name: "libqux",
9974 src: "libqux_stub.so",
9975 min_sdk_version: "29",
9976 variants: ["apex.29"],
9977 }
9978 cc_api_variant {
9979 name: "libqux",
9980 variant: "apex",
9981 version: "29",
9982 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +09009983 }
9984 api_imports {
9985 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009986 apex_shared_libs: [
9987 "libbar",
9988 "libbaz",
9989 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +09009990 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +09009991 }
9992 `
9993 result := testApex(t, bp)
9994
9995 hasDep := func(m android.Module, wantDep android.Module) bool {
9996 t.Helper()
9997 var found bool
9998 result.VisitDirectDeps(m, func(dep blueprint.Module) {
9999 if dep == wantDep {
10000 found = true
10001 }
10002 })
10003 return found
10004 }
10005
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010006 // Library defines stubs and cc_api_library should be used with cc_api_library
10007 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10008 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10009 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010010
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010011 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10012 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010013
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010014 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10015 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10016 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10017 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10018
10019 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10020 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10021 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10022 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10023 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10024
10025 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10026 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10027 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10028
10029 // cc_api_library defined without original library should be linked with cc_api_library
10030 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10031 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10032 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10033}
10034
10035func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10036 bp := `
10037 apex {
10038 name: "myapex",
10039 key: "myapex.key",
10040 native_shared_libs: ["libbar"],
10041 min_sdk_version: "29",
10042 }
10043 apex_key {
10044 name: "myapex.key",
10045 }
10046 cc_binary {
10047 name: "binfoo",
10048 shared_libs: ["libbar"],
10049 recovery_available: false,
10050 }
10051 cc_library {
10052 name: "libbar",
10053 srcs: ["libbar.cc"],
10054 apex_available: ["myapex"],
10055 min_sdk_version: "29",
10056 stubs: {
10057 symbol_file: "libbar.map.txt",
10058 versions: [
10059 "29",
10060 ],
10061 },
10062 }
10063 cc_api_library {
10064 name: "libbar",
10065 src: "libbar_stub.so",
10066 variants: ["apex.29"],
10067 }
10068 cc_api_variant {
10069 name: "libbar",
10070 variant: "apex",
10071 version: "29",
10072 src: "libbar_apex_29.so",
10073 }
10074 api_imports {
10075 name: "api_imports",
10076 apex_shared_libs: [
10077 "libbar",
10078 ],
10079 }
10080 `
10081
10082 result := testApex(t, bp)
10083
10084 hasDep := func(m android.Module, wantDep android.Module) bool {
10085 t.Helper()
10086 var found bool
10087 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10088 if dep == wantDep {
10089 found = true
10090 }
10091 })
10092 return found
10093 }
10094
10095 // Library defines stubs and cc_api_library should be used with cc_api_library
10096 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10097 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10098 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10099
10100 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10101 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10102
10103 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10104 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10105 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10106 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010107}
Dennis Shend4f5d932023-01-31 20:27:21 +000010108
10109func TestTrimmedApex(t *testing.T) {
10110 bp := `
10111 apex {
10112 name: "myapex",
10113 key: "myapex.key",
10114 native_shared_libs: ["libfoo","libbaz"],
10115 min_sdk_version: "29",
10116 trim_against: "mydcla",
10117 }
10118 apex {
10119 name: "mydcla",
10120 key: "myapex.key",
10121 native_shared_libs: ["libfoo","libbar"],
10122 min_sdk_version: "29",
10123 file_contexts: ":myapex-file_contexts",
10124 dynamic_common_lib_apex: true,
10125 }
10126 apex_key {
10127 name: "myapex.key",
10128 }
10129 cc_library {
10130 name: "libfoo",
10131 shared_libs: ["libc"],
10132 apex_available: ["myapex","mydcla"],
10133 min_sdk_version: "29",
10134 }
10135 cc_library {
10136 name: "libbar",
10137 shared_libs: ["libc"],
10138 apex_available: ["myapex","mydcla"],
10139 min_sdk_version: "29",
10140 }
10141 cc_library {
10142 name: "libbaz",
10143 shared_libs: ["libc"],
10144 apex_available: ["myapex","mydcla"],
10145 min_sdk_version: "29",
10146 }
10147 cc_api_library {
10148 name: "libc",
10149 src: "libc.so",
10150 min_sdk_version: "29",
10151 recovery_available: true,
10152 }
10153 api_imports {
10154 name: "api_imports",
10155 shared_libs: [
10156 "libc",
10157 ],
10158 header_libs: [],
10159 }
10160 `
10161 ctx := testApex(t, bp)
10162 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10163 apexRule := module.MaybeRule("apexRule")
10164 if apexRule.Rule == nil {
10165 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10166 }
10167
10168 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
10169 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
10170 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10171 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10172 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10173 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10174}
Jingwen Chendea7a642023-03-28 11:30:50 +000010175
10176func TestCannedFsConfig(t *testing.T) {
10177 ctx := testApex(t, `
10178 apex {
10179 name: "myapex",
10180 key: "myapex.key",
10181 updatable: false,
10182 }
10183
10184 apex_key {
10185 name: "myapex.key",
10186 public_key: "testkey.avbpubkey",
10187 private_key: "testkey.pem",
10188 }`)
10189 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10190 generateFsRule := mod.Rule("generateFsConfig")
10191 cmd := generateFsRule.RuleParams.Command
10192
10193 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10194}
10195
10196func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10197 ctx := testApex(t, `
10198 apex {
10199 name: "myapex",
10200 key: "myapex.key",
10201 canned_fs_config: "my_config",
10202 updatable: false,
10203 }
10204
10205 apex_key {
10206 name: "myapex.key",
10207 public_key: "testkey.avbpubkey",
10208 private_key: "testkey.pem",
10209 }`)
10210 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10211 generateFsRule := mod.Rule("generateFsConfig")
10212 cmd := generateFsRule.RuleParams.Command
10213
10214 // Ensure that canned_fs_config has "cat my_config" at the end
10215 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10216}
Spandan Das20fce2d2023-04-12 17:21:39 +000010217
10218func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10219 testCases := []struct {
10220 desc string
10221 hasStubs bool
10222 apexAvailable string
10223 expectedError string
10224 }{
10225 {
10226 desc: "non-stub library can have multiple apex_available",
10227 hasStubs: false,
10228 apexAvailable: `["myapex", "otherapex"]`,
10229 },
10230 {
10231 desc: "stub library should not be available to anyapex",
10232 hasStubs: true,
10233 apexAvailable: `["//apex_available:anyapex"]`,
10234 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10235 },
10236 {
10237 desc: "stub library should not be available to multiple apexes",
10238 hasStubs: true,
10239 apexAvailable: `["myapex", "otherapex"]`,
10240 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10241 },
10242 {
10243 desc: "stub library can be available to a core apex and a test apex",
10244 hasStubs: true,
10245 apexAvailable: `["myapex", "test_myapex"]`,
10246 },
10247 }
10248 bpTemplate := `
10249 cc_library {
10250 name: "libfoo",
10251 %v
10252 apex_available: %v,
10253 }
10254 apex {
10255 name: "myapex",
10256 key: "apex.key",
10257 updatable: false,
10258 native_shared_libs: ["libfoo"],
10259 }
10260 apex {
10261 name: "otherapex",
10262 key: "apex.key",
10263 updatable: false,
10264 }
10265 apex_test {
10266 name: "test_myapex",
10267 key: "apex.key",
10268 updatable: false,
10269 native_shared_libs: ["libfoo"],
10270 }
10271 apex_key {
10272 name: "apex.key",
10273 }
10274 `
10275 for _, tc := range testCases {
10276 stubs := ""
10277 if tc.hasStubs {
10278 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10279 }
10280 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10281 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10282 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10283 })
10284 if tc.expectedError == "" {
10285 testApex(t, bp, mockFsFixturePreparer)
10286 } else {
10287 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10288 }
10289 }
10290}