blob: 8b69f2c4decc405d3b25846de48f635d5f3e9557 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Kiyoung Kim487689e2022-07-26 09:48:22 +090028 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090029 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090036 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090037 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070038 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090039)
40
Jooyung Hand3639552019-08-09 12:57:43 +090041// names returns name list from white space separated string
42func names(s string) (ns []string) {
43 for _, n := range strings.Split(s, " ") {
44 if len(n) > 0 {
45 ns = append(ns, n)
46 }
47 }
48 return
49}
50
Paul Duffin40b62572021-03-20 11:39:01 +000051func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090052 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010053 android.GroupFixturePreparers(
54 prepareForApexTest,
55 android.GroupFixturePreparers(preparers...),
56 ).
Paul Duffine05480a2021-03-08 15:07:14 +000057 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000058 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090059}
60
Paul Duffin40b62572021-03-20 11:39:01 +000061func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090062 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010063
64 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000065 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010066 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000067 }
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 result := android.GroupFixturePreparers(
70 prepareForApexTest,
71 android.GroupFixturePreparers(preparers...),
72 optionalBpPreparer,
73 ).RunTest(t)
74
Paul Duffine05480a2021-03-08 15:07:14 +000075 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090076}
77
Paul Duffin810f33d2021-03-09 14:12:32 +000078func withFiles(files android.MockFS) android.FixturePreparer {
79 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090080}
81
Paul Duffin810f33d2021-03-09 14:12:32 +000082func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
83 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090084 for k, v := range targets {
85 config.Targets[k] = v
86 }
Paul Duffin810f33d2021-03-09 14:12:32 +000087 })
Jooyung Han344d5432019-08-23 11:17:39 +090088}
89
Jooyung Han35155c42020-02-06 17:33:20 +090090// withNativeBridgeTargets sets configuration with targets including:
91// - X86_64 (primary)
92// - X86 (secondary)
93// - Arm64 on X86_64 (native bridge)
94// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000095var withNativeBridgeEnabled = android.FixtureModifyConfig(
96 func(config android.Config) {
97 config.Targets[android.Android] = []android.Target{
98 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
99 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
100 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
101 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
102 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
103 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
104 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
105 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
106 }
107 },
108)
109
110func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
111 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
112 variables.ManifestPackageNameOverrides = specs
113 })
Jooyung Han35155c42020-02-06 17:33:20 +0900114}
115
Albert Martineefabcf2022-03-21 20:11:16 +0000116func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
117 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
118 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
119 })
120}
121
Paul Duffin810f33d2021-03-09 14:12:32 +0000122var withBinder32bit = android.FixtureModifyProductVariables(
123 func(variables android.FixtureProductVariables) {
124 variables.Binder32bit = proptools.BoolPtr(true)
125 },
126)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900127
Paul Duffin810f33d2021-03-09 14:12:32 +0000128var withUnbundledBuild = android.FixtureModifyProductVariables(
129 func(variables android.FixtureProductVariables) {
130 variables.Unbundled_build = proptools.BoolPtr(true)
131 },
132)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900133
Paul Duffin284165a2021-03-29 01:50:31 +0100134// Legacy preparer used for running tests within the apex package.
135//
136// This includes everything that was needed to run any test in the apex package prior to the
137// introduction of the test fixtures. Tests that are being converted to use fixtures directly
138// rather than through the testApex...() methods should avoid using this and instead use the
139// various preparers directly, using android.GroupFixturePreparers(...) to group them when
140// necessary.
141//
142// deprecated
143var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000144 // General preparers in alphabetical order as test infrastructure will enforce correct
145 // registration order.
146 android.PrepareForTestWithAndroidBuildComponents,
147 bpf.PrepareForTestWithBpf,
148 cc.PrepareForTestWithCcBuildComponents,
149 java.PrepareForTestWithJavaDefaultModules,
150 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
151 rust.PrepareForTestWithRustDefaultModules,
152 sh.PrepareForTestWithShBuildComponents,
153
154 PrepareForTestWithApexBuildComponents,
155
156 // Additional apex test specific preparers.
157 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
158 filegroup {
159 name: "myapex-file_contexts",
160 srcs: [
161 "apex/myapex-file_contexts",
162 ],
163 }
164 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000165 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000166 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000167 "a.java": nil,
168 "PrebuiltAppFoo.apk": nil,
169 "PrebuiltAppFooPriv.apk": nil,
170 "apex_manifest.json": nil,
171 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000172 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
173 "system/sepolicy/apex/myapex2-file_contexts": nil,
174 "system/sepolicy/apex/otherapex-file_contexts": nil,
175 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
176 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700177 "mylib.cpp": nil,
178 "mytest.cpp": nil,
179 "mytest1.cpp": nil,
180 "mytest2.cpp": nil,
181 "mytest3.cpp": nil,
182 "myprebuilt": nil,
183 "my_include": nil,
184 "foo/bar/MyClass.java": nil,
185 "prebuilt.jar": nil,
186 "prebuilt.so": nil,
187 "vendor/foo/devkeys/test.x509.pem": nil,
188 "vendor/foo/devkeys/test.pk8": nil,
189 "testkey.x509.pem": nil,
190 "testkey.pk8": nil,
191 "testkey.override.x509.pem": nil,
192 "testkey.override.pk8": nil,
193 "vendor/foo/devkeys/testkey.avbpubkey": nil,
194 "vendor/foo/devkeys/testkey.pem": nil,
195 "NOTICE": nil,
196 "custom_notice": nil,
197 "custom_notice_for_static_lib": nil,
198 "testkey2.avbpubkey": nil,
199 "testkey2.pem": nil,
200 "myapex-arm64.apex": nil,
201 "myapex-arm.apex": nil,
202 "myapex.apks": nil,
203 "frameworks/base/api/current.txt": nil,
204 "framework/aidl/a.aidl": nil,
205 "dummy.txt": nil,
206 "baz": nil,
207 "bar/baz": nil,
208 "testdata/baz": nil,
209 "AppSet.apks": nil,
210 "foo.rs": nil,
211 "libfoo.jar": nil,
212 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000213 },
214 ),
215
216 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
217 variables.DeviceVndkVersion = proptools.StringPtr("current")
218 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
219 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
220 variables.Platform_sdk_codename = proptools.StringPtr("Q")
221 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000222 // "Tiramisu" needs to be in the next line for compatibility with soong code,
223 // not because of these tests specifically (it's not used by the tests)
224 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900225 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000226 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000227 }),
228)
229
Paul Duffin52bfaa42021-03-23 23:40:12 +0000230var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
231 "system/sepolicy/apex/myapex-file_contexts": nil,
232})
233
Jooyung Han643adc42020-02-27 13:50:06 +0900234// ensure that 'result' equals 'expected'
235func ensureEquals(t *testing.T, result string, expected string) {
236 t.Helper()
237 if result != expected {
238 t.Errorf("%q != %q", expected, result)
239 }
240}
241
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242// ensure that 'result' contains 'expected'
243func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900244 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900245 if !strings.Contains(result, expected) {
246 t.Errorf("%q is not found in %q", expected, result)
247 }
248}
249
Liz Kammer5bd365f2020-05-27 15:15:11 -0700250// ensure that 'result' contains 'expected' exactly one time
251func ensureContainsOnce(t *testing.T, result string, expected string) {
252 t.Helper()
253 count := strings.Count(result, expected)
254 if count != 1 {
255 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
256 }
257}
258
Jiyong Park25fc6a92018-11-18 18:02:45 +0900259// ensures that 'result' does not contain 'notExpected'
260func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900261 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900262 if strings.Contains(result, notExpected) {
263 t.Errorf("%q is found in %q", notExpected, result)
264 }
265}
266
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700267func ensureMatches(t *testing.T, result string, expectedRex string) {
268 ok, err := regexp.MatchString(expectedRex, result)
269 if err != nil {
270 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
271 return
272 }
273 if !ok {
274 t.Errorf("%s does not match regular expession %s", result, expectedRex)
275 }
276}
277
Jiyong Park25fc6a92018-11-18 18:02:45 +0900278func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900279 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900280 if !android.InList(expected, result) {
281 t.Errorf("%q is not found in %v", expected, result)
282 }
283}
284
285func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900286 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900287 if android.InList(notExpected, result) {
288 t.Errorf("%q is found in %v", notExpected, result)
289 }
290}
291
Jooyung Hane1633032019-08-01 17:41:43 +0900292func ensureListEmpty(t *testing.T, result []string) {
293 t.Helper()
294 if len(result) > 0 {
295 t.Errorf("%q is expected to be empty", result)
296 }
297}
298
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000299func ensureListNotEmpty(t *testing.T, result []string) {
300 t.Helper()
301 if len(result) == 0 {
302 t.Errorf("%q is expected to be not empty", result)
303 }
304}
305
Jiyong Park25fc6a92018-11-18 18:02:45 +0900306// Minimal test
307func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800308 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900309 apex_defaults {
310 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900311 manifest: ":myapex.manifest",
312 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900313 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900314 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900315 native_shared_libs: [
316 "mylib",
317 "libfoo.ffi",
318 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900319 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800320 multilib: {
321 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900322 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800323 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900324 },
Jiyong Park77acec62020-06-01 21:39:15 +0900325 java_libs: [
326 "myjar",
327 "myjar_dex",
328 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000329 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900330 }
331
Jiyong Park30ca9372019-02-07 16:27:23 +0900332 apex {
333 name: "myapex",
334 defaults: ["myapex-defaults"],
335 }
336
Jiyong Park25fc6a92018-11-18 18:02:45 +0900337 apex_key {
338 name: "myapex.key",
339 public_key: "testkey.avbpubkey",
340 private_key: "testkey.pem",
341 }
342
Jiyong Park809bb722019-02-13 21:33:49 +0900343 filegroup {
344 name: "myapex.manifest",
345 srcs: ["apex_manifest.json"],
346 }
347
348 filegroup {
349 name: "myapex.androidmanifest",
350 srcs: ["AndroidManifest.xml"],
351 }
352
Jiyong Park25fc6a92018-11-18 18:02:45 +0900353 cc_library {
354 name: "mylib",
355 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900356 shared_libs: [
357 "mylib2",
358 "libbar.ffi",
359 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900360 system_shared_libs: [],
361 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000362 // TODO: remove //apex_available:platform
363 apex_available: [
364 "//apex_available:platform",
365 "myapex",
366 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900367 }
368
Alex Light3d673592019-01-18 14:37:31 -0800369 cc_binary {
370 name: "foo",
371 srcs: ["mylib.cpp"],
372 compile_multilib: "both",
373 multilib: {
374 lib32: {
375 suffix: "32",
376 },
377 lib64: {
378 suffix: "64",
379 },
380 },
381 symlinks: ["foo_link_"],
382 symlink_preferred_arch: true,
383 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800384 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700385 apex_available: [ "myapex", "com.android.gki.*" ],
386 }
387
Jiyong Park99644e92020-11-17 22:21:02 +0900388 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000389 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900390 srcs: ["foo.rs"],
391 rlibs: ["libfoo.rlib.rust"],
392 dylibs: ["libfoo.dylib.rust"],
393 apex_available: ["myapex"],
394 }
395
396 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000397 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900398 srcs: ["foo.rs"],
399 crate_name: "foo",
400 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900401 shared_libs: ["libfoo.shared_from_rust"],
402 }
403
404 cc_library_shared {
405 name: "libfoo.shared_from_rust",
406 srcs: ["mylib.cpp"],
407 system_shared_libs: [],
408 stl: "none",
409 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900410 }
411
412 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000413 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900414 srcs: ["foo.rs"],
415 crate_name: "foo",
416 apex_available: ["myapex"],
417 }
418
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900419 rust_ffi_shared {
420 name: "libfoo.ffi",
421 srcs: ["foo.rs"],
422 crate_name: "foo",
423 apex_available: ["myapex"],
424 }
425
426 rust_ffi_shared {
427 name: "libbar.ffi",
428 srcs: ["foo.rs"],
429 crate_name: "bar",
430 apex_available: ["myapex"],
431 }
432
Yifan Hongd22a84a2020-07-28 17:37:46 -0700433 apex {
434 name: "com.android.gki.fake",
435 binaries: ["foo"],
436 key: "myapex.key",
437 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000438 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800439 }
440
Paul Duffindddd5462020-04-07 15:25:44 +0100441 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900442 name: "mylib2",
443 srcs: ["mylib.cpp"],
444 system_shared_libs: [],
445 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900446 static_libs: ["libstatic"],
447 // TODO: remove //apex_available:platform
448 apex_available: [
449 "//apex_available:platform",
450 "myapex",
451 ],
452 }
453
Paul Duffindddd5462020-04-07 15:25:44 +0100454 cc_prebuilt_library_shared {
455 name: "mylib2",
456 srcs: ["prebuilt.so"],
457 // TODO: remove //apex_available:platform
458 apex_available: [
459 "//apex_available:platform",
460 "myapex",
461 ],
462 }
463
Jiyong Park9918e1a2020-03-17 19:16:40 +0900464 cc_library_static {
465 name: "libstatic",
466 srcs: ["mylib.cpp"],
467 system_shared_libs: [],
468 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000469 // TODO: remove //apex_available:platform
470 apex_available: [
471 "//apex_available:platform",
472 "myapex",
473 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900474 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900475
476 java_library {
477 name: "myjar",
478 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900479 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900480 sdk_version: "none",
481 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900482 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900483 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000484 // TODO: remove //apex_available:platform
485 apex_available: [
486 "//apex_available:platform",
487 "myapex",
488 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900489 }
490
Jiyong Park77acec62020-06-01 21:39:15 +0900491 dex_import {
492 name: "myjar_dex",
493 jars: ["prebuilt.jar"],
494 apex_available: [
495 "//apex_available:platform",
496 "myapex",
497 ],
498 }
499
Jiyong Park7f7766d2019-07-25 22:02:35 +0900500 java_library {
501 name: "myotherjar",
502 srcs: ["foo/bar/MyClass.java"],
503 sdk_version: "none",
504 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900505 // TODO: remove //apex_available:platform
506 apex_available: [
507 "//apex_available:platform",
508 "myapex",
509 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900510 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900511
512 java_library {
513 name: "mysharedjar",
514 srcs: ["foo/bar/MyClass.java"],
515 sdk_version: "none",
516 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900517 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900518 `)
519
Paul Duffina71a67a2021-03-29 00:42:57 +0100520 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900521
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900522 // Make sure that Android.mk is created
523 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700524 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900525 var builder strings.Builder
526 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
527
528 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000529 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900530 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
531
Jiyong Park42cca6c2019-04-01 11:15:50 +0900532 optFlags := apexRule.Args["opt_flags"]
533 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700534 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100535 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900536
Jiyong Park25fc6a92018-11-18 18:02:45 +0900537 copyCmds := apexRule.Args["copy_commands"]
538
539 // Ensure that main rule creates an output
540 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
541
542 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700543 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
544 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900546 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900547 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900548
549 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700550 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
551 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900552 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
553 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900554 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900556
557 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800558 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
559 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900560 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900561 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900562 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900563 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
564 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900565 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900566 // .. but not for java libs
567 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900568 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800569
Colin Cross7113d202019-11-20 16:39:12 -0800570 // Ensure that the platform variant ends with _shared or _common
571 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
572 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900573 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
574 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900575 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
576
577 // Ensure that dynamic dependency to java libs are not included
578 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800579
580 // Ensure that all symlinks are present.
581 found_foo_link_64 := false
582 found_foo := false
583 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900584 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800585 if strings.HasSuffix(cmd, "bin/foo") {
586 found_foo = true
587 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
588 found_foo_link_64 = true
589 }
590 }
591 }
592 good := found_foo && found_foo_link_64
593 if !good {
594 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
595 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900596
Artur Satayeva8bd1132020-04-27 18:07:06 +0100597 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100598 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
600 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
601 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100602
603 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100604 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
606 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
607 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800608}
609
Jooyung Hanf21c7972019-12-16 22:32:06 +0900610func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800611 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900612 apex_defaults {
613 name: "myapex-defaults",
614 key: "myapex.key",
615 prebuilts: ["myetc"],
616 native_shared_libs: ["mylib"],
617 java_libs: ["myjar"],
618 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900619 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800620 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000621 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900622 }
623
624 prebuilt_etc {
625 name: "myetc",
626 src: "myprebuilt",
627 }
628
629 apex {
630 name: "myapex",
631 defaults: ["myapex-defaults"],
632 }
633
634 apex_key {
635 name: "myapex.key",
636 public_key: "testkey.avbpubkey",
637 private_key: "testkey.pem",
638 }
639
640 cc_library {
641 name: "mylib",
642 system_shared_libs: [],
643 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000644 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900645 }
646
647 java_library {
648 name: "myjar",
649 srcs: ["foo/bar/MyClass.java"],
650 sdk_version: "none",
651 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000652 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900653 }
654
655 android_app {
656 name: "AppFoo",
657 srcs: ["foo/bar/MyClass.java"],
658 sdk_version: "none",
659 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000660 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900661 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900662
663 runtime_resource_overlay {
664 name: "rro",
665 theme: "blue",
666 }
667
markchien2f59ec92020-09-02 16:23:38 +0800668 bpf {
669 name: "bpf",
670 srcs: ["bpf.c", "bpf2.c"],
671 }
672
Ken Chenfad7f9d2021-11-10 22:02:57 +0800673 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800674 name: "netdTest",
675 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800676 sub_dir: "netd",
677 }
678
Jooyung Hanf21c7972019-12-16 22:32:06 +0900679 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000680 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900681 "etc/myetc",
682 "javalib/myjar.jar",
683 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000684 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900685 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800686 "etc/bpf/bpf.o",
687 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800688 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900689 })
690}
691
Jooyung Han01a3ee22019-11-02 02:52:25 +0900692func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800693 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900694 apex {
695 name: "myapex",
696 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000697 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900698 }
699
700 apex_key {
701 name: "myapex.key",
702 public_key: "testkey.avbpubkey",
703 private_key: "testkey.pem",
704 }
705 `)
706
707 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900708 args := module.Rule("apexRule").Args
709 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
710 t.Error("manifest should be apex_manifest.pb, but " + manifest)
711 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900712}
713
Liz Kammer4854a7d2021-05-27 14:28:27 -0400714func TestApexManifestMinSdkVersion(t *testing.T) {
715 ctx := testApex(t, `
716 apex_defaults {
717 name: "my_defaults",
718 key: "myapex.key",
719 product_specific: true,
720 file_contexts: ":my-file-contexts",
721 updatable: false,
722 }
723 apex {
724 name: "myapex_30",
725 min_sdk_version: "30",
726 defaults: ["my_defaults"],
727 }
728
729 apex {
730 name: "myapex_current",
731 min_sdk_version: "current",
732 defaults: ["my_defaults"],
733 }
734
735 apex {
736 name: "myapex_none",
737 defaults: ["my_defaults"],
738 }
739
740 apex_key {
741 name: "myapex.key",
742 public_key: "testkey.avbpubkey",
743 private_key: "testkey.pem",
744 }
745
746 filegroup {
747 name: "my-file-contexts",
748 srcs: ["product_specific_file_contexts"],
749 }
750 `, withFiles(map[string][]byte{
751 "product_specific_file_contexts": nil,
752 }), android.FixtureModifyProductVariables(
753 func(variables android.FixtureProductVariables) {
754 variables.Unbundled_build = proptools.BoolPtr(true)
755 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
756 }), android.FixtureMergeEnv(map[string]string{
757 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
758 }))
759
760 testCases := []struct {
761 module string
762 minSdkVersion string
763 }{
764 {
765 module: "myapex_30",
766 minSdkVersion: "30",
767 },
768 {
769 module: "myapex_current",
770 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
771 },
772 {
773 module: "myapex_none",
774 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
775 },
776 }
777 for _, tc := range testCases {
778 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
779 args := module.Rule("apexRule").Args
780 optFlags := args["opt_flags"]
781 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
782 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
783 }
784 }
785}
786
Alex Light5098a612018-11-29 17:12:15 -0800787func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800788 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800789 apex {
790 name: "myapex",
791 key: "myapex.key",
792 payload_type: "zip",
793 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000794 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800795 }
796
797 apex_key {
798 name: "myapex.key",
799 public_key: "testkey.avbpubkey",
800 private_key: "testkey.pem",
801 }
802
803 cc_library {
804 name: "mylib",
805 srcs: ["mylib.cpp"],
806 shared_libs: ["mylib2"],
807 system_shared_libs: [],
808 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000809 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800810 }
811
812 cc_library {
813 name: "mylib2",
814 srcs: ["mylib.cpp"],
815 system_shared_libs: [],
816 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000817 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800818 }
819 `)
820
Sundong Ahnabb64432019-10-22 13:58:29 +0900821 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800822 copyCmds := zipApexRule.Args["copy_commands"]
823
824 // Ensure that main rule creates an output
825 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
826
827 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700828 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800829
830 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700831 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800832
833 // Ensure that both direct and indirect deps are copied into apex
834 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
835 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900836}
837
838func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800839 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900840 apex {
841 name: "myapex",
842 key: "myapex.key",
843 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900844 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000845 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900846 }
847
848 apex_key {
849 name: "myapex.key",
850 public_key: "testkey.avbpubkey",
851 private_key: "testkey.pem",
852 }
853
854 cc_library {
855 name: "mylib",
856 srcs: ["mylib.cpp"],
857 shared_libs: ["mylib2", "mylib3"],
858 system_shared_libs: [],
859 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000860 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900861 }
862
863 cc_library {
864 name: "mylib2",
865 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900866 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900867 system_shared_libs: [],
868 stl: "none",
869 stubs: {
870 versions: ["1", "2", "3"],
871 },
872 }
873
874 cc_library {
875 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900876 srcs: ["mylib.cpp"],
877 shared_libs: ["mylib4"],
878 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900879 stl: "none",
880 stubs: {
881 versions: ["10", "11", "12"],
882 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000883 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900884 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900885
886 cc_library {
887 name: "mylib4",
888 srcs: ["mylib.cpp"],
889 system_shared_libs: [],
890 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000891 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900892 }
Jiyong Park105dc322021-06-11 17:22:09 +0900893
894 rust_binary {
895 name: "foo.rust",
896 srcs: ["foo.rs"],
897 shared_libs: ["libfoo.shared_from_rust"],
898 prefer_rlib: true,
899 apex_available: ["myapex"],
900 }
901
902 cc_library_shared {
903 name: "libfoo.shared_from_rust",
904 srcs: ["mylib.cpp"],
905 system_shared_libs: [],
906 stl: "none",
907 stubs: {
908 versions: ["10", "11", "12"],
909 },
910 }
911
Jiyong Park25fc6a92018-11-18 18:02:45 +0900912 `)
913
Sundong Ahnabb64432019-10-22 13:58:29 +0900914 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900915 copyCmds := apexRule.Args["copy_commands"]
916
917 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800918 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919
920 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800921 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900922
923 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800924 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900925
Colin Crossaede88c2020-08-11 12:17:01 -0700926 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900927
928 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900929 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900930 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900931 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900932
933 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700934 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900935 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700936 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900937
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700938 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
939 // is replaced by sharing of "cFlags" in cc/builder.go.
940 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
941 // module variable representing "cflags". So it was not detected by ensureNotContains.
942 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
943 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
944 // including the original cflags's "-include mylib.h".
945 //
Jiyong Park64379952018-12-13 18:37:29 +0900946 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700947 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
948 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900949
Jiyong Park85cc35a2022-07-17 11:30:47 +0900950 // Ensure that genstub for platform-provided lib is invoked with --systemapi
951 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
952 // Ensure that genstub for apex-provided lib is invoked with --apex
953 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900954
Jooyung Hana57af4a2020-01-23 05:36:59 +0000955 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900956 "lib64/mylib.so",
957 "lib64/mylib3.so",
958 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900959 "bin/foo.rust",
960 "lib64/libc++.so", // by the implicit dependency from foo.rust
961 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900962 })
Jiyong Park105dc322021-06-11 17:22:09 +0900963
964 // Ensure that stub dependency from a rust module is not included
965 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
966 // The rust module is linked to the stub cc library
967 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
968 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
969 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900970
971 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
972 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900973}
974
Jiyong Park1bc84122021-06-22 20:23:05 +0900975func TestApexCanUsePrivateApis(t *testing.T) {
976 ctx := testApex(t, `
977 apex {
978 name: "myapex",
979 key: "myapex.key",
980 native_shared_libs: ["mylib"],
981 binaries: ["foo.rust"],
982 updatable: false,
983 platform_apis: true,
984 }
985
986 apex_key {
987 name: "myapex.key",
988 public_key: "testkey.avbpubkey",
989 private_key: "testkey.pem",
990 }
991
992 cc_library {
993 name: "mylib",
994 srcs: ["mylib.cpp"],
995 shared_libs: ["mylib2"],
996 system_shared_libs: [],
997 stl: "none",
998 apex_available: [ "myapex" ],
999 }
1000
1001 cc_library {
1002 name: "mylib2",
1003 srcs: ["mylib.cpp"],
1004 cflags: ["-include mylib.h"],
1005 system_shared_libs: [],
1006 stl: "none",
1007 stubs: {
1008 versions: ["1", "2", "3"],
1009 },
1010 }
1011
1012 rust_binary {
1013 name: "foo.rust",
1014 srcs: ["foo.rs"],
1015 shared_libs: ["libfoo.shared_from_rust"],
1016 prefer_rlib: true,
1017 apex_available: ["myapex"],
1018 }
1019
1020 cc_library_shared {
1021 name: "libfoo.shared_from_rust",
1022 srcs: ["mylib.cpp"],
1023 system_shared_libs: [],
1024 stl: "none",
1025 stubs: {
1026 versions: ["10", "11", "12"],
1027 },
1028 }
1029 `)
1030
1031 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1032 copyCmds := apexRule.Args["copy_commands"]
1033
1034 // Ensure that indirect stubs dep is not included
1035 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1036 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1037
1038 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1039 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001040 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001041 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1042 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Parkd4a00632022-04-12 12:23:20 +09001043 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001044 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1045 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1046}
1047
Colin Cross7812fd32020-09-25 12:35:10 -07001048func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1049 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001050 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001051 apex {
1052 name: "myapex",
1053 key: "myapex.key",
1054 native_shared_libs: ["mylib", "mylib3"],
1055 min_sdk_version: "29",
1056 }
1057
1058 apex_key {
1059 name: "myapex.key",
1060 public_key: "testkey.avbpubkey",
1061 private_key: "testkey.pem",
1062 }
1063
1064 cc_library {
1065 name: "mylib",
1066 srcs: ["mylib.cpp"],
1067 shared_libs: ["mylib2", "mylib3"],
1068 system_shared_libs: [],
1069 stl: "none",
1070 apex_available: [ "myapex" ],
1071 min_sdk_version: "28",
1072 }
1073
1074 cc_library {
1075 name: "mylib2",
1076 srcs: ["mylib.cpp"],
1077 cflags: ["-include mylib.h"],
1078 system_shared_libs: [],
1079 stl: "none",
1080 stubs: {
1081 versions: ["28", "29", "30", "current"],
1082 },
1083 min_sdk_version: "28",
1084 }
1085
1086 cc_library {
1087 name: "mylib3",
1088 srcs: ["mylib.cpp"],
1089 shared_libs: ["mylib4"],
1090 system_shared_libs: [],
1091 stl: "none",
1092 stubs: {
1093 versions: ["28", "29", "30", "current"],
1094 },
1095 apex_available: [ "myapex" ],
1096 min_sdk_version: "28",
1097 }
1098
1099 cc_library {
1100 name: "mylib4",
1101 srcs: ["mylib.cpp"],
1102 system_shared_libs: [],
1103 stl: "none",
1104 apex_available: [ "myapex" ],
1105 min_sdk_version: "28",
1106 }
1107 `)
1108
1109 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1110 copyCmds := apexRule.Args["copy_commands"]
1111
1112 // Ensure that direct non-stubs dep is always included
1113 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1114
1115 // Ensure that indirect stubs dep is not included
1116 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1117
1118 // Ensure that direct stubs dep is included
1119 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1120
1121 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1122
Jiyong Park55549df2021-02-26 23:57:23 +09001123 // Ensure that mylib is linking with the latest version of stub for mylib2
1124 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001125 // ... and not linking to the non-stub (impl) variant of mylib2
1126 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1127
1128 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1129 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1130 // .. and not linking to the stubs variant of mylib3
1131 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1132
1133 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001134 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001135 ensureNotContains(t, mylib2Cflags, "-include ")
1136
Jiyong Park85cc35a2022-07-17 11:30:47 +09001137 // Ensure that genstub is invoked with --systemapi
1138 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001139
1140 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1141 "lib64/mylib.so",
1142 "lib64/mylib3.so",
1143 "lib64/mylib4.so",
1144 })
1145}
1146
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001147func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1148 t.Parallel()
1149 // myapex (Z)
1150 // mylib -----------------.
1151 // |
1152 // otherapex (29) |
1153 // libstub's versions: 29 Z current
1154 // |
1155 // <platform> |
1156 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001157 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001158 apex {
1159 name: "myapex",
1160 key: "myapex.key",
1161 native_shared_libs: ["mylib"],
1162 min_sdk_version: "Z", // non-final
1163 }
1164
1165 cc_library {
1166 name: "mylib",
1167 srcs: ["mylib.cpp"],
1168 shared_libs: ["libstub"],
1169 apex_available: ["myapex"],
1170 min_sdk_version: "Z",
1171 }
1172
1173 apex_key {
1174 name: "myapex.key",
1175 public_key: "testkey.avbpubkey",
1176 private_key: "testkey.pem",
1177 }
1178
1179 apex {
1180 name: "otherapex",
1181 key: "myapex.key",
1182 native_shared_libs: ["libstub"],
1183 min_sdk_version: "29",
1184 }
1185
1186 cc_library {
1187 name: "libstub",
1188 srcs: ["mylib.cpp"],
1189 stubs: {
1190 versions: ["29", "Z", "current"],
1191 },
1192 apex_available: ["otherapex"],
1193 min_sdk_version: "29",
1194 }
1195
1196 // platform module depending on libstub from otherapex should use the latest stub("current")
1197 cc_library {
1198 name: "libplatform",
1199 srcs: ["mylib.cpp"],
1200 shared_libs: ["libstub"],
1201 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001202 `,
1203 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1204 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1205 variables.Platform_sdk_final = proptools.BoolPtr(false)
1206 variables.Platform_version_active_codenames = []string{"Z"}
1207 }),
1208 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001209
Jiyong Park55549df2021-02-26 23:57:23 +09001210 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001211 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001212 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001213 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001214 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001215
1216 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1217 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1218 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1219 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1220 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1221}
1222
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001223func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001224 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001225 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001226 name: "myapex2",
1227 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001228 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001229 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001230 }
1231
1232 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001233 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001234 public_key: "testkey.avbpubkey",
1235 private_key: "testkey.pem",
1236 }
1237
1238 cc_library {
1239 name: "mylib",
1240 srcs: ["mylib.cpp"],
1241 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001242 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001243 system_shared_libs: [],
1244 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001245 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001246 }
1247
1248 cc_library {
1249 name: "libfoo",
1250 srcs: ["mylib.cpp"],
1251 shared_libs: ["libbar"],
1252 system_shared_libs: [],
1253 stl: "none",
1254 stubs: {
1255 versions: ["10", "20", "30"],
1256 },
1257 }
1258
1259 cc_library {
1260 name: "libbar",
1261 srcs: ["mylib.cpp"],
1262 system_shared_libs: [],
1263 stl: "none",
1264 }
1265
Jiyong Park678c8812020-02-07 17:25:49 +09001266 cc_library_static {
1267 name: "libbaz",
1268 srcs: ["mylib.cpp"],
1269 system_shared_libs: [],
1270 stl: "none",
1271 apex_available: [ "myapex2" ],
1272 }
1273
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001274 `)
1275
Jiyong Park83dc74b2020-01-14 18:38:44 +09001276 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001277 copyCmds := apexRule.Args["copy_commands"]
1278
1279 // Ensure that direct non-stubs dep is always included
1280 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1281
1282 // Ensure that indirect stubs dep is not included
1283 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1284
1285 // Ensure that dependency of stubs is not included
1286 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1287
Colin Crossaede88c2020-08-11 12:17:01 -07001288 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001289
1290 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001291 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001292 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001293 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001294
Jiyong Park3ff16992019-12-27 14:11:47 +09001295 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001296
1297 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1298 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001299
Artur Satayeva8bd1132020-04-27 18:07:06 +01001300 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001301 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001302
Artur Satayeva8bd1132020-04-27 18:07:06 +01001303 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001304 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001305}
1306
Jooyung Hand3639552019-08-09 12:57:43 +09001307func TestApexWithRuntimeLibsDependency(t *testing.T) {
1308 /*
1309 myapex
1310 |
1311 v (runtime_libs)
1312 mylib ------+------> libfoo [provides stub]
1313 |
1314 `------> libbar
1315 */
Colin Cross1c460562021-02-16 17:55:47 -08001316 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001317 apex {
1318 name: "myapex",
1319 key: "myapex.key",
1320 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001321 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001322 }
1323
1324 apex_key {
1325 name: "myapex.key",
1326 public_key: "testkey.avbpubkey",
1327 private_key: "testkey.pem",
1328 }
1329
1330 cc_library {
1331 name: "mylib",
1332 srcs: ["mylib.cpp"],
1333 runtime_libs: ["libfoo", "libbar"],
1334 system_shared_libs: [],
1335 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001336 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001337 }
1338
1339 cc_library {
1340 name: "libfoo",
1341 srcs: ["mylib.cpp"],
1342 system_shared_libs: [],
1343 stl: "none",
1344 stubs: {
1345 versions: ["10", "20", "30"],
1346 },
1347 }
1348
1349 cc_library {
1350 name: "libbar",
1351 srcs: ["mylib.cpp"],
1352 system_shared_libs: [],
1353 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001354 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001355 }
1356
1357 `)
1358
Sundong Ahnabb64432019-10-22 13:58:29 +09001359 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001360 copyCmds := apexRule.Args["copy_commands"]
1361
1362 // Ensure that direct non-stubs dep is always included
1363 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1364
1365 // Ensure that indirect stubs dep is not included
1366 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1367
1368 // Ensure that runtime_libs dep in included
1369 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1370
Sundong Ahnabb64432019-10-22 13:58:29 +09001371 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001372 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1373 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001374
1375}
1376
Paul Duffina02cae32021-03-09 01:44:06 +00001377var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1378 cc.PrepareForTestWithCcBuildComponents,
1379 PrepareForTestWithApexBuildComponents,
1380 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001381 apex {
1382 name: "com.android.runtime",
1383 key: "com.android.runtime.key",
1384 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001385 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001386 }
1387
1388 apex_key {
1389 name: "com.android.runtime.key",
1390 public_key: "testkey.avbpubkey",
1391 private_key: "testkey.pem",
1392 }
Paul Duffina02cae32021-03-09 01:44:06 +00001393 `),
1394 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1395)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001396
Paul Duffina02cae32021-03-09 01:44:06 +00001397func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001398 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001399 cc_library {
1400 name: "libc",
1401 no_libcrt: true,
1402 nocrt: true,
1403 stl: "none",
1404 system_shared_libs: [],
1405 stubs: { versions: ["1"] },
1406 apex_available: ["com.android.runtime"],
1407
1408 sanitize: {
1409 hwaddress: true,
1410 }
1411 }
1412
1413 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001414 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001415 no_libcrt: true,
1416 nocrt: true,
1417 stl: "none",
1418 system_shared_libs: [],
1419 srcs: [""],
1420 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001421 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001422
1423 sanitize: {
1424 never: true,
1425 },
Paul Duffina02cae32021-03-09 01:44:06 +00001426 } `)
1427 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001428
1429 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1430 "lib64/bionic/libc.so",
1431 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1432 })
1433
Colin Cross4c4c1be2022-02-10 11:41:18 -08001434 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001435
1436 installed := hwasan.Description("install libclang_rt.hwasan")
1437 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1438
1439 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1440 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1441 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1442}
1443
1444func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001445 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001446 prepareForTestOfRuntimeApexWithHwasan,
1447 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1448 variables.SanitizeDevice = []string{"hwaddress"}
1449 }),
1450 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001451 cc_library {
1452 name: "libc",
1453 no_libcrt: true,
1454 nocrt: true,
1455 stl: "none",
1456 system_shared_libs: [],
1457 stubs: { versions: ["1"] },
1458 apex_available: ["com.android.runtime"],
1459 }
1460
1461 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001462 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001463 no_libcrt: true,
1464 nocrt: true,
1465 stl: "none",
1466 system_shared_libs: [],
1467 srcs: [""],
1468 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001469 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001470
1471 sanitize: {
1472 never: true,
1473 },
1474 }
Paul Duffina02cae32021-03-09 01:44:06 +00001475 `)
1476 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001477
1478 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1479 "lib64/bionic/libc.so",
1480 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1481 })
1482
Colin Cross4c4c1be2022-02-10 11:41:18 -08001483 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001484
1485 installed := hwasan.Description("install libclang_rt.hwasan")
1486 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1487
1488 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1489 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1490 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1491}
1492
Jooyung Han61b66e92020-03-21 14:21:46 +00001493func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1494 testcases := []struct {
1495 name string
1496 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001497 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001498 shouldLink string
1499 shouldNotLink []string
1500 }{
1501 {
Jiyong Park55549df2021-02-26 23:57:23 +09001502 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001503 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001504 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001505 shouldLink: "current",
1506 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001507 },
1508 {
Jiyong Park55549df2021-02-26 23:57:23 +09001509 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001510 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001511 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001512 shouldLink: "current",
1513 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001514 },
1515 }
1516 for _, tc := range testcases {
1517 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001518 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001519 apex {
1520 name: "myapex",
1521 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001522 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001523 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001524 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001525 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001526
Jooyung Han61b66e92020-03-21 14:21:46 +00001527 apex_key {
1528 name: "myapex.key",
1529 public_key: "testkey.avbpubkey",
1530 private_key: "testkey.pem",
1531 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001532
Jooyung Han61b66e92020-03-21 14:21:46 +00001533 cc_library {
1534 name: "mylib",
1535 srcs: ["mylib.cpp"],
1536 vendor_available: true,
1537 shared_libs: ["libbar"],
1538 system_shared_libs: [],
1539 stl: "none",
1540 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001541 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001542 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001543
Jooyung Han61b66e92020-03-21 14:21:46 +00001544 cc_library {
1545 name: "libbar",
1546 srcs: ["mylib.cpp"],
1547 system_shared_libs: [],
1548 stl: "none",
1549 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001550 llndk: {
1551 symbol_file: "libbar.map.txt",
1552 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001553 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001554 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001555 withUnbundledBuild,
1556 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001557
Jooyung Han61b66e92020-03-21 14:21:46 +00001558 // Ensure that LLNDK dep is not included
1559 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1560 "lib64/mylib.so",
1561 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001562
Jooyung Han61b66e92020-03-21 14:21:46 +00001563 // Ensure that LLNDK dep is required
1564 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1565 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1566 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001567
Steven Moreland2c4000c2021-04-27 02:08:49 +00001568 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1569 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001570 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001571 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001572 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001573
Steven Moreland2c4000c2021-04-27 02:08:49 +00001574 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001575 ver := tc.shouldLink
1576 if tc.shouldLink == "current" {
1577 ver = strconv.Itoa(android.FutureApiLevelInt)
1578 }
1579 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001580 })
1581 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001582}
1583
Jiyong Park25fc6a92018-11-18 18:02:45 +09001584func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001585 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001586 apex {
1587 name: "myapex",
1588 key: "myapex.key",
1589 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001590 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001591 }
1592
1593 apex_key {
1594 name: "myapex.key",
1595 public_key: "testkey.avbpubkey",
1596 private_key: "testkey.pem",
1597 }
1598
1599 cc_library {
1600 name: "mylib",
1601 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001602 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001603 shared_libs: ["libdl#27"],
1604 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001605 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001606 }
1607
1608 cc_library_shared {
1609 name: "mylib_shared",
1610 srcs: ["mylib.cpp"],
1611 shared_libs: ["libdl#27"],
1612 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001613 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001614 }
1615
1616 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001617 name: "libBootstrap",
1618 srcs: ["mylib.cpp"],
1619 stl: "none",
1620 bootstrap: true,
1621 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001622 `)
1623
Sundong Ahnabb64432019-10-22 13:58:29 +09001624 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001625 copyCmds := apexRule.Args["copy_commands"]
1626
1627 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001628 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001629 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1630 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001631
1632 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001633 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001634
Colin Crossaede88c2020-08-11 12:17:01 -07001635 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1636 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1637 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001638
1639 // For dependency to libc
1640 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001641 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001642 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001643 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001644 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001645 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1646 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001647
1648 // For dependency to libm
1649 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001650 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001651 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001652 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001653 // ... and is not compiling with the stub
1654 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1655 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1656
1657 // For dependency to libdl
1658 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001659 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001660 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001661 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1662 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001663 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001664 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001665 // ... Cflags from stub is correctly exported to mylib
1666 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1667 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001668
1669 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001670 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1671 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1672 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1673 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001674}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001675
Jooyung Han749dc692020-04-15 11:03:39 +09001676func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001677 // there are three links between liba --> libz.
1678 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001679 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001680 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001681 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001682 apex {
1683 name: "myapex",
1684 key: "myapex.key",
1685 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001686 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001687 }
1688
1689 apex {
1690 name: "otherapex",
1691 key: "myapex.key",
1692 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001693 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001694 }
1695
1696 apex_key {
1697 name: "myapex.key",
1698 public_key: "testkey.avbpubkey",
1699 private_key: "testkey.pem",
1700 }
1701
1702 cc_library {
1703 name: "libx",
1704 shared_libs: ["liba"],
1705 system_shared_libs: [],
1706 stl: "none",
1707 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001708 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001709 }
1710
1711 cc_library {
1712 name: "liby",
1713 shared_libs: ["liba"],
1714 system_shared_libs: [],
1715 stl: "none",
1716 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001717 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001718 }
1719
1720 cc_library {
1721 name: "liba",
1722 shared_libs: ["libz"],
1723 system_shared_libs: [],
1724 stl: "none",
1725 apex_available: [
1726 "//apex_available:anyapex",
1727 "//apex_available:platform",
1728 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001729 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001730 }
1731
1732 cc_library {
1733 name: "libz",
1734 system_shared_libs: [],
1735 stl: "none",
1736 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001737 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001738 },
1739 }
Jooyung Han749dc692020-04-15 11:03:39 +09001740 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001741
1742 expectLink := func(from, from_variant, to, to_variant string) {
1743 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1744 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1745 }
1746 expectNoLink := func(from, from_variant, to, to_variant string) {
1747 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1748 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1749 }
1750 // platform liba is linked to non-stub version
1751 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001752 // liba in myapex is linked to current
1753 expectLink("liba", "shared_apex29", "libz", "shared_current")
1754 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001755 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001756 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001757 // liba in otherapex is linked to current
1758 expectLink("liba", "shared_apex30", "libz", "shared_current")
1759 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001760 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1761 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001762}
1763
Jooyung Hanaed150d2020-04-02 01:41:41 +09001764func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001765 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001766 apex {
1767 name: "myapex",
1768 key: "myapex.key",
1769 native_shared_libs: ["libx"],
1770 min_sdk_version: "R",
1771 }
1772
1773 apex_key {
1774 name: "myapex.key",
1775 public_key: "testkey.avbpubkey",
1776 private_key: "testkey.pem",
1777 }
1778
1779 cc_library {
1780 name: "libx",
1781 shared_libs: ["libz"],
1782 system_shared_libs: [],
1783 stl: "none",
1784 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001785 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001786 }
1787
1788 cc_library {
1789 name: "libz",
1790 system_shared_libs: [],
1791 stl: "none",
1792 stubs: {
1793 versions: ["29", "R"],
1794 },
1795 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001796 `,
1797 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1798 variables.Platform_version_active_codenames = []string{"R"}
1799 }),
1800 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001801
1802 expectLink := func(from, from_variant, to, to_variant string) {
1803 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1804 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1805 }
1806 expectNoLink := func(from, from_variant, to, to_variant string) {
1807 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1808 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1809 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001810 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1811 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001812 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1813 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001814}
1815
Jooyung Han4c4da062021-06-23 10:23:16 +09001816func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1817 testApex(t, `
1818 apex {
1819 name: "myapex",
1820 key: "myapex.key",
1821 java_libs: ["libx"],
1822 min_sdk_version: "S",
1823 }
1824
1825 apex_key {
1826 name: "myapex.key",
1827 public_key: "testkey.avbpubkey",
1828 private_key: "testkey.pem",
1829 }
1830
1831 java_library {
1832 name: "libx",
1833 srcs: ["a.java"],
1834 apex_available: [ "myapex" ],
1835 sdk_version: "current",
1836 min_sdk_version: "S", // should be okay
1837 }
1838 `,
1839 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1840 variables.Platform_version_active_codenames = []string{"S"}
1841 variables.Platform_sdk_codename = proptools.StringPtr("S")
1842 }),
1843 )
1844}
1845
Jooyung Han749dc692020-04-15 11:03:39 +09001846func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001847 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001848 apex {
1849 name: "myapex",
1850 key: "myapex.key",
1851 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001852 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001853 }
1854
1855 apex_key {
1856 name: "myapex.key",
1857 public_key: "testkey.avbpubkey",
1858 private_key: "testkey.pem",
1859 }
1860
1861 cc_library {
1862 name: "libx",
1863 shared_libs: ["libz"],
1864 system_shared_libs: [],
1865 stl: "none",
1866 apex_available: [ "myapex" ],
1867 }
1868
1869 cc_library {
1870 name: "libz",
1871 system_shared_libs: [],
1872 stl: "none",
1873 stubs: {
1874 versions: ["1", "2"],
1875 },
1876 }
1877 `)
1878
1879 expectLink := func(from, from_variant, to, to_variant string) {
1880 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1881 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1882 }
1883 expectNoLink := func(from, from_variant, to, to_variant string) {
1884 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1885 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1886 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001887 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001888 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001889 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001890 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001891}
1892
Jiyong Park5df7bd32021-08-25 16:18:46 +09001893func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1894 ctx := testApex(t, `
1895 apex {
1896 name: "myapex",
1897 key: "myapex.key",
1898 native_shared_libs: ["mylib"],
1899 updatable: false,
1900 vendor: true,
1901 min_sdk_version: "29",
1902 }
1903
1904 apex_key {
1905 name: "myapex.key",
1906 public_key: "testkey.avbpubkey",
1907 private_key: "testkey.pem",
1908 }
1909
1910 cc_library {
1911 name: "mylib",
1912 vendor_available: true,
1913 system_shared_libs: [],
1914 stl: "none",
1915 apex_available: [ "myapex" ],
1916 min_sdk_version: "29",
1917 }
1918 `)
1919
1920 vendorVariant := "android_vendor.29_arm64_armv8-a"
1921
1922 // First check that the correct variant of crtbegin_so is used.
1923 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1924 crtBegin := names(ldRule.Args["crtBegin"])
1925 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1926
1927 // Ensure that the crtbegin_so used by the APEX is targeting 29
1928 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1929 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1930}
1931
Jooyung Han03b51852020-02-26 22:45:42 +09001932func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001933 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001934 apex {
1935 name: "myapex",
1936 key: "myapex.key",
1937 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001938 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001939 }
1940
1941 apex_key {
1942 name: "myapex.key",
1943 public_key: "testkey.avbpubkey",
1944 private_key: "testkey.pem",
1945 }
1946
1947 cc_library {
1948 name: "libx",
1949 system_shared_libs: [],
1950 stl: "none",
1951 apex_available: [ "myapex" ],
1952 stubs: {
1953 versions: ["1", "2"],
1954 },
1955 }
1956
1957 cc_library {
1958 name: "libz",
1959 shared_libs: ["libx"],
1960 system_shared_libs: [],
1961 stl: "none",
1962 }
1963 `)
1964
1965 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001966 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001967 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1968 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1969 }
1970 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001971 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001972 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1973 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1974 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001975 expectLink("libz", "shared", "libx", "shared_current")
1976 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001977 expectNoLink("libz", "shared", "libz", "shared_1")
1978 expectNoLink("libz", "shared", "libz", "shared")
1979}
1980
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001981var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1982 func(variables android.FixtureProductVariables) {
1983 variables.SanitizeDevice = []string{"hwaddress"}
1984 },
1985)
1986
Jooyung Han75568392020-03-20 04:29:24 +09001987func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001988 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001989 apex {
1990 name: "myapex",
1991 key: "myapex.key",
1992 native_shared_libs: ["libx"],
1993 min_sdk_version: "29",
1994 }
1995
1996 apex_key {
1997 name: "myapex.key",
1998 public_key: "testkey.avbpubkey",
1999 private_key: "testkey.pem",
2000 }
2001
2002 cc_library {
2003 name: "libx",
2004 shared_libs: ["libbar"],
2005 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002006 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002007 }
2008
2009 cc_library {
2010 name: "libbar",
2011 stubs: {
2012 versions: ["29", "30"],
2013 },
2014 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002015 `,
2016 prepareForTestWithSantitizeHwaddress,
2017 )
Jooyung Han03b51852020-02-26 22:45:42 +09002018 expectLink := func(from, from_variant, to, to_variant string) {
2019 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2020 libFlags := ld.Args["libFlags"]
2021 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2022 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002023 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002024}
2025
Jooyung Han75568392020-03-20 04:29:24 +09002026func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002027 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002028 apex {
2029 name: "myapex",
2030 key: "myapex.key",
2031 native_shared_libs: ["libx"],
2032 min_sdk_version: "29",
2033 }
2034
2035 apex_key {
2036 name: "myapex.key",
2037 public_key: "testkey.avbpubkey",
2038 private_key: "testkey.pem",
2039 }
2040
2041 cc_library {
2042 name: "libx",
2043 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002044 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002045 }
Jooyung Han75568392020-03-20 04:29:24 +09002046 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002047
2048 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002049 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002050 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002051 // note that platform variant is not.
2052 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002053 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002054}
2055
Jooyung Han749dc692020-04-15 11:03:39 +09002056func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2057 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002058 apex {
2059 name: "myapex",
2060 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002061 native_shared_libs: ["mylib"],
2062 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002063 }
2064
2065 apex_key {
2066 name: "myapex.key",
2067 public_key: "testkey.avbpubkey",
2068 private_key: "testkey.pem",
2069 }
Jooyung Han749dc692020-04-15 11:03:39 +09002070
2071 cc_library {
2072 name: "mylib",
2073 srcs: ["mylib.cpp"],
2074 system_shared_libs: [],
2075 stl: "none",
2076 apex_available: [
2077 "myapex",
2078 ],
2079 min_sdk_version: "30",
2080 }
2081 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002082
2083 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2084 apex {
2085 name: "myapex",
2086 key: "myapex.key",
2087 native_shared_libs: ["libfoo.ffi"],
2088 min_sdk_version: "29",
2089 }
2090
2091 apex_key {
2092 name: "myapex.key",
2093 public_key: "testkey.avbpubkey",
2094 private_key: "testkey.pem",
2095 }
2096
2097 rust_ffi_shared {
2098 name: "libfoo.ffi",
2099 srcs: ["foo.rs"],
2100 crate_name: "foo",
2101 apex_available: [
2102 "myapex",
2103 ],
2104 min_sdk_version: "30",
2105 }
2106 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002107
2108 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2109 apex {
2110 name: "myapex",
2111 key: "myapex.key",
2112 java_libs: ["libfoo"],
2113 min_sdk_version: "29",
2114 }
2115
2116 apex_key {
2117 name: "myapex.key",
2118 public_key: "testkey.avbpubkey",
2119 private_key: "testkey.pem",
2120 }
2121
2122 java_import {
2123 name: "libfoo",
2124 jars: ["libfoo.jar"],
2125 apex_available: [
2126 "myapex",
2127 ],
2128 min_sdk_version: "30",
2129 }
2130 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002131}
2132
2133func TestApexMinSdkVersion_Okay(t *testing.T) {
2134 testApex(t, `
2135 apex {
2136 name: "myapex",
2137 key: "myapex.key",
2138 native_shared_libs: ["libfoo"],
2139 java_libs: ["libbar"],
2140 min_sdk_version: "29",
2141 }
2142
2143 apex_key {
2144 name: "myapex.key",
2145 public_key: "testkey.avbpubkey",
2146 private_key: "testkey.pem",
2147 }
2148
2149 cc_library {
2150 name: "libfoo",
2151 srcs: ["mylib.cpp"],
2152 shared_libs: ["libfoo_dep"],
2153 apex_available: ["myapex"],
2154 min_sdk_version: "29",
2155 }
2156
2157 cc_library {
2158 name: "libfoo_dep",
2159 srcs: ["mylib.cpp"],
2160 apex_available: ["myapex"],
2161 min_sdk_version: "29",
2162 }
2163
2164 java_library {
2165 name: "libbar",
2166 sdk_version: "current",
2167 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002168 static_libs: [
2169 "libbar_dep",
2170 "libbar_import_dep",
2171 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002172 apex_available: ["myapex"],
2173 min_sdk_version: "29",
2174 }
2175
2176 java_library {
2177 name: "libbar_dep",
2178 sdk_version: "current",
2179 srcs: ["a.java"],
2180 apex_available: ["myapex"],
2181 min_sdk_version: "29",
2182 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002183
2184 java_import {
2185 name: "libbar_import_dep",
2186 jars: ["libbar.jar"],
2187 apex_available: ["myapex"],
2188 min_sdk_version: "29",
2189 }
Jooyung Han03b51852020-02-26 22:45:42 +09002190 `)
2191}
2192
Colin Cross8ca61c12022-10-06 21:00:14 -07002193func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2194 // Tests that an apex dependency with min_sdk_version higher than the
2195 // min_sdk_version of the apex is allowed as long as the dependency's
2196 // min_sdk_version is less than or equal to the api level that the
2197 // architecture was introduced in. In this case, arm64 didn't exist
2198 // until api level 21, so the arm64 code will never need to run on
2199 // an api level 20 device, even if other architectures of the apex
2200 // will.
2201 testApex(t, `
2202 apex {
2203 name: "myapex",
2204 key: "myapex.key",
2205 native_shared_libs: ["libfoo"],
2206 min_sdk_version: "20",
2207 }
2208
2209 apex_key {
2210 name: "myapex.key",
2211 public_key: "testkey.avbpubkey",
2212 private_key: "testkey.pem",
2213 }
2214
2215 cc_library {
2216 name: "libfoo",
2217 srcs: ["mylib.cpp"],
2218 apex_available: ["myapex"],
2219 min_sdk_version: "21",
2220 stl: "none",
2221 }
2222 `)
2223}
2224
Artur Satayev8cf899a2020-04-15 17:29:42 +01002225func TestJavaStableSdkVersion(t *testing.T) {
2226 testCases := []struct {
2227 name string
2228 expectedError string
2229 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002230 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002231 }{
2232 {
2233 name: "Non-updatable apex with non-stable dep",
2234 bp: `
2235 apex {
2236 name: "myapex",
2237 java_libs: ["myjar"],
2238 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002239 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002240 }
2241 apex_key {
2242 name: "myapex.key",
2243 public_key: "testkey.avbpubkey",
2244 private_key: "testkey.pem",
2245 }
2246 java_library {
2247 name: "myjar",
2248 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002249 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002250 apex_available: ["myapex"],
2251 }
2252 `,
2253 },
2254 {
2255 name: "Updatable apex with stable dep",
2256 bp: `
2257 apex {
2258 name: "myapex",
2259 java_libs: ["myjar"],
2260 key: "myapex.key",
2261 updatable: true,
2262 min_sdk_version: "29",
2263 }
2264 apex_key {
2265 name: "myapex.key",
2266 public_key: "testkey.avbpubkey",
2267 private_key: "testkey.pem",
2268 }
2269 java_library {
2270 name: "myjar",
2271 srcs: ["foo/bar/MyClass.java"],
2272 sdk_version: "current",
2273 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002274 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002275 }
2276 `,
2277 },
2278 {
2279 name: "Updatable apex with non-stable dep",
2280 expectedError: "cannot depend on \"myjar\"",
2281 bp: `
2282 apex {
2283 name: "myapex",
2284 java_libs: ["myjar"],
2285 key: "myapex.key",
2286 updatable: true,
2287 }
2288 apex_key {
2289 name: "myapex.key",
2290 public_key: "testkey.avbpubkey",
2291 private_key: "testkey.pem",
2292 }
2293 java_library {
2294 name: "myjar",
2295 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002296 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002297 apex_available: ["myapex"],
2298 }
2299 `,
2300 },
2301 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002302 name: "Updatable apex with non-stable legacy core platform dep",
2303 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2304 bp: `
2305 apex {
2306 name: "myapex",
2307 java_libs: ["myjar-uses-legacy"],
2308 key: "myapex.key",
2309 updatable: true,
2310 }
2311 apex_key {
2312 name: "myapex.key",
2313 public_key: "testkey.avbpubkey",
2314 private_key: "testkey.pem",
2315 }
2316 java_library {
2317 name: "myjar-uses-legacy",
2318 srcs: ["foo/bar/MyClass.java"],
2319 sdk_version: "core_platform",
2320 apex_available: ["myapex"],
2321 }
2322 `,
2323 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2324 },
2325 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002326 name: "Updatable apex with non-stable transitive dep",
2327 // This is not actually detecting that the transitive dependency is unstable, rather it is
2328 // detecting that the transitive dependency is building against a wider API surface than the
2329 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002330 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002331 bp: `
2332 apex {
2333 name: "myapex",
2334 java_libs: ["myjar"],
2335 key: "myapex.key",
2336 updatable: true,
2337 }
2338 apex_key {
2339 name: "myapex.key",
2340 public_key: "testkey.avbpubkey",
2341 private_key: "testkey.pem",
2342 }
2343 java_library {
2344 name: "myjar",
2345 srcs: ["foo/bar/MyClass.java"],
2346 sdk_version: "current",
2347 apex_available: ["myapex"],
2348 static_libs: ["transitive-jar"],
2349 }
2350 java_library {
2351 name: "transitive-jar",
2352 srcs: ["foo/bar/MyClass.java"],
2353 sdk_version: "core_platform",
2354 apex_available: ["myapex"],
2355 }
2356 `,
2357 },
2358 }
2359
2360 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002361 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2362 continue
2363 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002364 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002365 errorHandler := android.FixtureExpectsNoErrors
2366 if test.expectedError != "" {
2367 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002368 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002369 android.GroupFixturePreparers(
2370 java.PrepareForTestWithJavaDefaultModules,
2371 PrepareForTestWithApexBuildComponents,
2372 prepareForTestWithMyapex,
2373 android.OptionalFixturePreparer(test.preparer),
2374 ).
2375 ExtendWithErrorHandler(errorHandler).
2376 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002377 })
2378 }
2379}
2380
Jooyung Han749dc692020-04-15 11:03:39 +09002381func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2382 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2383 apex {
2384 name: "myapex",
2385 key: "myapex.key",
2386 native_shared_libs: ["mylib"],
2387 min_sdk_version: "29",
2388 }
2389
2390 apex_key {
2391 name: "myapex.key",
2392 public_key: "testkey.avbpubkey",
2393 private_key: "testkey.pem",
2394 }
2395
2396 cc_library {
2397 name: "mylib",
2398 srcs: ["mylib.cpp"],
2399 shared_libs: ["mylib2"],
2400 system_shared_libs: [],
2401 stl: "none",
2402 apex_available: [
2403 "myapex",
2404 ],
2405 min_sdk_version: "29",
2406 }
2407
2408 // indirect part of the apex
2409 cc_library {
2410 name: "mylib2",
2411 srcs: ["mylib.cpp"],
2412 system_shared_libs: [],
2413 stl: "none",
2414 apex_available: [
2415 "myapex",
2416 ],
2417 min_sdk_version: "30",
2418 }
2419 `)
2420}
2421
2422func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2423 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2424 apex {
2425 name: "myapex",
2426 key: "myapex.key",
2427 apps: ["AppFoo"],
2428 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002429 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002430 }
2431
2432 apex_key {
2433 name: "myapex.key",
2434 public_key: "testkey.avbpubkey",
2435 private_key: "testkey.pem",
2436 }
2437
2438 android_app {
2439 name: "AppFoo",
2440 srcs: ["foo/bar/MyClass.java"],
2441 sdk_version: "current",
2442 min_sdk_version: "29",
2443 system_modules: "none",
2444 stl: "none",
2445 static_libs: ["bar"],
2446 apex_available: [ "myapex" ],
2447 }
2448
2449 java_library {
2450 name: "bar",
2451 sdk_version: "current",
2452 srcs: ["a.java"],
2453 apex_available: [ "myapex" ],
2454 }
2455 `)
2456}
2457
2458func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002459 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002460 apex {
2461 name: "myapex",
2462 key: "myapex.key",
2463 native_shared_libs: ["mylib"],
2464 min_sdk_version: "29",
2465 }
2466
2467 apex_key {
2468 name: "myapex.key",
2469 public_key: "testkey.avbpubkey",
2470 private_key: "testkey.pem",
2471 }
2472
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002473 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002474 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2475 cc_library {
2476 name: "mylib",
2477 srcs: ["mylib.cpp"],
2478 shared_libs: ["mylib2"],
2479 system_shared_libs: [],
2480 stl: "none",
2481 apex_available: ["myapex", "otherapex"],
2482 min_sdk_version: "29",
2483 }
2484
2485 cc_library {
2486 name: "mylib2",
2487 srcs: ["mylib.cpp"],
2488 system_shared_libs: [],
2489 stl: "none",
2490 apex_available: ["otherapex"],
2491 stubs: { versions: ["29", "30"] },
2492 min_sdk_version: "30",
2493 }
2494
2495 apex {
2496 name: "otherapex",
2497 key: "myapex.key",
2498 native_shared_libs: ["mylib", "mylib2"],
2499 min_sdk_version: "30",
2500 }
2501 `)
2502 expectLink := func(from, from_variant, to, to_variant string) {
2503 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2504 libFlags := ld.Args["libFlags"]
2505 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2506 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002507 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002508 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002509}
2510
Jooyung Haned124c32021-01-26 11:43:46 +09002511func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002512 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2513 func(variables android.FixtureProductVariables) {
2514 variables.Platform_sdk_codename = proptools.StringPtr("S")
2515 variables.Platform_version_active_codenames = []string{"S"}
2516 },
2517 )
Jooyung Haned124c32021-01-26 11:43:46 +09002518 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2519 apex {
2520 name: "myapex",
2521 key: "myapex.key",
2522 native_shared_libs: ["libfoo"],
2523 min_sdk_version: "S",
2524 }
2525 apex_key {
2526 name: "myapex.key",
2527 public_key: "testkey.avbpubkey",
2528 private_key: "testkey.pem",
2529 }
2530 cc_library {
2531 name: "libfoo",
2532 shared_libs: ["libbar"],
2533 apex_available: ["myapex"],
2534 min_sdk_version: "29",
2535 }
2536 cc_library {
2537 name: "libbar",
2538 apex_available: ["myapex"],
2539 }
2540 `, withSAsActiveCodeNames)
2541}
2542
2543func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002544 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2545 variables.Platform_sdk_codename = proptools.StringPtr("S")
2546 variables.Platform_version_active_codenames = []string{"S", "T"}
2547 })
Colin Cross1c460562021-02-16 17:55:47 -08002548 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002549 apex {
2550 name: "myapex",
2551 key: "myapex.key",
2552 native_shared_libs: ["libfoo"],
2553 min_sdk_version: "S",
2554 }
2555 apex_key {
2556 name: "myapex.key",
2557 public_key: "testkey.avbpubkey",
2558 private_key: "testkey.pem",
2559 }
2560 cc_library {
2561 name: "libfoo",
2562 shared_libs: ["libbar"],
2563 apex_available: ["myapex"],
2564 min_sdk_version: "S",
2565 }
2566 cc_library {
2567 name: "libbar",
2568 stubs: {
2569 symbol_file: "libbar.map.txt",
2570 versions: ["30", "S", "T"],
2571 },
2572 }
2573 `, withSAsActiveCodeNames)
2574
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002575 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002576 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2577 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002578 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002579}
2580
Jiyong Park7c2ee712018-12-07 00:42:25 +09002581func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002582 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002583 apex {
2584 name: "myapex",
2585 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002586 native_shared_libs: ["mylib"],
2587 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002588 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002589 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002590 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002591 }
2592
2593 apex_key {
2594 name: "myapex.key",
2595 public_key: "testkey.avbpubkey",
2596 private_key: "testkey.pem",
2597 }
2598
2599 prebuilt_etc {
2600 name: "myetc",
2601 src: "myprebuilt",
2602 sub_dir: "foo/bar",
2603 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002604
2605 cc_library {
2606 name: "mylib",
2607 srcs: ["mylib.cpp"],
2608 relative_install_path: "foo/bar",
2609 system_shared_libs: [],
2610 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002611 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002612 }
2613
2614 cc_binary {
2615 name: "mybin",
2616 srcs: ["mylib.cpp"],
2617 relative_install_path: "foo/bar",
2618 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002619 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002620 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002621 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002622 `)
2623
Sundong Ahnabb64432019-10-22 13:58:29 +09002624 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002625 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002626
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002627 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002628 ensureContains(t, cmd, "/etc ")
2629 ensureContains(t, cmd, "/etc/foo ")
2630 ensureContains(t, cmd, "/etc/foo/bar ")
2631 ensureContains(t, cmd, "/lib64 ")
2632 ensureContains(t, cmd, "/lib64/foo ")
2633 ensureContains(t, cmd, "/lib64/foo/bar ")
2634 ensureContains(t, cmd, "/lib ")
2635 ensureContains(t, cmd, "/lib/foo ")
2636 ensureContains(t, cmd, "/lib/foo/bar ")
2637 ensureContains(t, cmd, "/bin ")
2638 ensureContains(t, cmd, "/bin/foo ")
2639 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002640}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002641
Jooyung Han35155c42020-02-06 17:33:20 +09002642func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002643 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002644 apex {
2645 name: "myapex",
2646 key: "myapex.key",
2647 multilib: {
2648 both: {
2649 native_shared_libs: ["mylib"],
2650 binaries: ["mybin"],
2651 },
2652 },
2653 compile_multilib: "both",
2654 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002655 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002656 }
2657
2658 apex_key {
2659 name: "myapex.key",
2660 public_key: "testkey.avbpubkey",
2661 private_key: "testkey.pem",
2662 }
2663
2664 cc_library {
2665 name: "mylib",
2666 relative_install_path: "foo/bar",
2667 system_shared_libs: [],
2668 stl: "none",
2669 apex_available: [ "myapex" ],
2670 native_bridge_supported: true,
2671 }
2672
2673 cc_binary {
2674 name: "mybin",
2675 relative_install_path: "foo/bar",
2676 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002677 stl: "none",
2678 apex_available: [ "myapex" ],
2679 native_bridge_supported: true,
2680 compile_multilib: "both", // default is "first" for binary
2681 multilib: {
2682 lib64: {
2683 suffix: "64",
2684 },
2685 },
2686 }
2687 `, withNativeBridgeEnabled)
2688 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2689 "bin/foo/bar/mybin",
2690 "bin/foo/bar/mybin64",
2691 "bin/arm/foo/bar/mybin",
2692 "bin/arm64/foo/bar/mybin64",
2693 "lib/foo/bar/mylib.so",
2694 "lib/arm/foo/bar/mylib.so",
2695 "lib64/foo/bar/mylib.so",
2696 "lib64/arm64/foo/bar/mylib.so",
2697 })
2698}
2699
Jooyung Han85d61762020-06-24 23:50:26 +09002700func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002701 result := android.GroupFixturePreparers(
2702 prepareForApexTest,
2703 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2704 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002705 apex {
2706 name: "myapex",
2707 key: "myapex.key",
2708 binaries: ["mybin"],
2709 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002710 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002711 }
2712 apex_key {
2713 name: "myapex.key",
2714 public_key: "testkey.avbpubkey",
2715 private_key: "testkey.pem",
2716 }
2717 cc_binary {
2718 name: "mybin",
2719 vendor: true,
2720 shared_libs: ["libfoo"],
2721 }
2722 cc_library {
2723 name: "libfoo",
2724 proprietary: true,
2725 }
2726 `)
2727
Colin Crossc68db4b2021-11-11 18:59:15 -08002728 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002729 "bin/mybin",
2730 "lib64/libfoo.so",
2731 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2732 "lib64/libc++.so",
2733 })
2734
Colin Crossc68db4b2021-11-11 18:59:15 -08002735 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2736 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002737 name := apexBundle.BaseModuleName()
2738 prefix := "TARGET_"
2739 var builder strings.Builder
2740 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002741 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002742 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002743 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002744
Colin Crossc68db4b2021-11-11 18:59:15 -08002745 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002746 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2747 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002748}
2749
Jooyung Hanc5a96762022-02-04 11:54:50 +09002750func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2751 testApexError(t, `Trying to include a VNDK library`, `
2752 apex {
2753 name: "myapex",
2754 key: "myapex.key",
2755 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2756 vendor: true,
2757 use_vndk_as_stable: true,
2758 updatable: false,
2759 }
2760 apex_key {
2761 name: "myapex.key",
2762 public_key: "testkey.avbpubkey",
2763 private_key: "testkey.pem",
2764 }`)
2765}
2766
Jooyung Handf78e212020-07-22 15:54:47 +09002767func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002768 // myapex myapex2
2769 // | |
2770 // mybin ------. mybin2
2771 // \ \ / |
2772 // (stable) .---\--------` |
2773 // \ / \ |
2774 // \ / \ /
2775 // libvndk libvendor
2776 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002777 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002778 apex {
2779 name: "myapex",
2780 key: "myapex.key",
2781 binaries: ["mybin"],
2782 vendor: true,
2783 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002784 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002785 }
2786 apex_key {
2787 name: "myapex.key",
2788 public_key: "testkey.avbpubkey",
2789 private_key: "testkey.pem",
2790 }
2791 cc_binary {
2792 name: "mybin",
2793 vendor: true,
2794 shared_libs: ["libvndk", "libvendor"],
2795 }
2796 cc_library {
2797 name: "libvndk",
2798 vndk: {
2799 enabled: true,
2800 },
2801 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002802 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002803 }
2804 cc_library {
2805 name: "libvendor",
2806 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002807 stl: "none",
2808 }
2809 apex {
2810 name: "myapex2",
2811 key: "myapex.key",
2812 binaries: ["mybin2"],
2813 vendor: true,
2814 use_vndk_as_stable: false,
2815 updatable: false,
2816 }
2817 cc_binary {
2818 name: "mybin2",
2819 vendor: true,
2820 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002821 }
2822 `)
2823
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002824 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002825
Jooyung Han91f92032022-02-04 12:36:33 +09002826 for _, tc := range []struct {
2827 name string
2828 apexName string
2829 moduleName string
2830 moduleVariant string
2831 libs []string
2832 contents []string
2833 requireVndkNamespace bool
2834 }{
2835 {
2836 name: "use_vndk_as_stable",
2837 apexName: "myapex",
2838 moduleName: "mybin",
2839 moduleVariant: vendorVariant + "_apex10000",
2840 libs: []string{
2841 // should link with vendor variants of VNDK libs(libvndk/libc++)
2842 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2843 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2844 // unstable Vendor libs as APEX variant
2845 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2846 },
2847 contents: []string{
2848 "bin/mybin",
2849 "lib64/libvendor.so",
2850 // VNDK libs (libvndk/libc++) are not included
2851 },
2852 requireVndkNamespace: true,
2853 },
2854 {
2855 name: "!use_vndk_as_stable",
2856 apexName: "myapex2",
2857 moduleName: "mybin2",
2858 moduleVariant: vendorVariant + "_myapex2",
2859 libs: []string{
2860 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2861 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2862 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2863 // unstable vendor libs have "merged" APEX variants
2864 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2865 },
2866 contents: []string{
2867 "bin/mybin2",
2868 "lib64/libvendor.so",
2869 // VNDK libs are included as well
2870 "lib64/libvndk.so",
2871 "lib64/libc++.so",
2872 },
2873 requireVndkNamespace: false,
2874 },
2875 } {
2876 t.Run(tc.name, func(t *testing.T) {
2877 // Check linked libs
2878 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2879 libs := names(ldRule.Args["libFlags"])
2880 for _, lib := range tc.libs {
2881 ensureListContains(t, libs, lib)
2882 }
2883 // Check apex contents
2884 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002885
Jooyung Han91f92032022-02-04 12:36:33 +09002886 // Check "requireNativeLibs"
2887 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2888 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2889 if tc.requireVndkNamespace {
2890 ensureListContains(t, requireNativeLibs, ":vndk")
2891 } else {
2892 ensureListNotContains(t, requireNativeLibs, ":vndk")
2893 }
2894 })
2895 }
Jooyung Handf78e212020-07-22 15:54:47 +09002896}
2897
Justin Yun13decfb2021-03-08 19:25:55 +09002898func TestProductVariant(t *testing.T) {
2899 ctx := testApex(t, `
2900 apex {
2901 name: "myapex",
2902 key: "myapex.key",
2903 updatable: false,
2904 product_specific: true,
2905 binaries: ["foo"],
2906 }
2907
2908 apex_key {
2909 name: "myapex.key",
2910 public_key: "testkey.avbpubkey",
2911 private_key: "testkey.pem",
2912 }
2913
2914 cc_binary {
2915 name: "foo",
2916 product_available: true,
2917 apex_available: ["myapex"],
2918 srcs: ["foo.cpp"],
2919 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002920 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2921 variables.ProductVndkVersion = proptools.StringPtr("current")
2922 }),
2923 )
Justin Yun13decfb2021-03-08 19:25:55 +09002924
2925 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002926 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002927 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2928 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2929 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2930 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2931}
2932
Jooyung Han8e5685d2020-09-21 11:02:57 +09002933func TestApex_withPrebuiltFirmware(t *testing.T) {
2934 testCases := []struct {
2935 name string
2936 additionalProp string
2937 }{
2938 {"system apex with prebuilt_firmware", ""},
2939 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2940 }
2941 for _, tc := range testCases {
2942 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002943 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002944 apex {
2945 name: "myapex",
2946 key: "myapex.key",
2947 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002948 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002949 `+tc.additionalProp+`
2950 }
2951 apex_key {
2952 name: "myapex.key",
2953 public_key: "testkey.avbpubkey",
2954 private_key: "testkey.pem",
2955 }
2956 prebuilt_firmware {
2957 name: "myfirmware",
2958 src: "myfirmware.bin",
2959 filename_from_src: true,
2960 `+tc.additionalProp+`
2961 }
2962 `)
2963 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2964 "etc/firmware/myfirmware.bin",
2965 })
2966 })
2967 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002968}
2969
Jooyung Hanefb184e2020-06-25 17:14:25 +09002970func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002971 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002972 apex {
2973 name: "myapex",
2974 key: "myapex.key",
2975 vendor: true,
2976 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002977 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002978 }
2979
2980 apex_key {
2981 name: "myapex.key",
2982 public_key: "testkey.avbpubkey",
2983 private_key: "testkey.pem",
2984 }
2985
2986 cc_library {
2987 name: "mylib",
2988 vendor_available: true,
2989 }
2990 `)
2991
2992 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002993 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002994 name := apexBundle.BaseModuleName()
2995 prefix := "TARGET_"
2996 var builder strings.Builder
2997 data.Custom(&builder, name, prefix, "", data)
2998 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00002999 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003000}
3001
Jooyung Han2ed99d02020-06-24 23:26:26 +09003002func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003003 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003004 apex {
3005 name: "myapex",
3006 key: "myapex.key",
3007 vintf_fragments: ["fragment.xml"],
3008 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003009 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003010 }
3011 apex_key {
3012 name: "myapex.key",
3013 public_key: "testkey.avbpubkey",
3014 private_key: "testkey.pem",
3015 }
3016 cc_binary {
3017 name: "mybin",
3018 }
3019 `)
3020
3021 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003022 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003023 name := apexBundle.BaseModuleName()
3024 prefix := "TARGET_"
3025 var builder strings.Builder
3026 data.Custom(&builder, name, prefix, "", data)
3027 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003028 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003029 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003030}
3031
Jiyong Park16e91a02018-12-20 18:18:08 +09003032func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003033 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003034 apex {
3035 name: "myapex",
3036 key: "myapex.key",
3037 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003038 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003039 }
3040
3041 apex_key {
3042 name: "myapex.key",
3043 public_key: "testkey.avbpubkey",
3044 private_key: "testkey.pem",
3045 }
3046
3047 cc_library {
3048 name: "mylib",
3049 srcs: ["mylib.cpp"],
3050 system_shared_libs: [],
3051 stl: "none",
3052 stubs: {
3053 versions: ["1", "2", "3"],
3054 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003055 apex_available: [
3056 "//apex_available:platform",
3057 "myapex",
3058 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003059 }
3060
3061 cc_binary {
3062 name: "not_in_apex",
3063 srcs: ["mylib.cpp"],
3064 static_libs: ["mylib"],
3065 static_executable: true,
3066 system_shared_libs: [],
3067 stl: "none",
3068 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003069 `)
3070
Colin Cross7113d202019-11-20 16:39:12 -08003071 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003072
3073 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003074 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003075}
Jiyong Park9335a262018-12-24 11:31:58 +09003076
3077func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003078 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003079 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003080 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003081 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003082 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003083 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003084 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003085 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003086 }
3087
3088 cc_library {
3089 name: "mylib",
3090 srcs: ["mylib.cpp"],
3091 system_shared_libs: [],
3092 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003093 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003094 }
3095
3096 apex_key {
3097 name: "myapex.key",
3098 public_key: "testkey.avbpubkey",
3099 private_key: "testkey.pem",
3100 }
3101
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003102 android_app_certificate {
3103 name: "myapex.certificate",
3104 certificate: "testkey",
3105 }
3106
3107 android_app_certificate {
3108 name: "myapex.certificate.override",
3109 certificate: "testkey.override",
3110 }
3111
Jiyong Park9335a262018-12-24 11:31:58 +09003112 `)
3113
3114 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003115 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003116
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003117 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3118 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003119 "vendor/foo/devkeys/testkey.avbpubkey")
3120 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003121 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3122 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003123 "vendor/foo/devkeys/testkey.pem")
3124 }
3125
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003126 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003127 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003128 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003129 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003130 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003131 }
3132}
Jiyong Park58e364a2019-01-19 19:24:06 +09003133
Jooyung Hanf121a652019-12-17 14:30:11 +09003134func TestCertificate(t *testing.T) {
3135 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003136 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003137 apex {
3138 name: "myapex",
3139 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003140 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003141 }
3142 apex_key {
3143 name: "myapex.key",
3144 public_key: "testkey.avbpubkey",
3145 private_key: "testkey.pem",
3146 }`)
3147 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3148 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3149 if actual := rule.Args["certificates"]; actual != expected {
3150 t.Errorf("certificates should be %q, not %q", expected, actual)
3151 }
3152 })
3153 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003154 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003155 apex {
3156 name: "myapex_keytest",
3157 key: "myapex.key",
3158 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003159 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003160 }
3161 apex_key {
3162 name: "myapex.key",
3163 public_key: "testkey.avbpubkey",
3164 private_key: "testkey.pem",
3165 }
3166 android_app_certificate {
3167 name: "myapex.certificate.override",
3168 certificate: "testkey.override",
3169 }`)
3170 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3171 expected := "testkey.override.x509.pem testkey.override.pk8"
3172 if actual := rule.Args["certificates"]; actual != expected {
3173 t.Errorf("certificates should be %q, not %q", expected, actual)
3174 }
3175 })
3176 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003177 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003178 apex {
3179 name: "myapex",
3180 key: "myapex.key",
3181 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003182 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003183 }
3184 apex_key {
3185 name: "myapex.key",
3186 public_key: "testkey.avbpubkey",
3187 private_key: "testkey.pem",
3188 }
3189 android_app_certificate {
3190 name: "myapex.certificate",
3191 certificate: "testkey",
3192 }`)
3193 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3194 expected := "testkey.x509.pem testkey.pk8"
3195 if actual := rule.Args["certificates"]; actual != expected {
3196 t.Errorf("certificates should be %q, not %q", expected, actual)
3197 }
3198 })
3199 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003200 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003201 apex {
3202 name: "myapex_keytest",
3203 key: "myapex.key",
3204 file_contexts: ":myapex-file_contexts",
3205 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003206 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003207 }
3208 apex_key {
3209 name: "myapex.key",
3210 public_key: "testkey.avbpubkey",
3211 private_key: "testkey.pem",
3212 }
3213 android_app_certificate {
3214 name: "myapex.certificate.override",
3215 certificate: "testkey.override",
3216 }`)
3217 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3218 expected := "testkey.override.x509.pem testkey.override.pk8"
3219 if actual := rule.Args["certificates"]; actual != expected {
3220 t.Errorf("certificates should be %q, not %q", expected, actual)
3221 }
3222 })
3223 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003224 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003225 apex {
3226 name: "myapex",
3227 key: "myapex.key",
3228 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003229 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003230 }
3231 apex_key {
3232 name: "myapex.key",
3233 public_key: "testkey.avbpubkey",
3234 private_key: "testkey.pem",
3235 }`)
3236 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3237 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3238 if actual := rule.Args["certificates"]; actual != expected {
3239 t.Errorf("certificates should be %q, not %q", expected, actual)
3240 }
3241 })
3242 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003243 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003244 apex {
3245 name: "myapex_keytest",
3246 key: "myapex.key",
3247 file_contexts: ":myapex-file_contexts",
3248 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003249 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003250 }
3251 apex_key {
3252 name: "myapex.key",
3253 public_key: "testkey.avbpubkey",
3254 private_key: "testkey.pem",
3255 }
3256 android_app_certificate {
3257 name: "myapex.certificate.override",
3258 certificate: "testkey.override",
3259 }`)
3260 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3261 expected := "testkey.override.x509.pem testkey.override.pk8"
3262 if actual := rule.Args["certificates"]; actual != expected {
3263 t.Errorf("certificates should be %q, not %q", expected, actual)
3264 }
3265 })
3266}
3267
Jiyong Park58e364a2019-01-19 19:24:06 +09003268func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003269 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003270 apex {
3271 name: "myapex",
3272 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003273 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003274 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003275 }
3276
3277 apex {
3278 name: "otherapex",
3279 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003280 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003281 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003282 }
3283
3284 apex_key {
3285 name: "myapex.key",
3286 public_key: "testkey.avbpubkey",
3287 private_key: "testkey.pem",
3288 }
3289
3290 cc_library {
3291 name: "mylib",
3292 srcs: ["mylib.cpp"],
3293 system_shared_libs: [],
3294 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003295 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003296 "myapex",
3297 "otherapex",
3298 ],
Jooyung Han24282772020-03-21 23:20:55 +09003299 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003300 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003301 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003302 cc_library {
3303 name: "mylib2",
3304 srcs: ["mylib.cpp"],
3305 system_shared_libs: [],
3306 stl: "none",
3307 apex_available: [
3308 "myapex",
3309 "otherapex",
3310 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003311 static_libs: ["mylib3"],
3312 recovery_available: true,
3313 min_sdk_version: "29",
3314 }
3315 cc_library {
3316 name: "mylib3",
3317 srcs: ["mylib.cpp"],
3318 system_shared_libs: [],
3319 stl: "none",
3320 apex_available: [
3321 "myapex",
3322 "otherapex",
3323 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003324 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003325 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003326 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003327 `)
3328
Jooyung Hanc87a0592020-03-02 17:44:33 +09003329 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003330 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003331 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003332
Vinh Tranf9754732023-01-19 22:41:46 -05003333 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003334 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003335 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003336
Vinh Tranf9754732023-01-19 22:41:46 -05003337 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003338 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003339 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003340
Colin Crossaede88c2020-08-11 12:17:01 -07003341 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3342 // each variant defines additional macros to distinguish which apex variant it is built for
3343
3344 // non-APEX variant does not have __ANDROID_APEX__ defined
3345 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3346 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3347
Vinh Tranf9754732023-01-19 22:41:46 -05003348 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003349 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3350 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003351
Jooyung Hanc87a0592020-03-02 17:44:33 +09003352 // non-APEX variant does not have __ANDROID_APEX__ defined
3353 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3354 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3355
Vinh Tranf9754732023-01-19 22:41:46 -05003356 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003357 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003358 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003359}
Jiyong Park7e636d02019-01-28 16:16:54 +09003360
3361func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003362 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003363 apex {
3364 name: "myapex",
3365 key: "myapex.key",
3366 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003367 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003368 }
3369
3370 apex_key {
3371 name: "myapex.key",
3372 public_key: "testkey.avbpubkey",
3373 private_key: "testkey.pem",
3374 }
3375
3376 cc_library_headers {
3377 name: "mylib_headers",
3378 export_include_dirs: ["my_include"],
3379 system_shared_libs: [],
3380 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003381 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003382 }
3383
3384 cc_library {
3385 name: "mylib",
3386 srcs: ["mylib.cpp"],
3387 system_shared_libs: [],
3388 stl: "none",
3389 header_libs: ["mylib_headers"],
3390 export_header_lib_headers: ["mylib_headers"],
3391 stubs: {
3392 versions: ["1", "2", "3"],
3393 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003394 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003395 }
3396
3397 cc_library {
3398 name: "otherlib",
3399 srcs: ["mylib.cpp"],
3400 system_shared_libs: [],
3401 stl: "none",
3402 shared_libs: ["mylib"],
3403 }
3404 `)
3405
Colin Cross7113d202019-11-20 16:39:12 -08003406 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003407
3408 // Ensure that the include path of the header lib is exported to 'otherlib'
3409 ensureContains(t, cFlags, "-Imy_include")
3410}
Alex Light9670d332019-01-29 18:07:33 -08003411
Jiyong Park7cd10e32020-01-14 09:22:18 +09003412type fileInApex struct {
3413 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003414 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003415 isLink bool
3416}
3417
Jooyung Han1724d582022-12-21 10:17:44 +09003418func (f fileInApex) String() string {
3419 return f.src + ":" + f.path
3420}
3421
3422func (f fileInApex) match(expectation string) bool {
3423 parts := strings.Split(expectation, ":")
3424 if len(parts) == 1 {
3425 match, _ := path.Match(parts[0], f.path)
3426 return match
3427 }
3428 if len(parts) == 2 {
3429 matchSrc, _ := path.Match(parts[0], f.src)
3430 matchDst, _ := path.Match(parts[1], f.path)
3431 return matchSrc && matchDst
3432 }
3433 panic("invalid expected file specification: " + expectation)
3434}
3435
Jooyung Hana57af4a2020-01-23 05:36:59 +00003436func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003437 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003438 module := ctx.ModuleForTests(moduleName, variant)
3439 apexRule := module.MaybeRule("apexRule")
3440 apexDir := "/image.apex/"
3441 if apexRule.Rule == nil {
3442 apexRule = module.Rule("zipApexRule")
3443 apexDir = "/image.zipapex/"
3444 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003445 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003446 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003447 for _, cmd := range strings.Split(copyCmds, "&&") {
3448 cmd = strings.TrimSpace(cmd)
3449 if cmd == "" {
3450 continue
3451 }
3452 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003453 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003454 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003455 switch terms[0] {
3456 case "mkdir":
3457 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003458 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003459 t.Fatal("copyCmds contains invalid cp command", cmd)
3460 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003461 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003462 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003463 isLink = false
3464 case "ln":
3465 if len(terms) != 3 && len(terms) != 4 {
3466 // ln LINK TARGET or ln -s LINK TARGET
3467 t.Fatal("copyCmds contains invalid ln command", cmd)
3468 }
3469 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003470 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003471 isLink = true
3472 default:
3473 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3474 }
3475 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003476 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003477 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003478 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003479 }
Jooyung Han1724d582022-12-21 10:17:44 +09003480 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003481 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003482 }
3483 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003484 return ret
3485}
3486
Jooyung Hana57af4a2020-01-23 05:36:59 +00003487func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3488 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003489 var failed bool
3490 var surplus []string
3491 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003492 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Han1724d582022-12-21 10:17:44 +09003493 matchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003494 for _, expected := range files {
Jooyung Han1724d582022-12-21 10:17:44 +09003495 if file.match(expected) {
3496 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003497 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003498 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003499 }
3500 }
Jooyung Han1724d582022-12-21 10:17:44 +09003501 if !matchFound {
3502 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003503 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003504 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003505
Jooyung Han31c470b2019-10-18 16:26:59 +09003506 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003507 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003508 t.Log("surplus files", surplus)
3509 failed = true
3510 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003511
3512 if len(files) > len(filesMatched) {
3513 var missing []string
3514 for _, expected := range files {
3515 if !filesMatched[expected] {
3516 missing = append(missing, expected)
3517 }
3518 }
3519 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003520 t.Log("missing files", missing)
3521 failed = true
3522 }
3523 if failed {
3524 t.Fail()
3525 }
3526}
3527
Jooyung Han344d5432019-08-23 11:17:39 +09003528func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003529 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003530 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003531 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003532 "etc/llndk.libraries.29.txt",
3533 "etc/vndkcore.libraries.29.txt",
3534 "etc/vndksp.libraries.29.txt",
3535 "etc/vndkprivate.libraries.29.txt",
3536 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003537 }
3538 testCases := []struct {
3539 vndkVersion string
3540 expectedFiles []string
3541 }{
3542 {
3543 vndkVersion: "current",
3544 expectedFiles: append(commonFiles,
3545 "lib/libvndk.so",
3546 "lib/libvndksp.so",
3547 "lib64/libvndk.so",
3548 "lib64/libvndksp.so"),
3549 },
3550 {
3551 vndkVersion: "",
3552 expectedFiles: append(commonFiles,
3553 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3554 "lib/libvndksp.so",
3555 "lib64/libvndksp.so"),
3556 },
3557 }
3558 for _, tc := range testCases {
3559 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3560 ctx := testApex(t, `
3561 apex_vndk {
3562 name: "com.android.vndk.current",
3563 key: "com.android.vndk.current.key",
3564 updatable: false,
3565 }
3566
3567 apex_key {
3568 name: "com.android.vndk.current.key",
3569 public_key: "testkey.avbpubkey",
3570 private_key: "testkey.pem",
3571 }
3572
3573 cc_library {
3574 name: "libvndk",
3575 srcs: ["mylib.cpp"],
3576 vendor_available: true,
3577 product_available: true,
3578 vndk: {
3579 enabled: true,
3580 },
3581 system_shared_libs: [],
3582 stl: "none",
3583 apex_available: [ "com.android.vndk.current" ],
3584 }
3585
3586 cc_library {
3587 name: "libvndksp",
3588 srcs: ["mylib.cpp"],
3589 vendor_available: true,
3590 product_available: true,
3591 vndk: {
3592 enabled: true,
3593 support_system_process: true,
3594 },
3595 system_shared_libs: [],
3596 stl: "none",
3597 apex_available: [ "com.android.vndk.current" ],
3598 }
3599
3600 // VNDK-Ext should not cause any problems
3601
3602 cc_library {
3603 name: "libvndk.ext",
3604 srcs: ["mylib2.cpp"],
3605 vendor: true,
3606 vndk: {
3607 enabled: true,
3608 extends: "libvndk",
3609 },
3610 system_shared_libs: [],
3611 stl: "none",
3612 }
3613
3614 cc_library {
3615 name: "libvndksp.ext",
3616 srcs: ["mylib2.cpp"],
3617 vendor: true,
3618 vndk: {
3619 enabled: true,
3620 support_system_process: true,
3621 extends: "libvndksp",
3622 },
3623 system_shared_libs: [],
3624 stl: "none",
3625 }
3626 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3627 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3628 }))
3629 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3630 })
3631 }
Jooyung Han344d5432019-08-23 11:17:39 +09003632}
3633
3634func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003635 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003636 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003637 name: "com.android.vndk.current",
3638 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003639 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003640 }
3641
3642 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003643 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003644 public_key: "testkey.avbpubkey",
3645 private_key: "testkey.pem",
3646 }
3647
3648 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003649 name: "libvndk",
3650 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003651 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003652 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003653 vndk: {
3654 enabled: true,
3655 },
3656 system_shared_libs: [],
3657 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003658 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003659 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003660
3661 cc_prebuilt_library_shared {
3662 name: "libvndk.arm",
3663 srcs: ["libvndk.arm.so"],
3664 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003665 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003666 vndk: {
3667 enabled: true,
3668 },
3669 enabled: false,
3670 arch: {
3671 arm: {
3672 enabled: true,
3673 },
3674 },
3675 system_shared_libs: [],
3676 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003677 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003678 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003679 `+vndkLibrariesTxtFiles("current"),
3680 withFiles(map[string][]byte{
3681 "libvndk.so": nil,
3682 "libvndk.arm.so": nil,
3683 }))
Colin Cross2807f002021-03-02 10:15:29 -08003684 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003685 "lib/libvndk.so",
3686 "lib/libvndk.arm.so",
3687 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003688 "lib/libc++.so",
3689 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003690 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003691 })
Jooyung Han344d5432019-08-23 11:17:39 +09003692}
3693
Jooyung Han39edb6c2019-11-06 16:53:07 +09003694func vndkLibrariesTxtFiles(vers ...string) (result string) {
3695 for _, v := range vers {
3696 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003697 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003698 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003699 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003700 name: "` + txt + `.libraries.txt",
3701 }
3702 `
3703 }
3704 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003705 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003706 result += `
3707 prebuilt_etc {
3708 name: "` + txt + `.libraries.` + v + `.txt",
3709 src: "dummy.txt",
3710 }
3711 `
3712 }
3713 }
3714 }
3715 return
3716}
3717
Jooyung Han344d5432019-08-23 11:17:39 +09003718func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003719 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003720 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003721 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003722 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003723 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003724 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003725 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003726 }
3727
3728 apex_key {
3729 name: "myapex.key",
3730 public_key: "testkey.avbpubkey",
3731 private_key: "testkey.pem",
3732 }
3733
Jooyung Han31c470b2019-10-18 16:26:59 +09003734 vndk_prebuilt_shared {
3735 name: "libvndk27",
3736 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003737 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003738 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003739 vndk: {
3740 enabled: true,
3741 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003742 target_arch: "arm64",
3743 arch: {
3744 arm: {
3745 srcs: ["libvndk27_arm.so"],
3746 },
3747 arm64: {
3748 srcs: ["libvndk27_arm64.so"],
3749 },
3750 },
Colin Cross2807f002021-03-02 10:15:29 -08003751 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003752 }
3753
3754 vndk_prebuilt_shared {
3755 name: "libvndk27",
3756 version: "27",
3757 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003758 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003759 vndk: {
3760 enabled: true,
3761 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003762 target_arch: "x86_64",
3763 arch: {
3764 x86: {
3765 srcs: ["libvndk27_x86.so"],
3766 },
3767 x86_64: {
3768 srcs: ["libvndk27_x86_64.so"],
3769 },
3770 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003771 }
3772 `+vndkLibrariesTxtFiles("27"),
3773 withFiles(map[string][]byte{
3774 "libvndk27_arm.so": nil,
3775 "libvndk27_arm64.so": nil,
3776 "libvndk27_x86.so": nil,
3777 "libvndk27_x86_64.so": nil,
3778 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003779
Colin Cross2807f002021-03-02 10:15:29 -08003780 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003781 "lib/libvndk27_arm.so",
3782 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003783 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003784 })
Jooyung Han344d5432019-08-23 11:17:39 +09003785}
3786
Jooyung Han90eee022019-10-01 20:02:42 +09003787func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003788 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003789 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003790 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003791 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003792 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003793 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003794 }
3795 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003796 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003797 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003798 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003799 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003800 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003801 }
3802 apex_key {
3803 name: "myapex.key",
3804 public_key: "testkey.avbpubkey",
3805 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003806 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003807
3808 assertApexName := func(expected, moduleName string) {
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09003809 module := ctx.ModuleForTests(moduleName, "android_common_image")
3810 apexManifestRule := module.Rule("apexManifestRule")
3811 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09003812 }
3813
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003814 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003815 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003816}
3817
Jooyung Han344d5432019-08-23 11:17:39 +09003818func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003819 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003820 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003821 name: "com.android.vndk.current",
3822 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003823 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003824 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003825 }
3826
3827 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003828 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003829 public_key: "testkey.avbpubkey",
3830 private_key: "testkey.pem",
3831 }
3832
3833 cc_library {
3834 name: "libvndk",
3835 srcs: ["mylib.cpp"],
3836 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003837 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003838 native_bridge_supported: true,
3839 host_supported: true,
3840 vndk: {
3841 enabled: true,
3842 },
3843 system_shared_libs: [],
3844 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003845 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003846 }
Colin Cross2807f002021-03-02 10:15:29 -08003847 `+vndkLibrariesTxtFiles("current"),
3848 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003849
Colin Cross2807f002021-03-02 10:15:29 -08003850 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003851 "lib/libvndk.so",
3852 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003853 "lib/libc++.so",
3854 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003855 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003856 })
Jooyung Han344d5432019-08-23 11:17:39 +09003857}
3858
3859func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003860 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003861 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003862 name: "com.android.vndk.current",
3863 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003864 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003865 native_bridge_supported: true,
3866 }
3867
3868 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003869 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003870 public_key: "testkey.avbpubkey",
3871 private_key: "testkey.pem",
3872 }
3873
3874 cc_library {
3875 name: "libvndk",
3876 srcs: ["mylib.cpp"],
3877 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003878 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003879 native_bridge_supported: true,
3880 host_supported: true,
3881 vndk: {
3882 enabled: true,
3883 },
3884 system_shared_libs: [],
3885 stl: "none",
3886 }
3887 `)
3888}
3889
Jooyung Han31c470b2019-10-18 16:26:59 +09003890func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003891 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003892 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003893 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003894 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003895 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003896 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003897 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003898 }
3899
3900 apex_key {
3901 name: "myapex.key",
3902 public_key: "testkey.avbpubkey",
3903 private_key: "testkey.pem",
3904 }
3905
3906 vndk_prebuilt_shared {
3907 name: "libvndk27",
3908 version: "27",
3909 target_arch: "arm",
3910 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003911 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003912 vndk: {
3913 enabled: true,
3914 },
3915 arch: {
3916 arm: {
3917 srcs: ["libvndk27.so"],
3918 }
3919 },
3920 }
3921
3922 vndk_prebuilt_shared {
3923 name: "libvndk27",
3924 version: "27",
3925 target_arch: "arm",
3926 binder32bit: true,
3927 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003928 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003929 vndk: {
3930 enabled: true,
3931 },
3932 arch: {
3933 arm: {
3934 srcs: ["libvndk27binder32.so"],
3935 }
3936 },
Colin Cross2807f002021-03-02 10:15:29 -08003937 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003938 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003939 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003940 withFiles(map[string][]byte{
3941 "libvndk27.so": nil,
3942 "libvndk27binder32.so": nil,
3943 }),
3944 withBinder32bit,
3945 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003946 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003947 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3948 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003949 },
3950 }),
3951 )
3952
Colin Cross2807f002021-03-02 10:15:29 -08003953 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003954 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003955 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003956 })
3957}
3958
Jooyung Han45a96772020-06-15 14:59:42 +09003959func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003960 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003961 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003962 name: "com.android.vndk.current",
3963 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003964 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003965 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003966 }
3967
3968 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003969 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003970 public_key: "testkey.avbpubkey",
3971 private_key: "testkey.pem",
3972 }
3973
3974 cc_library {
3975 name: "libz",
3976 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003977 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003978 vndk: {
3979 enabled: true,
3980 },
3981 stubs: {
3982 symbol_file: "libz.map.txt",
3983 versions: ["30"],
3984 }
3985 }
3986 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3987 "libz.map.txt": nil,
3988 }))
3989
Colin Cross2807f002021-03-02 10:15:29 -08003990 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003991 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3992 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09003993 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
3994 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
3995 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
3996 "*/*",
3997 })
Jooyung Han45a96772020-06-15 14:59:42 +09003998}
3999
Jooyung Hane1633032019-08-01 17:41:43 +09004000func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004001 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004002 apex {
4003 name: "myapex_nodep",
4004 key: "myapex.key",
4005 native_shared_libs: ["lib_nodep"],
4006 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004007 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004008 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004009 }
4010
4011 apex {
4012 name: "myapex_dep",
4013 key: "myapex.key",
4014 native_shared_libs: ["lib_dep"],
4015 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004016 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004017 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004018 }
4019
4020 apex {
4021 name: "myapex_provider",
4022 key: "myapex.key",
4023 native_shared_libs: ["libfoo"],
4024 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004025 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004026 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004027 }
4028
4029 apex {
4030 name: "myapex_selfcontained",
4031 key: "myapex.key",
4032 native_shared_libs: ["lib_dep", "libfoo"],
4033 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004034 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004035 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004036 }
4037
4038 apex_key {
4039 name: "myapex.key",
4040 public_key: "testkey.avbpubkey",
4041 private_key: "testkey.pem",
4042 }
4043
4044 cc_library {
4045 name: "lib_nodep",
4046 srcs: ["mylib.cpp"],
4047 system_shared_libs: [],
4048 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004049 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004050 }
4051
4052 cc_library {
4053 name: "lib_dep",
4054 srcs: ["mylib.cpp"],
4055 shared_libs: ["libfoo"],
4056 system_shared_libs: [],
4057 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004058 apex_available: [
4059 "myapex_dep",
4060 "myapex_provider",
4061 "myapex_selfcontained",
4062 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004063 }
4064
4065 cc_library {
4066 name: "libfoo",
4067 srcs: ["mytest.cpp"],
4068 stubs: {
4069 versions: ["1"],
4070 },
4071 system_shared_libs: [],
4072 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004073 apex_available: [
4074 "myapex_provider",
4075 "myapex_selfcontained",
4076 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004077 }
4078 `)
4079
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004080 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004081 var provideNativeLibs, requireNativeLibs []string
4082
Sundong Ahnabb64432019-10-22 13:58:29 +09004083 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004084 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4085 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004086 ensureListEmpty(t, provideNativeLibs)
4087 ensureListEmpty(t, requireNativeLibs)
4088
Sundong Ahnabb64432019-10-22 13:58:29 +09004089 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004090 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4091 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004092 ensureListEmpty(t, provideNativeLibs)
4093 ensureListContains(t, requireNativeLibs, "libfoo.so")
4094
Sundong Ahnabb64432019-10-22 13:58:29 +09004095 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004096 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4097 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004098 ensureListContains(t, provideNativeLibs, "libfoo.so")
4099 ensureListEmpty(t, requireNativeLibs)
4100
Sundong Ahnabb64432019-10-22 13:58:29 +09004101 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004102 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4103 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004104 ensureListContains(t, provideNativeLibs, "libfoo.so")
4105 ensureListEmpty(t, requireNativeLibs)
4106}
4107
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004108func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4109 ctx := testApex(t, `
4110 apex {
4111 name: "myapex",
4112 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004113 native_shared_libs: ["mylib"],
4114 updatable: false,
4115 }
4116
4117 apex_key {
4118 name: "myapex.key",
4119 public_key: "testkey.avbpubkey",
4120 private_key: "testkey.pem",
4121 }
4122
4123 cc_library {
4124 name: "mylib",
4125 srcs: ["mylib.cpp"],
4126 system_shared_libs: [],
4127 stl: "none",
4128 apex_available: [
4129 "//apex_available:platform",
4130 "myapex",
4131 ],
4132 }
4133 `, android.FixtureMergeEnv(map[string]string{
4134 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4135 }))
4136
Jooyung Han63dff462023-02-09 00:11:27 +00004137 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004138 apexManifestRule := module.Rule("apexManifestRule")
4139 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4140}
4141
Vinh Tran8f5310f2022-10-07 18:16:47 -04004142func TestCompileMultilibProp(t *testing.T) {
4143 testCases := []struct {
4144 compileMultiLibProp string
4145 containedLibs []string
4146 notContainedLibs []string
4147 }{
4148 {
4149 containedLibs: []string{
4150 "image.apex/lib64/mylib.so",
4151 "image.apex/lib/mylib.so",
4152 },
4153 compileMultiLibProp: `compile_multilib: "both",`,
4154 },
4155 {
4156 containedLibs: []string{"image.apex/lib64/mylib.so"},
4157 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4158 compileMultiLibProp: `compile_multilib: "first",`,
4159 },
4160 {
4161 containedLibs: []string{"image.apex/lib64/mylib.so"},
4162 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4163 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4164 },
4165 {
4166 containedLibs: []string{"image.apex/lib64/mylib.so"},
4167 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4168 compileMultiLibProp: `compile_multilib: "64",`,
4169 },
4170 {
4171 containedLibs: []string{"image.apex/lib/mylib.so"},
4172 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4173 compileMultiLibProp: `compile_multilib: "32",`,
4174 },
4175 }
4176 for _, testCase := range testCases {
4177 ctx := testApex(t, fmt.Sprintf(`
4178 apex {
4179 name: "myapex",
4180 key: "myapex.key",
4181 %s
4182 native_shared_libs: ["mylib"],
4183 updatable: false,
4184 }
4185 apex_key {
4186 name: "myapex.key",
4187 public_key: "testkey.avbpubkey",
4188 private_key: "testkey.pem",
4189 }
4190 cc_library {
4191 name: "mylib",
4192 srcs: ["mylib.cpp"],
4193 apex_available: [
4194 "//apex_available:platform",
4195 "myapex",
4196 ],
4197 }
4198 `, testCase.compileMultiLibProp),
4199 )
4200 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4201 apexRule := module.Rule("apexRule")
4202 copyCmds := apexRule.Args["copy_commands"]
4203 for _, containedLib := range testCase.containedLibs {
4204 ensureContains(t, copyCmds, containedLib)
4205 }
4206 for _, notContainedLib := range testCase.notContainedLibs {
4207 ensureNotContains(t, copyCmds, notContainedLib)
4208 }
4209 }
4210}
4211
Alex Light0851b882019-02-07 13:20:53 -08004212func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004213 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004214 apex {
4215 name: "myapex",
4216 key: "myapex.key",
4217 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004218 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004219 }
4220
4221 apex_key {
4222 name: "myapex.key",
4223 public_key: "testkey.avbpubkey",
4224 private_key: "testkey.pem",
4225 }
4226
4227 cc_library {
4228 name: "mylib_common",
4229 srcs: ["mylib.cpp"],
4230 system_shared_libs: [],
4231 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004232 apex_available: [
4233 "//apex_available:platform",
4234 "myapex",
4235 ],
Alex Light0851b882019-02-07 13:20:53 -08004236 }
4237 `)
4238
Sundong Ahnabb64432019-10-22 13:58:29 +09004239 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004240 apexRule := module.Rule("apexRule")
4241 copyCmds := apexRule.Args["copy_commands"]
4242
4243 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4244 t.Log("Apex was a test apex!")
4245 t.Fail()
4246 }
4247 // Ensure that main rule creates an output
4248 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4249
4250 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004251 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004252
4253 // Ensure that both direct and indirect deps are copied into apex
4254 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4255
Colin Cross7113d202019-11-20 16:39:12 -08004256 // Ensure that the platform variant ends with _shared
4257 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004258
Colin Cross56a83212020-09-15 18:30:11 -07004259 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004260 t.Log("Found mylib_common not in any apex!")
4261 t.Fail()
4262 }
4263}
4264
4265func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004266 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004267 apex_test {
4268 name: "myapex",
4269 key: "myapex.key",
4270 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004271 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004272 }
4273
4274 apex_key {
4275 name: "myapex.key",
4276 public_key: "testkey.avbpubkey",
4277 private_key: "testkey.pem",
4278 }
4279
4280 cc_library {
4281 name: "mylib_common_test",
4282 srcs: ["mylib.cpp"],
4283 system_shared_libs: [],
4284 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004285 // TODO: remove //apex_available:platform
4286 apex_available: [
4287 "//apex_available:platform",
4288 "myapex",
4289 ],
Alex Light0851b882019-02-07 13:20:53 -08004290 }
4291 `)
4292
Sundong Ahnabb64432019-10-22 13:58:29 +09004293 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004294 apexRule := module.Rule("apexRule")
4295 copyCmds := apexRule.Args["copy_commands"]
4296
4297 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4298 t.Log("Apex was not a test apex!")
4299 t.Fail()
4300 }
4301 // Ensure that main rule creates an output
4302 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4303
4304 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004305 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004306
4307 // Ensure that both direct and indirect deps are copied into apex
4308 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4309
Colin Cross7113d202019-11-20 16:39:12 -08004310 // Ensure that the platform variant ends with _shared
4311 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004312}
4313
Alex Light9670d332019-01-29 18:07:33 -08004314func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004315 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004316 apex {
4317 name: "myapex",
4318 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004319 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004320 multilib: {
4321 first: {
4322 native_shared_libs: ["mylib_common"],
4323 }
4324 },
4325 target: {
4326 android: {
4327 multilib: {
4328 first: {
4329 native_shared_libs: ["mylib"],
4330 }
4331 }
4332 },
4333 host: {
4334 multilib: {
4335 first: {
4336 native_shared_libs: ["mylib2"],
4337 }
4338 }
4339 }
4340 }
4341 }
4342
4343 apex_key {
4344 name: "myapex.key",
4345 public_key: "testkey.avbpubkey",
4346 private_key: "testkey.pem",
4347 }
4348
4349 cc_library {
4350 name: "mylib",
4351 srcs: ["mylib.cpp"],
4352 system_shared_libs: [],
4353 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004354 // TODO: remove //apex_available:platform
4355 apex_available: [
4356 "//apex_available:platform",
4357 "myapex",
4358 ],
Alex Light9670d332019-01-29 18:07:33 -08004359 }
4360
4361 cc_library {
4362 name: "mylib_common",
4363 srcs: ["mylib.cpp"],
4364 system_shared_libs: [],
4365 stl: "none",
4366 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004367 // TODO: remove //apex_available:platform
4368 apex_available: [
4369 "//apex_available:platform",
4370 "myapex",
4371 ],
Alex Light9670d332019-01-29 18:07:33 -08004372 }
4373
4374 cc_library {
4375 name: "mylib2",
4376 srcs: ["mylib.cpp"],
4377 system_shared_libs: [],
4378 stl: "none",
4379 compile_multilib: "first",
4380 }
4381 `)
4382
Sundong Ahnabb64432019-10-22 13:58:29 +09004383 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004384 copyCmds := apexRule.Args["copy_commands"]
4385
4386 // Ensure that main rule creates an output
4387 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4388
4389 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004390 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4391 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4392 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004393
4394 // Ensure that both direct and indirect deps are copied into apex
4395 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4396 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4397 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4398
Colin Cross7113d202019-11-20 16:39:12 -08004399 // Ensure that the platform variant ends with _shared
4400 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4401 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4402 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004403}
Jiyong Park04480cf2019-02-06 00:16:29 +09004404
Jiyong Park59140302020-12-14 18:44:04 +09004405func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004406 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004407 apex {
4408 name: "myapex",
4409 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004410 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004411 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004412 arch: {
4413 arm64: {
4414 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004415 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004416 },
4417 x86_64: {
4418 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004419 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004420 },
4421 }
4422 }
4423
4424 apex_key {
4425 name: "myapex.key",
4426 public_key: "testkey.avbpubkey",
4427 private_key: "testkey.pem",
4428 }
4429
4430 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004431 name: "mylib.generic",
4432 srcs: ["mylib.cpp"],
4433 system_shared_libs: [],
4434 stl: "none",
4435 // TODO: remove //apex_available:platform
4436 apex_available: [
4437 "//apex_available:platform",
4438 "myapex",
4439 ],
4440 }
4441
4442 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004443 name: "mylib.arm64",
4444 srcs: ["mylib.cpp"],
4445 system_shared_libs: [],
4446 stl: "none",
4447 // TODO: remove //apex_available:platform
4448 apex_available: [
4449 "//apex_available:platform",
4450 "myapex",
4451 ],
4452 }
4453
4454 cc_library {
4455 name: "mylib.x64",
4456 srcs: ["mylib.cpp"],
4457 system_shared_libs: [],
4458 stl: "none",
4459 // TODO: remove //apex_available:platform
4460 apex_available: [
4461 "//apex_available:platform",
4462 "myapex",
4463 ],
4464 }
4465 `)
4466
4467 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4468 copyCmds := apexRule.Args["copy_commands"]
4469
4470 // Ensure that apex variant is created for the direct dep
4471 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004472 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004473 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4474
4475 // Ensure that both direct and indirect deps are copied into apex
4476 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4477 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4478}
4479
Jiyong Park04480cf2019-02-06 00:16:29 +09004480func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004481 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004482 apex {
4483 name: "myapex",
4484 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004485 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004486 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004487 }
4488
4489 apex_key {
4490 name: "myapex.key",
4491 public_key: "testkey.avbpubkey",
4492 private_key: "testkey.pem",
4493 }
4494
4495 sh_binary {
4496 name: "myscript",
4497 src: "mylib.cpp",
4498 filename: "myscript.sh",
4499 sub_dir: "script",
4500 }
4501 `)
4502
Sundong Ahnabb64432019-10-22 13:58:29 +09004503 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004504 copyCmds := apexRule.Args["copy_commands"]
4505
4506 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4507}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004508
Jooyung Han91df2082019-11-20 01:49:42 +09004509func TestApexInVariousPartition(t *testing.T) {
4510 testcases := []struct {
4511 propName, parition, flattenedPartition string
4512 }{
4513 {"", "system", "system_ext"},
4514 {"product_specific: true", "product", "product"},
4515 {"soc_specific: true", "vendor", "vendor"},
4516 {"proprietary: true", "vendor", "vendor"},
4517 {"vendor: true", "vendor", "vendor"},
4518 {"system_ext_specific: true", "system_ext", "system_ext"},
4519 }
4520 for _, tc := range testcases {
4521 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004522 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004523 apex {
4524 name: "myapex",
4525 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004526 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004527 `+tc.propName+`
4528 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004529
Jooyung Han91df2082019-11-20 01:49:42 +09004530 apex_key {
4531 name: "myapex.key",
4532 public_key: "testkey.avbpubkey",
4533 private_key: "testkey.pem",
4534 }
4535 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004536
Jooyung Han91df2082019-11-20 01:49:42 +09004537 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004538 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4539 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004540 if actual != expected {
4541 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4542 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004543
Jooyung Han91df2082019-11-20 01:49:42 +09004544 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004545 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4546 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004547 if actual != expected {
4548 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4549 }
4550 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004551 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004552}
Jiyong Park67882562019-03-21 01:11:21 +09004553
Jooyung Han580eb4f2020-06-24 19:33:06 +09004554func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004555 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004556 apex {
4557 name: "myapex",
4558 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004559 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004560 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004561
Jooyung Han580eb4f2020-06-24 19:33:06 +09004562 apex_key {
4563 name: "myapex.key",
4564 public_key: "testkey.avbpubkey",
4565 private_key: "testkey.pem",
4566 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004567 `)
4568 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004569 rule := module.Output("file_contexts")
4570 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4571}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004572
Jooyung Han580eb4f2020-06-24 19:33:06 +09004573func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004574 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004575 apex {
4576 name: "myapex",
4577 key: "myapex.key",
4578 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004579 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004580 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004581
Jooyung Han580eb4f2020-06-24 19:33:06 +09004582 apex_key {
4583 name: "myapex.key",
4584 public_key: "testkey.avbpubkey",
4585 private_key: "testkey.pem",
4586 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004587 `, withFiles(map[string][]byte{
4588 "my_own_file_contexts": nil,
4589 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004590}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004591
Jooyung Han580eb4f2020-06-24 19:33:06 +09004592func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004593 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004594 apex {
4595 name: "myapex",
4596 key: "myapex.key",
4597 product_specific: true,
4598 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004599 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004600 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004601
Jooyung Han580eb4f2020-06-24 19:33:06 +09004602 apex_key {
4603 name: "myapex.key",
4604 public_key: "testkey.avbpubkey",
4605 private_key: "testkey.pem",
4606 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004607 `)
4608
Colin Cross1c460562021-02-16 17:55:47 -08004609 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004610 apex {
4611 name: "myapex",
4612 key: "myapex.key",
4613 product_specific: true,
4614 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004615 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004616 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004617
Jooyung Han580eb4f2020-06-24 19:33:06 +09004618 apex_key {
4619 name: "myapex.key",
4620 public_key: "testkey.avbpubkey",
4621 private_key: "testkey.pem",
4622 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004623 `, withFiles(map[string][]byte{
4624 "product_specific_file_contexts": nil,
4625 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004626 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4627 rule := module.Output("file_contexts")
4628 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4629}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004630
Jooyung Han580eb4f2020-06-24 19:33:06 +09004631func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004632 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004633 apex {
4634 name: "myapex",
4635 key: "myapex.key",
4636 product_specific: true,
4637 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004638 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004639 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004640
Jooyung Han580eb4f2020-06-24 19:33:06 +09004641 apex_key {
4642 name: "myapex.key",
4643 public_key: "testkey.avbpubkey",
4644 private_key: "testkey.pem",
4645 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004646
Jooyung Han580eb4f2020-06-24 19:33:06 +09004647 filegroup {
4648 name: "my-file-contexts",
4649 srcs: ["product_specific_file_contexts"],
4650 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004651 `, withFiles(map[string][]byte{
4652 "product_specific_file_contexts": nil,
4653 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004654 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4655 rule := module.Output("file_contexts")
4656 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004657}
4658
Jiyong Park67882562019-03-21 01:11:21 +09004659func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004660 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004661 apex_key {
4662 name: "myapex.key",
4663 public_key: ":my.avbpubkey",
4664 private_key: ":my.pem",
4665 product_specific: true,
4666 }
4667
4668 filegroup {
4669 name: "my.avbpubkey",
4670 srcs: ["testkey2.avbpubkey"],
4671 }
4672
4673 filegroup {
4674 name: "my.pem",
4675 srcs: ["testkey2.pem"],
4676 }
4677 `)
4678
4679 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4680 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004681 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004682 if actual_pubkey != expected_pubkey {
4683 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4684 }
4685 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004686 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004687 if actual_privkey != expected_privkey {
4688 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4689 }
4690}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004691
4692func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004693 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004694 prebuilt_apex {
4695 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004696 arch: {
4697 arm64: {
4698 src: "myapex-arm64.apex",
4699 },
4700 arm: {
4701 src: "myapex-arm.apex",
4702 },
4703 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004704 }
4705 `)
4706
Wei Li340ee8e2022-03-18 17:33:24 -07004707 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4708 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004709
Jiyong Parkc95714e2019-03-29 14:23:10 +09004710 expectedInput := "myapex-arm64.apex"
4711 if prebuilt.inputApex.String() != expectedInput {
4712 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4713 }
Wei Li340ee8e2022-03-18 17:33:24 -07004714 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4715 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4716 rule := testingModule.Rule("genProvenanceMetaData")
4717 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4718 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4719 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4720 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004721}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004722
Paul Duffinc0609c62021-03-01 17:27:16 +00004723func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004724 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004725 prebuilt_apex {
4726 name: "myapex",
4727 }
4728 `)
4729}
4730
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004731func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004732 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004733 prebuilt_apex {
4734 name: "myapex",
4735 src: "myapex-arm.apex",
4736 filename: "notmyapex.apex",
4737 }
4738 `)
4739
Wei Li340ee8e2022-03-18 17:33:24 -07004740 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4741 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004742
4743 expected := "notmyapex.apex"
4744 if p.installFilename != expected {
4745 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4746 }
Wei Li340ee8e2022-03-18 17:33:24 -07004747 rule := testingModule.Rule("genProvenanceMetaData")
4748 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4749 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4750 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4751 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004752}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004753
Samiul Islam7c02e262021-09-08 17:48:28 +01004754func TestApexSetFilenameOverride(t *testing.T) {
4755 testApex(t, `
4756 apex_set {
4757 name: "com.company.android.myapex",
4758 apex_name: "com.android.myapex",
4759 set: "company-myapex.apks",
4760 filename: "com.company.android.myapex.apex"
4761 }
4762 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4763
4764 testApex(t, `
4765 apex_set {
4766 name: "com.company.android.myapex",
4767 apex_name: "com.android.myapex",
4768 set: "company-myapex.apks",
4769 filename: "com.company.android.myapex.capex"
4770 }
4771 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4772
4773 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4774 apex_set {
4775 name: "com.company.android.myapex",
4776 apex_name: "com.android.myapex",
4777 set: "company-myapex.apks",
4778 filename: "some-random-suffix"
4779 }
4780 `)
4781}
4782
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004783func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004784 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004785 prebuilt_apex {
4786 name: "myapex.prebuilt",
4787 src: "myapex-arm.apex",
4788 overrides: [
4789 "myapex",
4790 ],
4791 }
4792 `)
4793
Wei Li340ee8e2022-03-18 17:33:24 -07004794 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4795 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004796
4797 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004798 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004799 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004800 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004801 }
Wei Li340ee8e2022-03-18 17:33:24 -07004802 rule := testingModule.Rule("genProvenanceMetaData")
4803 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4804 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4805 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4806 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004807}
4808
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004809func TestPrebuiltApexName(t *testing.T) {
4810 testApex(t, `
4811 prebuilt_apex {
4812 name: "com.company.android.myapex",
4813 apex_name: "com.android.myapex",
4814 src: "company-myapex-arm.apex",
4815 }
4816 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4817
4818 testApex(t, `
4819 apex_set {
4820 name: "com.company.android.myapex",
4821 apex_name: "com.android.myapex",
4822 set: "company-myapex.apks",
4823 }
4824 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4825}
4826
4827func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4828 _ = android.GroupFixturePreparers(
4829 java.PrepareForTestWithJavaDefaultModules,
4830 PrepareForTestWithApexBuildComponents,
4831 android.FixtureWithRootAndroidBp(`
4832 platform_bootclasspath {
4833 name: "platform-bootclasspath",
4834 fragments: [
4835 {
4836 apex: "com.android.art",
4837 module: "art-bootclasspath-fragment",
4838 },
4839 ],
4840 }
4841
4842 prebuilt_apex {
4843 name: "com.company.android.art",
4844 apex_name: "com.android.art",
4845 src: "com.company.android.art-arm.apex",
4846 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4847 }
4848
4849 prebuilt_bootclasspath_fragment {
4850 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004851 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004852 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004853 hidden_api: {
4854 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4855 metadata: "my-bootclasspath-fragment/metadata.csv",
4856 index: "my-bootclasspath-fragment/index.csv",
4857 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4858 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4859 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004860 }
4861
4862 java_import {
4863 name: "core-oj",
4864 jars: ["prebuilt.jar"],
4865 }
4866 `),
4867 ).RunTest(t)
4868}
4869
Paul Duffin092153d2021-01-26 11:42:39 +00004870// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4871// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004872func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004873 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004874
Paul Duffin89886cb2021-02-05 16:44:03 +00004875 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004876 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004877 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004878 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004879 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004880 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004881 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4882 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4883 android.NormalizePathForTesting(dexJarBuildPath))
4884 }
4885
4886 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004887 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004888 // Make sure the import has been given the correct path to the dex jar.
4889 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4890 dexJarBuildPath := p.DexJarInstallPath()
4891 stem := android.RemoveOptionalPrebuiltPrefix(name)
4892 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4893 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4894 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004895 }
4896
Paul Duffin39853512021-02-26 11:09:39 +00004897 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004898 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004899 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004900 android.AssertArrayString(t, "Check if there is no source variant",
4901 []string{"android_common"},
4902 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004903 }
4904
4905 t.Run("prebuilt only", func(t *testing.T) {
4906 bp := `
4907 prebuilt_apex {
4908 name: "myapex",
4909 arch: {
4910 arm64: {
4911 src: "myapex-arm64.apex",
4912 },
4913 arm: {
4914 src: "myapex-arm.apex",
4915 },
4916 },
Paul Duffin39853512021-02-26 11:09:39 +00004917 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004918 }
4919
4920 java_import {
4921 name: "libfoo",
4922 jars: ["libfoo.jar"],
4923 }
Paul Duffin39853512021-02-26 11:09:39 +00004924
4925 java_sdk_library_import {
4926 name: "libbar",
4927 public: {
4928 jars: ["libbar.jar"],
4929 },
4930 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004931 `
4932
4933 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4934 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4935
Martin Stjernholm44825602021-09-17 01:44:12 +01004936 deapexerName := deapexerModuleName("myapex")
4937 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4938
Paul Duffinf6932af2021-02-26 18:21:56 +00004939 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004940 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004941 rule := deapexer.Rule("deapexer")
4942 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4943 t.Errorf("expected: %q, found: %q", expected, actual)
4944 }
4945
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004946 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004947 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004948 rule = prebuiltApex.Rule("android/soong/android.Cp")
4949 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4950 t.Errorf("expected: %q, found: %q", expected, actual)
4951 }
4952
Paul Duffin89886cb2021-02-05 16:44:03 +00004953 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004954 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004955
4956 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004957 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004958 })
4959
4960 t.Run("prebuilt with source preferred", func(t *testing.T) {
4961
4962 bp := `
4963 prebuilt_apex {
4964 name: "myapex",
4965 arch: {
4966 arm64: {
4967 src: "myapex-arm64.apex",
4968 },
4969 arm: {
4970 src: "myapex-arm.apex",
4971 },
4972 },
Paul Duffin39853512021-02-26 11:09:39 +00004973 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004974 }
4975
4976 java_import {
4977 name: "libfoo",
4978 jars: ["libfoo.jar"],
4979 }
4980
4981 java_library {
4982 name: "libfoo",
4983 }
Paul Duffin39853512021-02-26 11:09:39 +00004984
4985 java_sdk_library_import {
4986 name: "libbar",
4987 public: {
4988 jars: ["libbar.jar"],
4989 },
4990 }
4991
4992 java_sdk_library {
4993 name: "libbar",
4994 srcs: ["foo/bar/MyClass.java"],
4995 unsafe_ignore_missing_latest_api: true,
4996 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004997 `
4998
4999 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5000 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5001
Paul Duffin89886cb2021-02-05 16:44:03 +00005002 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005003 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005004 ensureNoSourceVariant(t, ctx, "libfoo")
5005
5006 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005007 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005008 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005009 })
5010
5011 t.Run("prebuilt preferred with source", func(t *testing.T) {
5012 bp := `
5013 prebuilt_apex {
5014 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005015 arch: {
5016 arm64: {
5017 src: "myapex-arm64.apex",
5018 },
5019 arm: {
5020 src: "myapex-arm.apex",
5021 },
5022 },
Paul Duffin39853512021-02-26 11:09:39 +00005023 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005024 }
5025
5026 java_import {
5027 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005028 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005029 jars: ["libfoo.jar"],
5030 }
5031
5032 java_library {
5033 name: "libfoo",
5034 }
Paul Duffin39853512021-02-26 11:09:39 +00005035
5036 java_sdk_library_import {
5037 name: "libbar",
5038 prefer: true,
5039 public: {
5040 jars: ["libbar.jar"],
5041 },
5042 }
5043
5044 java_sdk_library {
5045 name: "libbar",
5046 srcs: ["foo/bar/MyClass.java"],
5047 unsafe_ignore_missing_latest_api: true,
5048 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005049 `
5050
5051 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5052 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5053
Paul Duffin89886cb2021-02-05 16:44:03 +00005054 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005055 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005056 ensureNoSourceVariant(t, ctx, "libfoo")
5057
5058 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005059 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005060 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005061 })
5062}
5063
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005064func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005065 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005066 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005067 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5068 // is disabled.
5069 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5070 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005071
Paul Duffin37856732021-02-26 14:24:15 +00005072 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5073 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005074 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005075 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005076 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005077 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005078 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005079 foundLibfooJar = true
5080 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005081 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005082 }
5083 }
5084 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005085 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 +00005086 }
5087 }
5088
Paul Duffin40a3f652021-07-19 13:11:24 +01005089 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005090 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005091 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005092 var rule android.TestingBuildParams
5093
5094 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5095 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005096 }
5097
Paul Duffin40a3f652021-07-19 13:11:24 +01005098 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5099 t.Helper()
5100 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5101 var rule android.TestingBuildParams
5102
5103 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5104 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5105 }
5106
Paul Duffin89f570a2021-06-16 01:42:33 +01005107 fragment := java.ApexVariantReference{
5108 Apex: proptools.StringPtr("myapex"),
5109 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5110 }
5111
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005112 t.Run("prebuilt only", func(t *testing.T) {
5113 bp := `
5114 prebuilt_apex {
5115 name: "myapex",
5116 arch: {
5117 arm64: {
5118 src: "myapex-arm64.apex",
5119 },
5120 arm: {
5121 src: "myapex-arm.apex",
5122 },
5123 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005124 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5125 }
5126
5127 prebuilt_bootclasspath_fragment {
5128 name: "my-bootclasspath-fragment",
5129 contents: ["libfoo", "libbar"],
5130 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005131 hidden_api: {
5132 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5133 metadata: "my-bootclasspath-fragment/metadata.csv",
5134 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005135 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5136 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5137 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005138 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005139 }
5140
5141 java_import {
5142 name: "libfoo",
5143 jars: ["libfoo.jar"],
5144 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005145 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005146 }
Paul Duffin37856732021-02-26 14:24:15 +00005147
5148 java_sdk_library_import {
5149 name: "libbar",
5150 public: {
5151 jars: ["libbar.jar"],
5152 },
5153 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005154 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005155 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005156 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005157 `
5158
Paul Duffin89f570a2021-06-16 01:42:33 +01005159 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005160 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5161 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005162
Paul Duffin537ea3d2021-05-14 10:38:00 +01005163 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005164 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005165 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005166 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005167 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5168 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005169 })
5170
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005171 t.Run("apex_set only", func(t *testing.T) {
5172 bp := `
5173 apex_set {
5174 name: "myapex",
5175 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005176 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5177 }
5178
5179 prebuilt_bootclasspath_fragment {
5180 name: "my-bootclasspath-fragment",
5181 contents: ["libfoo", "libbar"],
5182 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005183 hidden_api: {
5184 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5185 metadata: "my-bootclasspath-fragment/metadata.csv",
5186 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005187 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5188 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5189 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005190 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005191 }
5192
5193 java_import {
5194 name: "libfoo",
5195 jars: ["libfoo.jar"],
5196 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005197 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005198 }
5199
5200 java_sdk_library_import {
5201 name: "libbar",
5202 public: {
5203 jars: ["libbar.jar"],
5204 },
5205 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005206 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005207 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005208 }
5209 `
5210
Paul Duffin89f570a2021-06-16 01:42:33 +01005211 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005212 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5213 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5214
Paul Duffin537ea3d2021-05-14 10:38:00 +01005215 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005216 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005217 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005218 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005219 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5220 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005221 })
5222
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005223 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5224 bp := `
5225 prebuilt_apex {
5226 name: "myapex",
5227 arch: {
5228 arm64: {
5229 src: "myapex-arm64.apex",
5230 },
5231 arm: {
5232 src: "myapex-arm.apex",
5233 },
5234 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005235 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5236 }
5237
5238 prebuilt_bootclasspath_fragment {
5239 name: "my-bootclasspath-fragment",
5240 contents: ["libfoo", "libbar"],
5241 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005242 hidden_api: {
5243 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5244 metadata: "my-bootclasspath-fragment/metadata.csv",
5245 index: "my-bootclasspath-fragment/index.csv",
5246 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5247 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5248 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005249 }
5250
5251 java_import {
5252 name: "libfoo",
5253 jars: ["libfoo.jar"],
5254 apex_available: ["myapex"],
5255 }
5256
5257 java_library {
5258 name: "libfoo",
5259 srcs: ["foo/bar/MyClass.java"],
5260 apex_available: ["myapex"],
5261 }
Paul Duffin37856732021-02-26 14:24:15 +00005262
5263 java_sdk_library_import {
5264 name: "libbar",
5265 public: {
5266 jars: ["libbar.jar"],
5267 },
5268 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005269 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005270 }
5271
5272 java_sdk_library {
5273 name: "libbar",
5274 srcs: ["foo/bar/MyClass.java"],
5275 unsafe_ignore_missing_latest_api: true,
5276 apex_available: ["myapex"],
5277 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005278 `
5279
5280 // In this test the source (java_library) libfoo is active since the
5281 // prebuilt (java_import) defaults to prefer:false. However the
5282 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5283 // find the dex boot jar in it. We either need to disable the source libfoo
5284 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005285 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005286 // dexbootjar check is skipped if AllowMissingDependencies is true
5287 preparerAllowMissingDeps := android.GroupFixturePreparers(
5288 preparer,
5289 android.PrepareForTestWithAllowMissingDependencies,
5290 )
5291 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005292 })
5293
5294 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5295 bp := `
5296 prebuilt_apex {
5297 name: "myapex",
5298 arch: {
5299 arm64: {
5300 src: "myapex-arm64.apex",
5301 },
5302 arm: {
5303 src: "myapex-arm.apex",
5304 },
5305 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005306 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5307 }
5308
5309 prebuilt_bootclasspath_fragment {
5310 name: "my-bootclasspath-fragment",
5311 contents: ["libfoo", "libbar"],
5312 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005313 hidden_api: {
5314 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5315 metadata: "my-bootclasspath-fragment/metadata.csv",
5316 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005317 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5318 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5319 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005320 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005321 }
5322
5323 java_import {
5324 name: "libfoo",
5325 prefer: true,
5326 jars: ["libfoo.jar"],
5327 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005328 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005329 }
5330
5331 java_library {
5332 name: "libfoo",
5333 srcs: ["foo/bar/MyClass.java"],
5334 apex_available: ["myapex"],
5335 }
Paul Duffin37856732021-02-26 14:24:15 +00005336
5337 java_sdk_library_import {
5338 name: "libbar",
5339 prefer: true,
5340 public: {
5341 jars: ["libbar.jar"],
5342 },
5343 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005344 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005345 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005346 }
5347
5348 java_sdk_library {
5349 name: "libbar",
5350 srcs: ["foo/bar/MyClass.java"],
5351 unsafe_ignore_missing_latest_api: true,
5352 apex_available: ["myapex"],
5353 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005354 `
5355
Paul Duffin89f570a2021-06-16 01:42:33 +01005356 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005357 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5358 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005359
Paul Duffin537ea3d2021-05-14 10:38:00 +01005360 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005361 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005362 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005363 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005364 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5365 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005366 })
5367
5368 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5369 bp := `
5370 apex {
5371 name: "myapex",
5372 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005373 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005374 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005375 }
5376
5377 apex_key {
5378 name: "myapex.key",
5379 public_key: "testkey.avbpubkey",
5380 private_key: "testkey.pem",
5381 }
5382
5383 prebuilt_apex {
5384 name: "myapex",
5385 arch: {
5386 arm64: {
5387 src: "myapex-arm64.apex",
5388 },
5389 arm: {
5390 src: "myapex-arm.apex",
5391 },
5392 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005393 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5394 }
5395
5396 prebuilt_bootclasspath_fragment {
5397 name: "my-bootclasspath-fragment",
5398 contents: ["libfoo", "libbar"],
5399 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005400 hidden_api: {
5401 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5402 metadata: "my-bootclasspath-fragment/metadata.csv",
5403 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005404 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5405 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5406 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005407 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005408 }
5409
5410 java_import {
5411 name: "libfoo",
5412 jars: ["libfoo.jar"],
5413 apex_available: ["myapex"],
5414 }
5415
5416 java_library {
5417 name: "libfoo",
5418 srcs: ["foo/bar/MyClass.java"],
5419 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005420 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005421 }
Paul Duffin37856732021-02-26 14:24:15 +00005422
5423 java_sdk_library_import {
5424 name: "libbar",
5425 public: {
5426 jars: ["libbar.jar"],
5427 },
5428 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005429 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005430 }
5431
5432 java_sdk_library {
5433 name: "libbar",
5434 srcs: ["foo/bar/MyClass.java"],
5435 unsafe_ignore_missing_latest_api: true,
5436 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005437 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005438 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005439 `
5440
Paul Duffin89f570a2021-06-16 01:42:33 +01005441 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005442 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5443 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005444
Paul Duffin537ea3d2021-05-14 10:38:00 +01005445 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005446 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005447 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005448 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005449 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5450 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005451 })
5452
5453 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5454 bp := `
5455 apex {
5456 name: "myapex",
5457 enabled: false,
5458 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005459 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005460 }
5461
5462 apex_key {
5463 name: "myapex.key",
5464 public_key: "testkey.avbpubkey",
5465 private_key: "testkey.pem",
5466 }
5467
5468 prebuilt_apex {
5469 name: "myapex",
5470 arch: {
5471 arm64: {
5472 src: "myapex-arm64.apex",
5473 },
5474 arm: {
5475 src: "myapex-arm.apex",
5476 },
5477 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005478 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5479 }
5480
5481 prebuilt_bootclasspath_fragment {
5482 name: "my-bootclasspath-fragment",
5483 contents: ["libfoo", "libbar"],
5484 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005485 hidden_api: {
5486 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5487 metadata: "my-bootclasspath-fragment/metadata.csv",
5488 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005489 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5490 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5491 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005492 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005493 }
5494
5495 java_import {
5496 name: "libfoo",
5497 prefer: true,
5498 jars: ["libfoo.jar"],
5499 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005500 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005501 }
5502
5503 java_library {
5504 name: "libfoo",
5505 srcs: ["foo/bar/MyClass.java"],
5506 apex_available: ["myapex"],
5507 }
Paul Duffin37856732021-02-26 14:24:15 +00005508
5509 java_sdk_library_import {
5510 name: "libbar",
5511 prefer: true,
5512 public: {
5513 jars: ["libbar.jar"],
5514 },
5515 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005516 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005517 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005518 }
5519
5520 java_sdk_library {
5521 name: "libbar",
5522 srcs: ["foo/bar/MyClass.java"],
5523 unsafe_ignore_missing_latest_api: true,
5524 apex_available: ["myapex"],
5525 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005526 `
5527
Paul Duffin89f570a2021-06-16 01:42:33 +01005528 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005529 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5530 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005531
Paul Duffin537ea3d2021-05-14 10:38:00 +01005532 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005533 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005534 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005535 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005536 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5537 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005538 })
5539}
5540
Roland Levillain630846d2019-06-26 12:48:34 +01005541func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005542 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005543 apex_test {
5544 name: "myapex",
5545 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005546 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005547 tests: [
5548 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005549 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005550 ],
5551 }
5552
5553 apex_key {
5554 name: "myapex.key",
5555 public_key: "testkey.avbpubkey",
5556 private_key: "testkey.pem",
5557 }
5558
Liz Kammer1c14a212020-05-12 15:26:55 -07005559 filegroup {
5560 name: "fg",
5561 srcs: [
5562 "baz",
5563 "bar/baz"
5564 ],
5565 }
5566
Roland Levillain630846d2019-06-26 12:48:34 +01005567 cc_test {
5568 name: "mytest",
5569 gtest: false,
5570 srcs: ["mytest.cpp"],
5571 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005572 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005573 system_shared_libs: [],
5574 static_executable: true,
5575 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005576 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005577 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005578
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005579 cc_library {
5580 name: "mylib",
5581 srcs: ["mylib.cpp"],
5582 system_shared_libs: [],
5583 stl: "none",
5584 }
5585
Liz Kammer5bd365f2020-05-27 15:15:11 -07005586 filegroup {
5587 name: "fg2",
5588 srcs: [
5589 "testdata/baz"
5590 ],
5591 }
5592
Roland Levillain9b5fde92019-06-28 15:41:19 +01005593 cc_test {
5594 name: "mytests",
5595 gtest: false,
5596 srcs: [
5597 "mytest1.cpp",
5598 "mytest2.cpp",
5599 "mytest3.cpp",
5600 ],
5601 test_per_src: true,
5602 relative_install_path: "test",
5603 system_shared_libs: [],
5604 static_executable: true,
5605 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005606 data: [
5607 ":fg",
5608 ":fg2",
5609 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005610 }
Roland Levillain630846d2019-06-26 12:48:34 +01005611 `)
5612
Sundong Ahnabb64432019-10-22 13:58:29 +09005613 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005614 copyCmds := apexRule.Args["copy_commands"]
5615
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005616 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005617 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005618 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005619
Liz Kammer1c14a212020-05-12 15:26:55 -07005620 //Ensure that test data are copied into apex.
5621 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5622 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5623
Roland Levillain9b5fde92019-06-28 15:41:19 +01005624 // Ensure that test deps built with `test_per_src` are copied into apex.
5625 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5626 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5627 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005628
5629 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005630 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005631 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005632 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005633 prefix := "TARGET_"
5634 var builder strings.Builder
5635 data.Custom(&builder, name, prefix, "", data)
5636 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005637 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5638 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5639 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5640 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
5641 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
5642 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005643 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005644
5645 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005646 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005647 data.Custom(&builder, name, prefix, "", data)
5648 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005649 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5650 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005651}
5652
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005653func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005654 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005655 apex {
5656 name: "myapex",
5657 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005658 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005659 }
5660 apex_key {
5661 name: "myapex.key",
5662 public_key: "testkey.avbpubkey",
5663 private_key: "testkey.pem",
5664 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005665 `,
5666 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5667 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5668 }),
5669 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005670 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00005671 ensureListContains(t, ab.makeModulesToInstall, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005672 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005673 var builder strings.Builder
5674 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5675 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005676 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex myapex.flattened\n")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005677}
5678
Jooyung Hand48f3c32019-08-23 11:18:57 +09005679func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5680 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5681 apex {
5682 name: "myapex",
5683 key: "myapex.key",
5684 native_shared_libs: ["libfoo"],
5685 }
5686
5687 apex_key {
5688 name: "myapex.key",
5689 public_key: "testkey.avbpubkey",
5690 private_key: "testkey.pem",
5691 }
5692
5693 cc_library {
5694 name: "libfoo",
5695 stl: "none",
5696 system_shared_libs: [],
5697 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005698 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005699 }
5700 `)
5701 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5702 apex {
5703 name: "myapex",
5704 key: "myapex.key",
5705 java_libs: ["myjar"],
5706 }
5707
5708 apex_key {
5709 name: "myapex.key",
5710 public_key: "testkey.avbpubkey",
5711 private_key: "testkey.pem",
5712 }
5713
5714 java_library {
5715 name: "myjar",
5716 srcs: ["foo/bar/MyClass.java"],
5717 sdk_version: "none",
5718 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005719 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005720 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005721 }
5722 `)
5723}
5724
Bill Peckhama41a6962021-01-11 10:58:54 -08005725func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005726 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005727 apex {
5728 name: "myapex",
5729 key: "myapex.key",
5730 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005731 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005732 }
5733
5734 apex_key {
5735 name: "myapex.key",
5736 public_key: "testkey.avbpubkey",
5737 private_key: "testkey.pem",
5738 }
5739
5740 java_import {
5741 name: "myjavaimport",
5742 apex_available: ["myapex"],
5743 jars: ["my.jar"],
5744 compile_dex: true,
5745 }
5746 `)
5747
5748 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5749 apexRule := module.Rule("apexRule")
5750 copyCmds := apexRule.Args["copy_commands"]
5751 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5752}
5753
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005754func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005755 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005756 apex {
5757 name: "myapex",
5758 key: "myapex.key",
5759 apps: [
5760 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005761 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005762 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005763 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005764 }
5765
5766 apex_key {
5767 name: "myapex.key",
5768 public_key: "testkey.avbpubkey",
5769 private_key: "testkey.pem",
5770 }
5771
5772 android_app {
5773 name: "AppFoo",
5774 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005775 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005776 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005777 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005778 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005779 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005780 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005781
5782 android_app {
5783 name: "AppFooPriv",
5784 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005785 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005786 system_modules: "none",
5787 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005788 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005789 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005790 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005791
5792 cc_library_shared {
5793 name: "libjni",
5794 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005795 shared_libs: ["libfoo"],
5796 stl: "none",
5797 system_shared_libs: [],
5798 apex_available: [ "myapex" ],
5799 sdk_version: "current",
5800 }
5801
5802 cc_library_shared {
5803 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005804 stl: "none",
5805 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005806 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005807 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005808 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005809 `)
5810
Sundong Ahnabb64432019-10-22 13:58:29 +09005811 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005812 apexRule := module.Rule("apexRule")
5813 copyCmds := apexRule.Args["copy_commands"]
5814
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005815 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5816 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005817
Colin Crossaede88c2020-08-11 12:17:01 -07005818 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005819 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005820 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005821 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005822 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005823 // JNI libraries including transitive deps are
5824 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005825 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005826 // ... embedded inside APK (jnilibs.zip)
5827 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5828 // ... and not directly inside the APEX
5829 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5830 }
Dario Frenicde2a032019-10-27 00:29:22 +01005831}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005832
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005833func TestApexWithAppImportBuildId(t *testing.T) {
5834 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5835 for _, id := range invalidBuildIds {
5836 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5837 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5838 variables.BuildId = proptools.StringPtr(id)
5839 })
5840 testApexError(t, message, `apex {
5841 name: "myapex",
5842 key: "myapex.key",
5843 apps: ["AppFooPrebuilt"],
5844 updatable: false,
5845 }
5846
5847 apex_key {
5848 name: "myapex.key",
5849 public_key: "testkey.avbpubkey",
5850 private_key: "testkey.pem",
5851 }
5852
5853 android_app_import {
5854 name: "AppFooPrebuilt",
5855 apk: "PrebuiltAppFoo.apk",
5856 presigned: true,
5857 apex_available: ["myapex"],
5858 }
5859 `, fixture)
5860 }
5861}
5862
Dario Frenicde2a032019-10-27 00:29:22 +01005863func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005864 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005865 apex {
5866 name: "myapex",
5867 key: "myapex.key",
5868 apps: [
5869 "AppFooPrebuilt",
5870 "AppFooPrivPrebuilt",
5871 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005872 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005873 }
5874
5875 apex_key {
5876 name: "myapex.key",
5877 public_key: "testkey.avbpubkey",
5878 private_key: "testkey.pem",
5879 }
5880
5881 android_app_import {
5882 name: "AppFooPrebuilt",
5883 apk: "PrebuiltAppFoo.apk",
5884 presigned: true,
5885 dex_preopt: {
5886 enabled: false,
5887 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005888 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005889 }
5890
5891 android_app_import {
5892 name: "AppFooPrivPrebuilt",
5893 apk: "PrebuiltAppFooPriv.apk",
5894 privileged: true,
5895 presigned: true,
5896 dex_preopt: {
5897 enabled: false,
5898 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005899 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005900 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005901 }
5902 `)
5903
Sundong Ahnabb64432019-10-22 13:58:29 +09005904 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005905 apexRule := module.Rule("apexRule")
5906 copyCmds := apexRule.Args["copy_commands"]
5907
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005908 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5909 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005910}
5911
5912func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005913 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005914 apex {
5915 name: "myapex",
5916 key: "myapex.key",
5917 apps: [
5918 "AppFoo",
5919 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005920 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005921 }
5922
5923 apex_key {
5924 name: "myapex.key",
5925 public_key: "testkey.avbpubkey",
5926 private_key: "testkey.pem",
5927 }
5928
5929 android_app {
5930 name: "AppFoo",
5931 srcs: ["foo/bar/MyClass.java"],
5932 sdk_version: "none",
5933 system_modules: "none",
5934 apex_available: [ "myapex" ],
5935 }
5936
5937 android_app_import {
5938 name: "AppFoo",
5939 apk: "AppFooPrebuilt.apk",
5940 filename: "AppFooPrebuilt.apk",
5941 presigned: true,
5942 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005943 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005944 }
5945 `, withFiles(map[string][]byte{
5946 "AppFooPrebuilt.apk": nil,
5947 }))
5948
5949 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005950 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005951 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005952}
5953
Dario Freni6f3937c2019-12-20 22:58:03 +00005954func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005955 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005956 apex {
5957 name: "myapex",
5958 key: "myapex.key",
5959 apps: [
5960 "TesterHelpAppFoo",
5961 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005962 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005963 }
5964
5965 apex_key {
5966 name: "myapex.key",
5967 public_key: "testkey.avbpubkey",
5968 private_key: "testkey.pem",
5969 }
5970
5971 android_test_helper_app {
5972 name: "TesterHelpAppFoo",
5973 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005974 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005975 }
5976
5977 `)
5978
5979 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5980 apexRule := module.Rule("apexRule")
5981 copyCmds := apexRule.Args["copy_commands"]
5982
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005983 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00005984}
5985
Jooyung Han18020ea2019-11-13 10:50:48 +09005986func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5987 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005988 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005989 apex {
5990 name: "myapex",
5991 key: "myapex.key",
5992 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005993 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005994 }
5995
5996 apex_key {
5997 name: "myapex.key",
5998 public_key: "testkey.avbpubkey",
5999 private_key: "testkey.pem",
6000 }
6001
6002 apex {
6003 name: "otherapex",
6004 key: "myapex.key",
6005 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006006 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006007 }
6008
6009 cc_defaults {
6010 name: "libfoo-defaults",
6011 apex_available: ["otherapex"],
6012 }
6013
6014 cc_library {
6015 name: "libfoo",
6016 defaults: ["libfoo-defaults"],
6017 stl: "none",
6018 system_shared_libs: [],
6019 }`)
6020}
6021
Paul Duffine52e66f2020-03-30 17:54:29 +01006022func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006023 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006024 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006025 apex {
6026 name: "myapex",
6027 key: "myapex.key",
6028 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006029 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006030 }
6031
6032 apex_key {
6033 name: "myapex.key",
6034 public_key: "testkey.avbpubkey",
6035 private_key: "testkey.pem",
6036 }
6037
6038 apex {
6039 name: "otherapex",
6040 key: "otherapex.key",
6041 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006042 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006043 }
6044
6045 apex_key {
6046 name: "otherapex.key",
6047 public_key: "testkey.avbpubkey",
6048 private_key: "testkey.pem",
6049 }
6050
6051 cc_library {
6052 name: "libfoo",
6053 stl: "none",
6054 system_shared_libs: [],
6055 apex_available: ["otherapex"],
6056 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006057}
Jiyong Park127b40b2019-09-30 16:04:35 +09006058
Paul Duffine52e66f2020-03-30 17:54:29 +01006059func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006060 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006061 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006062.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006063.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006064.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006065.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006066.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006067.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006068 apex {
6069 name: "myapex",
6070 key: "myapex.key",
6071 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006072 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006073 }
6074
6075 apex_key {
6076 name: "myapex.key",
6077 public_key: "testkey.avbpubkey",
6078 private_key: "testkey.pem",
6079 }
6080
Jiyong Park127b40b2019-09-30 16:04:35 +09006081 cc_library {
6082 name: "libfoo",
6083 stl: "none",
6084 shared_libs: ["libbar"],
6085 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006086 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006087 }
6088
6089 cc_library {
6090 name: "libbar",
6091 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006092 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006093 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006094 apex_available: ["myapex"],
6095 }
6096
6097 cc_library {
6098 name: "libbaz",
6099 stl: "none",
6100 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006101 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006102}
Jiyong Park127b40b2019-09-30 16:04:35 +09006103
Paul Duffine52e66f2020-03-30 17:54:29 +01006104func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006105 testApexError(t, "\"otherapex\" is not a valid module name", `
6106 apex {
6107 name: "myapex",
6108 key: "myapex.key",
6109 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006110 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006111 }
6112
6113 apex_key {
6114 name: "myapex.key",
6115 public_key: "testkey.avbpubkey",
6116 private_key: "testkey.pem",
6117 }
6118
6119 cc_library {
6120 name: "libfoo",
6121 stl: "none",
6122 system_shared_libs: [],
6123 apex_available: ["otherapex"],
6124 }`)
6125
Paul Duffine52e66f2020-03-30 17:54:29 +01006126 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006127 apex {
6128 name: "myapex",
6129 key: "myapex.key",
6130 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006131 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006132 }
6133
6134 apex_key {
6135 name: "myapex.key",
6136 public_key: "testkey.avbpubkey",
6137 private_key: "testkey.pem",
6138 }
6139
6140 cc_library {
6141 name: "libfoo",
6142 stl: "none",
6143 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006144 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006145 apex_available: ["myapex"],
6146 }
6147
6148 cc_library {
6149 name: "libbar",
6150 stl: "none",
6151 system_shared_libs: [],
6152 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006153 }
6154
6155 cc_library {
6156 name: "libbaz",
6157 stl: "none",
6158 system_shared_libs: [],
6159 stubs: {
6160 versions: ["10", "20", "30"],
6161 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006162 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006163}
Jiyong Park127b40b2019-09-30 16:04:35 +09006164
Jiyong Park89e850a2020-04-07 16:37:39 +09006165func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006166 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006167 apex {
6168 name: "myapex",
6169 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006170 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006171 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006172 }
6173
6174 apex_key {
6175 name: "myapex.key",
6176 public_key: "testkey.avbpubkey",
6177 private_key: "testkey.pem",
6178 }
6179
6180 cc_library {
6181 name: "libfoo",
6182 stl: "none",
6183 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006184 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006185 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006186 }
6187
6188 cc_library {
6189 name: "libfoo2",
6190 stl: "none",
6191 system_shared_libs: [],
6192 shared_libs: ["libbaz"],
6193 apex_available: ["//apex_available:platform"],
6194 }
6195
6196 cc_library {
6197 name: "libbar",
6198 stl: "none",
6199 system_shared_libs: [],
6200 apex_available: ["myapex"],
6201 }
6202
6203 cc_library {
6204 name: "libbaz",
6205 stl: "none",
6206 system_shared_libs: [],
6207 apex_available: ["myapex"],
6208 stubs: {
6209 versions: ["1"],
6210 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006211 }`)
6212
Jiyong Park89e850a2020-04-07 16:37:39 +09006213 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6214 // because it depends on libbar which isn't available to platform
6215 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6216 if libfoo.NotAvailableForPlatform() != true {
6217 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6218 }
6219
6220 // libfoo2 however can be available to platform because it depends on libbaz which provides
6221 // stubs
6222 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6223 if libfoo2.NotAvailableForPlatform() == true {
6224 t.Errorf("%q should be available to platform", libfoo2.String())
6225 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006226}
Jiyong Parka90ca002019-10-07 15:47:24 +09006227
Paul Duffine52e66f2020-03-30 17:54:29 +01006228func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006229 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006230 apex {
6231 name: "myapex",
6232 key: "myapex.key",
6233 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006234 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006235 }
6236
6237 apex_key {
6238 name: "myapex.key",
6239 public_key: "testkey.avbpubkey",
6240 private_key: "testkey.pem",
6241 }
6242
6243 cc_library {
6244 name: "libfoo",
6245 stl: "none",
6246 system_shared_libs: [],
6247 apex_available: ["myapex"],
6248 static: {
6249 apex_available: ["//apex_available:platform"],
6250 },
6251 }`)
6252
Jiyong Park89e850a2020-04-07 16:37:39 +09006253 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6254 if libfooShared.NotAvailableForPlatform() != true {
6255 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6256 }
6257 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6258 if libfooStatic.NotAvailableForPlatform() != false {
6259 t.Errorf("%q should be available to platform", libfooStatic.String())
6260 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006261}
6262
Jiyong Park5d790c32019-11-15 18:40:32 +09006263func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006264 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006265 apex {
6266 name: "myapex",
6267 key: "myapex.key",
6268 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006269 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006270 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006271 bootclasspath_fragments: ["mybootclasspath_fragment"],
6272 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6273 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006274 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006275 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006276 }
6277
6278 override_apex {
6279 name: "override_myapex",
6280 base: "myapex",
6281 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006282 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006283 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006284 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6285 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6286 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006287 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006288 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006289 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006290 key: "mynewapex.key",
6291 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006292 }
6293
6294 apex_key {
6295 name: "myapex.key",
6296 public_key: "testkey.avbpubkey",
6297 private_key: "testkey.pem",
6298 }
6299
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006300 apex_key {
6301 name: "mynewapex.key",
6302 public_key: "testkey2.avbpubkey",
6303 private_key: "testkey2.pem",
6304 }
6305
6306 android_app_certificate {
6307 name: "myapex.certificate",
6308 certificate: "testkey",
6309 }
6310
Jiyong Park5d790c32019-11-15 18:40:32 +09006311 android_app {
6312 name: "app",
6313 srcs: ["foo/bar/MyClass.java"],
6314 package_name: "foo",
6315 sdk_version: "none",
6316 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006317 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006318 }
6319
6320 override_android_app {
6321 name: "override_app",
6322 base: "app",
6323 package_name: "bar",
6324 }
markchien7c803b82021-08-26 22:10:06 +08006325
6326 bpf {
6327 name: "bpf",
6328 srcs: ["bpf.c"],
6329 }
6330
6331 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006332 name: "overrideBpf",
6333 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006334 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006335
6336 prebuilt_etc {
6337 name: "myetc",
6338 src: "myprebuilt",
6339 }
6340
6341 prebuilt_etc {
6342 name: "override_myetc",
6343 src: "override_myprebuilt",
6344 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006345
6346 java_library {
6347 name: "bcplib",
6348 srcs: ["a.java"],
6349 compile_dex: true,
6350 apex_available: ["myapex"],
6351 permitted_packages: ["bcp.lib"],
6352 }
6353
6354 bootclasspath_fragment {
6355 name: "mybootclasspath_fragment",
6356 contents: ["bcplib"],
6357 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006358 hidden_api: {
6359 split_packages: ["*"],
6360 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006361 }
6362
6363 java_library {
6364 name: "override_bcplib",
6365 srcs: ["a.java"],
6366 compile_dex: true,
6367 apex_available: ["myapex"],
6368 permitted_packages: ["override.bcp.lib"],
6369 }
6370
6371 bootclasspath_fragment {
6372 name: "override_bootclasspath_fragment",
6373 contents: ["override_bcplib"],
6374 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006375 hidden_api: {
6376 split_packages: ["*"],
6377 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006378 }
6379
6380 java_library {
6381 name: "systemserverlib",
6382 srcs: ["a.java"],
6383 apex_available: ["myapex"],
6384 }
6385
6386 systemserverclasspath_fragment {
6387 name: "mysystemserverclasspath_fragment",
6388 standalone_contents: ["systemserverlib"],
6389 apex_available: ["myapex"],
6390 }
6391
6392 java_library {
6393 name: "override_systemserverlib",
6394 srcs: ["a.java"],
6395 apex_available: ["myapex"],
6396 }
6397
6398 systemserverclasspath_fragment {
6399 name: "override_systemserverclasspath_fragment",
6400 standalone_contents: ["override_systemserverlib"],
6401 apex_available: ["myapex"],
6402 }
6403
6404 java_library {
6405 name: "myjava_library",
6406 srcs: ["a.java"],
6407 compile_dex: true,
6408 apex_available: ["myapex"],
6409 }
6410
6411 java_library {
6412 name: "override_java_library",
6413 srcs: ["a.java"],
6414 compile_dex: true,
6415 apex_available: ["myapex"],
6416 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006417 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006418
Jiyong Park317645e2019-12-05 13:20:58 +09006419 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6420 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6421 if originalVariant.GetOverriddenBy() != "" {
6422 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6423 }
6424 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6425 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6426 }
6427
Jiyong Park5d790c32019-11-15 18:40:32 +09006428 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6429 apexRule := module.Rule("apexRule")
6430 copyCmds := apexRule.Args["copy_commands"]
6431
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006432 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6433 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006434
markchien7c803b82021-08-26 22:10:06 +08006435 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006436 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006437
Daniel Norman5a3ce132021-08-26 15:44:43 -07006438 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6439 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6440
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006441 apexBundle := module.Module().(*apexBundle)
6442 name := apexBundle.Name()
6443 if name != "override_myapex" {
6444 t.Errorf("name should be \"override_myapex\", but was %q", name)
6445 }
6446
Baligh Uddin004d7172020-02-19 21:29:28 -08006447 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6448 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6449 }
6450
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006451 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6452 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6453 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6454 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6455 android.AssertArrayString(t, "Java_libs does not match",
6456 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6457
Jiyong Park20bacab2020-03-03 11:45:41 +09006458 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006459 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006460 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6461
6462 signApkRule := module.Rule("signapk")
6463 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006464
Colin Crossaa255532020-07-03 13:18:24 -07006465 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006466 var builder strings.Builder
6467 data.Custom(&builder, name, "TARGET_", "", data)
6468 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006469 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6470 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
6471 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
6472 ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex")
6473 ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex")
6474 ensureContains(t, androidMk, "LOCAL_MODULE := override_java_library.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006475 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006476 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006477 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006478 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006479 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006480 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006481 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6482 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6483 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006484 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006485}
6486
Albert Martineefabcf2022-03-21 20:11:16 +00006487func TestMinSdkVersionOverride(t *testing.T) {
6488 // Override from 29 to 31
6489 minSdkOverride31 := "31"
6490 ctx := testApex(t, `
6491 apex {
6492 name: "myapex",
6493 key: "myapex.key",
6494 native_shared_libs: ["mylib"],
6495 updatable: true,
6496 min_sdk_version: "29"
6497 }
6498
6499 override_apex {
6500 name: "override_myapex",
6501 base: "myapex",
6502 logging_parent: "com.foo.bar",
6503 package_name: "test.overridden.package"
6504 }
6505
6506 apex_key {
6507 name: "myapex.key",
6508 public_key: "testkey.avbpubkey",
6509 private_key: "testkey.pem",
6510 }
6511
6512 cc_library {
6513 name: "mylib",
6514 srcs: ["mylib.cpp"],
6515 runtime_libs: ["libbar"],
6516 system_shared_libs: [],
6517 stl: "none",
6518 apex_available: [ "myapex" ],
6519 min_sdk_version: "apex_inherit"
6520 }
6521
6522 cc_library {
6523 name: "libbar",
6524 srcs: ["mylib.cpp"],
6525 system_shared_libs: [],
6526 stl: "none",
6527 apex_available: [ "myapex" ],
6528 min_sdk_version: "apex_inherit"
6529 }
6530
6531 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6532
6533 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6534 copyCmds := apexRule.Args["copy_commands"]
6535
6536 // Ensure that direct non-stubs dep is always included
6537 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6538
6539 // Ensure that runtime_libs dep in included
6540 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6541
6542 // Ensure libraries target overridden min_sdk_version value
6543 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6544}
6545
6546func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6547 // Attempt to override from 31 to 29, should be a NOOP
6548 minSdkOverride29 := "29"
6549 ctx := testApex(t, `
6550 apex {
6551 name: "myapex",
6552 key: "myapex.key",
6553 native_shared_libs: ["mylib"],
6554 updatable: true,
6555 min_sdk_version: "31"
6556 }
6557
6558 override_apex {
6559 name: "override_myapex",
6560 base: "myapex",
6561 logging_parent: "com.foo.bar",
6562 package_name: "test.overridden.package"
6563 }
6564
6565 apex_key {
6566 name: "myapex.key",
6567 public_key: "testkey.avbpubkey",
6568 private_key: "testkey.pem",
6569 }
6570
6571 cc_library {
6572 name: "mylib",
6573 srcs: ["mylib.cpp"],
6574 runtime_libs: ["libbar"],
6575 system_shared_libs: [],
6576 stl: "none",
6577 apex_available: [ "myapex" ],
6578 min_sdk_version: "apex_inherit"
6579 }
6580
6581 cc_library {
6582 name: "libbar",
6583 srcs: ["mylib.cpp"],
6584 system_shared_libs: [],
6585 stl: "none",
6586 apex_available: [ "myapex" ],
6587 min_sdk_version: "apex_inherit"
6588 }
6589
6590 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6591
6592 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6593 copyCmds := apexRule.Args["copy_commands"]
6594
6595 // Ensure that direct non-stubs dep is always included
6596 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6597
6598 // Ensure that runtime_libs dep in included
6599 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6600
6601 // Ensure libraries target the original min_sdk_version value rather than the overridden
6602 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6603}
6604
Jooyung Han214bf372019-11-12 13:03:50 +09006605func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006606 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006607 apex {
6608 name: "myapex",
6609 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006610 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006611 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006612 }
6613
6614 apex_key {
6615 name: "myapex.key",
6616 public_key: "testkey.avbpubkey",
6617 private_key: "testkey.pem",
6618 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006619
6620 cc_library {
6621 name: "mylib",
6622 srcs: ["mylib.cpp"],
6623 stl: "libc++",
6624 system_shared_libs: [],
6625 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006626 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006627 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006628 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006629
6630 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6631 args := module.Rule("apexRule").Args
6632 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006633 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006634
6635 // The copies of the libraries in the apex should have one more dependency than
6636 // the ones outside the apex, namely the unwinder. Ideally we should check
6637 // the dependency names directly here but for some reason the names are blank in
6638 // this test.
6639 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006640 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006641 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6642 if len(apexImplicits) != len(nonApexImplicits)+1 {
6643 t.Errorf("%q missing unwinder dep", lib)
6644 }
6645 }
Jooyung Han214bf372019-11-12 13:03:50 +09006646}
6647
Paul Duffine05480a2021-03-08 15:07:14 +00006648var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006649 "api/current.txt": nil,
6650 "api/removed.txt": nil,
6651 "api/system-current.txt": nil,
6652 "api/system-removed.txt": nil,
6653 "api/test-current.txt": nil,
6654 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006655
Anton Hanssondff2c782020-12-21 17:10:01 +00006656 "100/public/api/foo.txt": nil,
6657 "100/public/api/foo-removed.txt": nil,
6658 "100/system/api/foo.txt": nil,
6659 "100/system/api/foo-removed.txt": nil,
6660
Paul Duffineedc5d52020-06-12 17:46:39 +01006661 // For java_sdk_library_import
6662 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006663}
6664
Jooyung Han58f26ab2019-12-18 15:34:32 +09006665func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006666 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006667 apex {
6668 name: "myapex",
6669 key: "myapex.key",
6670 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006671 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006672 }
6673
6674 apex_key {
6675 name: "myapex.key",
6676 public_key: "testkey.avbpubkey",
6677 private_key: "testkey.pem",
6678 }
6679
6680 java_sdk_library {
6681 name: "foo",
6682 srcs: ["a.java"],
6683 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006684 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006685 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006686
6687 prebuilt_apis {
6688 name: "sdk",
6689 api_dirs: ["100"],
6690 }
Paul Duffin9b879592020-05-26 13:21:35 +01006691 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006692
6693 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006694 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006695 "javalib/foo.jar",
6696 "etc/permissions/foo.xml",
6697 })
6698 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006699 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006700 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 +09006701}
6702
Paul Duffin9b879592020-05-26 13:21:35 +01006703func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006704 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006705 apex {
6706 name: "myapex",
6707 key: "myapex.key",
6708 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006709 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006710 }
6711
6712 apex_key {
6713 name: "myapex.key",
6714 public_key: "testkey.avbpubkey",
6715 private_key: "testkey.pem",
6716 }
6717
6718 java_sdk_library {
6719 name: "foo",
6720 srcs: ["a.java"],
6721 api_packages: ["foo"],
6722 apex_available: ["myapex"],
6723 sdk_version: "none",
6724 system_modules: "none",
6725 }
6726
6727 java_library {
6728 name: "bar",
6729 srcs: ["a.java"],
6730 libs: ["foo"],
6731 apex_available: ["myapex"],
6732 sdk_version: "none",
6733 system_modules: "none",
6734 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006735
6736 prebuilt_apis {
6737 name: "sdk",
6738 api_dirs: ["100"],
6739 }
Paul Duffin9b879592020-05-26 13:21:35 +01006740 `, withFiles(filesForSdkLibrary))
6741
6742 // java_sdk_library installs both impl jar and permission XML
6743 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6744 "javalib/bar.jar",
6745 "javalib/foo.jar",
6746 "etc/permissions/foo.xml",
6747 })
6748
6749 // The bar library should depend on the implementation jar.
6750 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006751 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006752 t.Errorf("expected %q, found %#q", expected, actual)
6753 }
6754}
6755
6756func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006757 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006758 apex {
6759 name: "myapex",
6760 key: "myapex.key",
6761 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006762 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006763 }
6764
6765 apex_key {
6766 name: "myapex.key",
6767 public_key: "testkey.avbpubkey",
6768 private_key: "testkey.pem",
6769 }
6770
6771 java_sdk_library {
6772 name: "foo",
6773 srcs: ["a.java"],
6774 api_packages: ["foo"],
6775 apex_available: ["myapex"],
6776 sdk_version: "none",
6777 system_modules: "none",
6778 }
6779
6780 java_library {
6781 name: "bar",
6782 srcs: ["a.java"],
6783 libs: ["foo"],
6784 sdk_version: "none",
6785 system_modules: "none",
6786 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006787
6788 prebuilt_apis {
6789 name: "sdk",
6790 api_dirs: ["100"],
6791 }
Paul Duffin9b879592020-05-26 13:21:35 +01006792 `, withFiles(filesForSdkLibrary))
6793
6794 // java_sdk_library installs both impl jar and permission XML
6795 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6796 "javalib/foo.jar",
6797 "etc/permissions/foo.xml",
6798 })
6799
6800 // The bar library should depend on the stubs jar.
6801 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006802 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006803 t.Errorf("expected %q, found %#q", expected, actual)
6804 }
6805}
6806
Paul Duffineedc5d52020-06-12 17:46:39 +01006807func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006808 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006809 prebuilt_apis {
6810 name: "sdk",
6811 api_dirs: ["100"],
6812 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006813 withFiles(map[string][]byte{
6814 "apex/a.java": nil,
6815 "apex/apex_manifest.json": nil,
6816 "apex/Android.bp": []byte(`
6817 package {
6818 default_visibility: ["//visibility:private"],
6819 }
6820
6821 apex {
6822 name: "myapex",
6823 key: "myapex.key",
6824 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006825 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006826 }
6827
6828 apex_key {
6829 name: "myapex.key",
6830 public_key: "testkey.avbpubkey",
6831 private_key: "testkey.pem",
6832 }
6833
6834 java_library {
6835 name: "bar",
6836 srcs: ["a.java"],
6837 libs: ["foo"],
6838 apex_available: ["myapex"],
6839 sdk_version: "none",
6840 system_modules: "none",
6841 }
6842`),
6843 "source/a.java": nil,
6844 "source/api/current.txt": nil,
6845 "source/api/removed.txt": nil,
6846 "source/Android.bp": []byte(`
6847 package {
6848 default_visibility: ["//visibility:private"],
6849 }
6850
6851 java_sdk_library {
6852 name: "foo",
6853 visibility: ["//apex"],
6854 srcs: ["a.java"],
6855 api_packages: ["foo"],
6856 apex_available: ["myapex"],
6857 sdk_version: "none",
6858 system_modules: "none",
6859 public: {
6860 enabled: true,
6861 },
6862 }
6863`),
6864 "prebuilt/a.jar": nil,
6865 "prebuilt/Android.bp": []byte(`
6866 package {
6867 default_visibility: ["//visibility:private"],
6868 }
6869
6870 java_sdk_library_import {
6871 name: "foo",
6872 visibility: ["//apex", "//source"],
6873 apex_available: ["myapex"],
6874 prefer: true,
6875 public: {
6876 jars: ["a.jar"],
6877 },
6878 }
6879`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006880 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006881 )
6882
6883 // java_sdk_library installs both impl jar and permission XML
6884 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6885 "javalib/bar.jar",
6886 "javalib/foo.jar",
6887 "etc/permissions/foo.xml",
6888 })
6889
6890 // The bar library should depend on the implementation jar.
6891 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006892 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006893 t.Errorf("expected %q, found %#q", expected, actual)
6894 }
6895}
6896
6897func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6898 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6899 apex {
6900 name: "myapex",
6901 key: "myapex.key",
6902 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006903 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006904 }
6905
6906 apex_key {
6907 name: "myapex.key",
6908 public_key: "testkey.avbpubkey",
6909 private_key: "testkey.pem",
6910 }
6911
6912 java_sdk_library_import {
6913 name: "foo",
6914 apex_available: ["myapex"],
6915 prefer: true,
6916 public: {
6917 jars: ["a.jar"],
6918 },
6919 }
6920
6921 `, withFiles(filesForSdkLibrary))
6922}
6923
atrost6e126252020-01-27 17:01:16 +00006924func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006925 result := android.GroupFixturePreparers(
6926 prepareForApexTest,
6927 java.PrepareForTestWithPlatformCompatConfig,
6928 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006929 apex {
6930 name: "myapex",
6931 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006932 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006933 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006934 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006935 }
6936
6937 apex_key {
6938 name: "myapex.key",
6939 public_key: "testkey.avbpubkey",
6940 private_key: "testkey.pem",
6941 }
6942
6943 platform_compat_config {
6944 name: "myjar-platform-compat-config",
6945 src: ":myjar",
6946 }
6947
6948 java_library {
6949 name: "myjar",
6950 srcs: ["foo/bar/MyClass.java"],
6951 sdk_version: "none",
6952 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006953 apex_available: [ "myapex" ],
6954 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006955
6956 // Make sure that a preferred prebuilt does not affect the apex contents.
6957 prebuilt_platform_compat_config {
6958 name: "myjar-platform-compat-config",
6959 metadata: "compat-config/metadata.xml",
6960 prefer: true,
6961 }
atrost6e126252020-01-27 17:01:16 +00006962 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006963 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006964 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6965 "etc/compatconfig/myjar-platform-compat-config.xml",
6966 "javalib/myjar.jar",
6967 })
6968}
6969
Jooyung Han862c0d62022-12-21 10:15:37 +09006970func TestNoDupeApexFiles(t *testing.T) {
6971 android.GroupFixturePreparers(
6972 android.PrepareForTestWithAndroidBuildComponents,
6973 PrepareForTestWithApexBuildComponents,
6974 prepareForTestWithMyapex,
6975 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
6976 ).
6977 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
6978 RunTestWithBp(t, `
6979 apex {
6980 name: "myapex",
6981 key: "myapex.key",
6982 prebuilts: ["foo", "bar"],
6983 updatable: false,
6984 }
6985
6986 apex_key {
6987 name: "myapex.key",
6988 public_key: "testkey.avbpubkey",
6989 private_key: "testkey.pem",
6990 }
6991
6992 prebuilt_etc {
6993 name: "foo",
6994 src: "myprebuilt",
6995 filename_from_src: true,
6996 }
6997
6998 prebuilt_etc {
6999 name: "bar",
7000 src: "myprebuilt",
7001 filename_from_src: true,
7002 }
7003 `)
7004}
7005
Jiyong Park479321d2019-12-16 11:47:12 +09007006func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7007 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7008 apex {
7009 name: "myapex",
7010 key: "myapex.key",
7011 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007012 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007013 }
7014
7015 apex_key {
7016 name: "myapex.key",
7017 public_key: "testkey.avbpubkey",
7018 private_key: "testkey.pem",
7019 }
7020
7021 java_library {
7022 name: "myjar",
7023 srcs: ["foo/bar/MyClass.java"],
7024 sdk_version: "none",
7025 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007026 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007027 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007028 }
7029 `)
7030}
7031
Jiyong Park7afd1072019-12-30 16:56:33 +09007032func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007033 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007034 apex {
7035 name: "myapex",
7036 key: "myapex.key",
7037 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007038 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007039 }
7040
7041 apex_key {
7042 name: "myapex.key",
7043 public_key: "testkey.avbpubkey",
7044 private_key: "testkey.pem",
7045 }
7046
7047 cc_library {
7048 name: "mylib",
7049 srcs: ["mylib.cpp"],
7050 system_shared_libs: [],
7051 stl: "none",
7052 required: ["a", "b"],
7053 host_required: ["c", "d"],
7054 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007055 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007056 }
7057 `)
7058
7059 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007060 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007061 name := apexBundle.BaseModuleName()
7062 prefix := "TARGET_"
7063 var builder strings.Builder
7064 data.Custom(&builder, name, prefix, "", data)
7065 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007066 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 -08007067 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7068 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007069}
7070
Jiyong Park7cd10e32020-01-14 09:22:18 +09007071func TestSymlinksFromApexToSystem(t *testing.T) {
7072 bp := `
7073 apex {
7074 name: "myapex",
7075 key: "myapex.key",
7076 native_shared_libs: ["mylib"],
7077 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007078 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007079 }
7080
Jiyong Park9d677202020-02-19 16:29:35 +09007081 apex {
7082 name: "myapex.updatable",
7083 key: "myapex.key",
7084 native_shared_libs: ["mylib"],
7085 java_libs: ["myjar"],
7086 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09007087 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09007088 }
7089
Jiyong Park7cd10e32020-01-14 09:22:18 +09007090 apex_key {
7091 name: "myapex.key",
7092 public_key: "testkey.avbpubkey",
7093 private_key: "testkey.pem",
7094 }
7095
7096 cc_library {
7097 name: "mylib",
7098 srcs: ["mylib.cpp"],
7099 shared_libs: ["myotherlib"],
7100 system_shared_libs: [],
7101 stl: "none",
7102 apex_available: [
7103 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007104 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007105 "//apex_available:platform",
7106 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007107 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007108 }
7109
7110 cc_library {
7111 name: "myotherlib",
7112 srcs: ["mylib.cpp"],
7113 system_shared_libs: [],
7114 stl: "none",
7115 apex_available: [
7116 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007117 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007118 "//apex_available:platform",
7119 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007120 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007121 }
7122
7123 java_library {
7124 name: "myjar",
7125 srcs: ["foo/bar/MyClass.java"],
7126 sdk_version: "none",
7127 system_modules: "none",
7128 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007129 apex_available: [
7130 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007131 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007132 "//apex_available:platform",
7133 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007134 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007135 }
7136
7137 java_library {
7138 name: "myotherjar",
7139 srcs: ["foo/bar/MyClass.java"],
7140 sdk_version: "none",
7141 system_modules: "none",
7142 apex_available: [
7143 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007144 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007145 "//apex_available:platform",
7146 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007147 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007148 }
7149 `
7150
7151 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7152 for _, f := range files {
7153 if f.path == file {
7154 if f.isLink {
7155 t.Errorf("%q is not a real file", file)
7156 }
7157 return
7158 }
7159 }
7160 t.Errorf("%q is not found", file)
7161 }
7162
7163 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
7164 for _, f := range files {
7165 if f.path == file {
7166 if !f.isLink {
7167 t.Errorf("%q is not a symlink", file)
7168 }
7169 return
7170 }
7171 }
7172 t.Errorf("%q is not found", file)
7173 }
7174
Jiyong Park9d677202020-02-19 16:29:35 +09007175 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7176 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007177 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007178 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007179 ensureRealfileExists(t, files, "javalib/myjar.jar")
7180 ensureRealfileExists(t, files, "lib64/mylib.so")
7181 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7182
Jiyong Park9d677202020-02-19 16:29:35 +09007183 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7184 ensureRealfileExists(t, files, "javalib/myjar.jar")
7185 ensureRealfileExists(t, files, "lib64/mylib.so")
7186 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7187
7188 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007189 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007190 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007191 ensureRealfileExists(t, files, "javalib/myjar.jar")
7192 ensureRealfileExists(t, files, "lib64/mylib.so")
7193 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007194
7195 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7196 ensureRealfileExists(t, files, "javalib/myjar.jar")
7197 ensureRealfileExists(t, files, "lib64/mylib.so")
7198 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007199}
7200
Yo Chiange8128052020-07-23 20:09:18 +08007201func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007202 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007203 apex {
7204 name: "myapex",
7205 key: "myapex.key",
7206 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007207 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007208 }
7209
7210 apex_key {
7211 name: "myapex.key",
7212 public_key: "testkey.avbpubkey",
7213 private_key: "testkey.pem",
7214 }
7215
7216 cc_library_shared {
7217 name: "mylib",
7218 srcs: ["mylib.cpp"],
7219 shared_libs: ["myotherlib"],
7220 system_shared_libs: [],
7221 stl: "none",
7222 apex_available: [
7223 "myapex",
7224 "//apex_available:platform",
7225 ],
7226 }
7227
7228 cc_prebuilt_library_shared {
7229 name: "myotherlib",
7230 srcs: ["prebuilt.so"],
7231 system_shared_libs: [],
7232 stl: "none",
7233 apex_available: [
7234 "myapex",
7235 "//apex_available:platform",
7236 ],
7237 }
7238 `)
7239
Prerana Patilb1896c82022-11-09 18:14:34 +00007240 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007241 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007242 var builder strings.Builder
7243 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7244 androidMk := builder.String()
7245 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007246 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007247 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7248 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7249 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007250 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 +08007251}
7252
Jooyung Han643adc42020-02-27 13:50:06 +09007253func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007254 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007255 apex {
7256 name: "myapex",
7257 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007258 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007259 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007260 }
7261
7262 apex_key {
7263 name: "myapex.key",
7264 public_key: "testkey.avbpubkey",
7265 private_key: "testkey.pem",
7266 }
7267
7268 cc_library {
7269 name: "mylib",
7270 srcs: ["mylib.cpp"],
7271 shared_libs: ["mylib2"],
7272 system_shared_libs: [],
7273 stl: "none",
7274 apex_available: [ "myapex" ],
7275 }
7276
7277 cc_library {
7278 name: "mylib2",
7279 srcs: ["mylib.cpp"],
7280 system_shared_libs: [],
7281 stl: "none",
7282 apex_available: [ "myapex" ],
7283 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007284
7285 rust_ffi_shared {
7286 name: "libfoo.rust",
7287 crate_name: "foo",
7288 srcs: ["foo.rs"],
7289 shared_libs: ["libfoo.shared_from_rust"],
7290 prefer_rlib: true,
7291 apex_available: ["myapex"],
7292 }
7293
7294 cc_library_shared {
7295 name: "libfoo.shared_from_rust",
7296 srcs: ["mylib.cpp"],
7297 system_shared_libs: [],
7298 stl: "none",
7299 stubs: {
7300 versions: ["10", "11", "12"],
7301 },
7302 }
7303
Jooyung Han643adc42020-02-27 13:50:06 +09007304 `)
7305
7306 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7307 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007308 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007309 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7310 "lib64/mylib.so",
7311 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007312 "lib64/libfoo.rust.so",
7313 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7314 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007315 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007316
7317 // b/220397949
7318 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007319}
7320
Jooyung Han49f67012020-04-17 13:43:10 +09007321func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007322 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007323 apex {
7324 name: "myapex",
7325 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007326 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007327 }
7328 apex_key {
7329 name: "myapex.key",
7330 public_key: "testkey.avbpubkey",
7331 private_key: "testkey.pem",
7332 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007333 `,
7334 android.FixtureModifyConfig(func(config android.Config) {
7335 delete(config.Targets, android.Android)
7336 config.AndroidCommonTarget = android.Target{}
7337 }),
7338 )
Jooyung Han49f67012020-04-17 13:43:10 +09007339
7340 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7341 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7342 }
7343}
7344
Jiyong Parkbd159612020-02-28 15:22:21 +09007345func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007346 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007347 apex {
7348 name: "myapex",
7349 key: "myapex.key",
7350 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007351 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007352 }
7353
7354 apex_key {
7355 name: "myapex.key",
7356 public_key: "testkey.avbpubkey",
7357 private_key: "testkey.pem",
7358 }
7359
7360 android_app {
7361 name: "AppFoo",
7362 srcs: ["foo/bar/MyClass.java"],
7363 sdk_version: "none",
7364 system_modules: "none",
7365 apex_available: [ "myapex" ],
7366 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007367 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007368
Colin Crosscf371cc2020-11-13 11:48:42 -08007369 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007370 content := bundleConfigRule.Args["content"]
7371
7372 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007373 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 +09007374}
7375
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007376func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007377 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007378 apex {
7379 name: "myapex",
7380 key: "myapex.key",
7381 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007382 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007383 }
7384
7385 apex_key {
7386 name: "myapex.key",
7387 public_key: "testkey.avbpubkey",
7388 private_key: "testkey.pem",
7389 }
7390
7391 android_app_set {
7392 name: "AppSet",
7393 set: "AppSet.apks",
7394 }`)
7395 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007396 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007397 content := bundleConfigRule.Args["content"]
7398 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7399 s := mod.Rule("apexRule").Args["copy_commands"]
7400 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007401 if len(copyCmds) != 4 {
7402 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007403 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007404 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7405 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007406 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7407 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007408
7409 // Ensure that canned_fs_config has an entry for the app set zip file
7410 generateFsRule := mod.Rule("generateFsConfig")
7411 cmd := generateFsRule.RuleParams.Command
7412 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007413}
7414
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007415func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007416 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007417 apex_set {
7418 name: "myapex",
7419 filename: "foo_v2.apex",
7420 sanitized: {
7421 none: { set: "myapex.apks", },
7422 hwaddress: { set: "myapex.hwasan.apks", },
7423 },
Paul Duffin24704672021-04-06 16:09:30 +01007424 }
7425 `
7426 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007427
Paul Duffin24704672021-04-06 16:09:30 +01007428 // Check that the extractor produces the correct output file from the correct input file.
7429 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007430
Paul Duffin24704672021-04-06 16:09:30 +01007431 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7432 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007433
Paul Duffin24704672021-04-06 16:09:30 +01007434 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7435
7436 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007437 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7438 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007439
7440 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007441}
7442
Pranav Guptaeba03b02022-09-27 00:27:08 +00007443func TestApexSetApksModuleAssignment(t *testing.T) {
7444 ctx := testApex(t, `
7445 apex_set {
7446 name: "myapex",
7447 set: ":myapex_apks_file",
7448 }
7449
7450 filegroup {
7451 name: "myapex_apks_file",
7452 srcs: ["myapex.apks"],
7453 }
7454 `)
7455
7456 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7457
7458 // Check that the extractor produces the correct apks file from the input module
7459 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7460 extractedApex := m.Output(extractorOutput)
7461
7462 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7463}
7464
Paul Duffin89f570a2021-06-16 01:42:33 +01007465func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007466 t.Helper()
7467
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007468 bp := `
7469 java_library {
7470 name: "some-updatable-apex-lib",
7471 srcs: ["a.java"],
7472 sdk_version: "current",
7473 apex_available: [
7474 "some-updatable-apex",
7475 ],
satayevabcd5972021-08-06 17:49:46 +01007476 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007477 }
7478
7479 java_library {
7480 name: "some-non-updatable-apex-lib",
7481 srcs: ["a.java"],
7482 apex_available: [
7483 "some-non-updatable-apex",
7484 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007485 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007486 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007487 }
7488
7489 bootclasspath_fragment {
7490 name: "some-non-updatable-fragment",
7491 contents: ["some-non-updatable-apex-lib"],
7492 apex_available: [
7493 "some-non-updatable-apex",
7494 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007495 hidden_api: {
7496 split_packages: ["*"],
7497 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007498 }
7499
7500 java_library {
7501 name: "some-platform-lib",
7502 srcs: ["a.java"],
7503 sdk_version: "current",
7504 installable: true,
7505 }
7506
7507 java_library {
7508 name: "some-art-lib",
7509 srcs: ["a.java"],
7510 sdk_version: "current",
7511 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007512 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007513 ],
7514 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007515 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007516 }
7517
7518 apex {
7519 name: "some-updatable-apex",
7520 key: "some-updatable-apex.key",
7521 java_libs: ["some-updatable-apex-lib"],
7522 updatable: true,
7523 min_sdk_version: "current",
7524 }
7525
7526 apex {
7527 name: "some-non-updatable-apex",
7528 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007529 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007530 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007531 }
7532
7533 apex_key {
7534 name: "some-updatable-apex.key",
7535 }
7536
7537 apex_key {
7538 name: "some-non-updatable-apex.key",
7539 }
7540
7541 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007542 name: "com.android.art.debug",
7543 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007544 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007545 updatable: true,
7546 min_sdk_version: "current",
7547 }
7548
Paul Duffinf23bc472021-04-27 12:42:20 +01007549 bootclasspath_fragment {
7550 name: "art-bootclasspath-fragment",
7551 image_name: "art",
7552 contents: ["some-art-lib"],
7553 apex_available: [
7554 "com.android.art.debug",
7555 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007556 hidden_api: {
7557 split_packages: ["*"],
7558 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007559 }
7560
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007561 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007562 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007563 }
7564
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007565 filegroup {
7566 name: "some-updatable-apex-file_contexts",
7567 srcs: [
7568 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7569 ],
7570 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007571
7572 filegroup {
7573 name: "some-non-updatable-apex-file_contexts",
7574 srcs: [
7575 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7576 ],
7577 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007578 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007579
Paul Duffin89f570a2021-06-16 01:42:33 +01007580 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007581}
7582
Paul Duffin89f570a2021-06-16 01:42:33 +01007583func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007584 t.Helper()
7585
Paul Duffin55607122021-03-30 23:32:51 +01007586 fs := android.MockFS{
7587 "a.java": nil,
7588 "a.jar": nil,
7589 "apex_manifest.json": nil,
7590 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007591 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007592 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7593 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7594 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007595 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007596 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007597
Paul Duffin55607122021-03-30 23:32:51 +01007598 errorHandler := android.FixtureExpectsNoErrors
7599 if errmsg != "" {
7600 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007601 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007602
Paul Duffin55607122021-03-30 23:32:51 +01007603 result := android.GroupFixturePreparers(
7604 cc.PrepareForTestWithCcDefaultModules,
7605 java.PrepareForTestWithHiddenApiBuildComponents,
7606 java.PrepareForTestWithJavaDefaultModules,
7607 java.PrepareForTestWithJavaSdkLibraryFiles,
7608 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007609 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007610 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007611 android.FixtureModifyMockFS(func(fs android.MockFS) {
7612 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7613 insert := ""
7614 for _, fragment := range fragments {
7615 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7616 }
7617 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7618 platform_bootclasspath {
7619 name: "platform-bootclasspath",
7620 fragments: [
7621 %s
7622 ],
7623 }
7624 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007625 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007626 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007627 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007628 ).
7629 ExtendWithErrorHandler(errorHandler).
7630 RunTestWithBp(t, bp)
7631
7632 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007633}
7634
Paul Duffin5556c5f2022-06-09 17:32:21 +00007635func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007636 preparers := android.GroupFixturePreparers(
7637 java.PrepareForTestWithJavaDefaultModules,
7638 PrepareForTestWithApexBuildComponents,
7639 ).
7640 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7641 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7642
7643 bpBase := `
7644 apex_set {
7645 name: "com.android.myapex",
7646 installable: true,
7647 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7648 set: "myapex.apks",
7649 }
7650
7651 apex_set {
7652 name: "com.mycompany.android.myapex",
7653 apex_name: "com.android.myapex",
7654 installable: true,
7655 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7656 set: "company-myapex.apks",
7657 }
7658
7659 prebuilt_bootclasspath_fragment {
7660 name: "my-bootclasspath-fragment",
7661 apex_available: ["com.android.myapex"],
7662 %s
7663 }
7664 `
7665
7666 t.Run("java_import", func(t *testing.T) {
7667 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7668 java_import {
7669 name: "libfoo",
7670 jars: ["libfoo.jar"],
7671 apex_available: ["com.android.myapex"],
7672 }
7673 `)
7674 })
7675
7676 t.Run("java_sdk_library_import", func(t *testing.T) {
7677 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7678 java_sdk_library_import {
7679 name: "libfoo",
7680 public: {
7681 jars: ["libbar.jar"],
7682 },
7683 apex_available: ["com.android.myapex"],
7684 }
7685 `)
7686 })
7687
7688 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7689 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7690 image_name: "art",
7691 contents: ["libfoo"],
7692 `)+`
7693 java_sdk_library_import {
7694 name: "libfoo",
7695 public: {
7696 jars: ["libbar.jar"],
7697 },
7698 apex_available: ["com.android.myapex"],
7699 }
7700 `)
7701 })
7702}
7703
Paul Duffin5556c5f2022-06-09 17:32:21 +00007704func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7705 preparers := android.GroupFixturePreparers(
7706 java.PrepareForTestWithJavaDefaultModules,
7707 PrepareForTestWithApexBuildComponents,
7708 )
7709
7710 bpBase := `
7711 apex_set {
7712 name: "com.android.myapex",
7713 installable: true,
7714 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7715 set: "myapex.apks",
7716 }
7717
7718 apex_set {
7719 name: "com.android.myapex_compressed",
7720 apex_name: "com.android.myapex",
7721 installable: true,
7722 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7723 set: "myapex_compressed.apks",
7724 }
7725
7726 prebuilt_bootclasspath_fragment {
7727 name: "my-bootclasspath-fragment",
7728 apex_available: [
7729 "com.android.myapex",
7730 "com.android.myapex_compressed",
7731 ],
7732 hidden_api: {
7733 annotation_flags: "annotation-flags.csv",
7734 metadata: "metadata.csv",
7735 index: "index.csv",
7736 signature_patterns: "signature_patterns.csv",
7737 },
7738 %s
7739 }
7740 `
7741
7742 t.Run("java_import", func(t *testing.T) {
7743 result := preparers.RunTestWithBp(t,
7744 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7745 java_import {
7746 name: "libfoo",
7747 jars: ["libfoo.jar"],
7748 apex_available: [
7749 "com.android.myapex",
7750 "com.android.myapex_compressed",
7751 ],
7752 }
7753 `)
7754
7755 module := result.Module("libfoo", "android_common_com.android.myapex")
7756 usesLibraryDep := module.(java.UsesLibraryDependency)
7757 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7758 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7759 usesLibraryDep.DexJarBuildPath().Path())
7760 })
7761
7762 t.Run("java_sdk_library_import", func(t *testing.T) {
7763 result := preparers.RunTestWithBp(t,
7764 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7765 java_sdk_library_import {
7766 name: "libfoo",
7767 public: {
7768 jars: ["libbar.jar"],
7769 },
7770 apex_available: [
7771 "com.android.myapex",
7772 "com.android.myapex_compressed",
7773 ],
7774 compile_dex: true,
7775 }
7776 `)
7777
7778 module := result.Module("libfoo", "android_common_com.android.myapex")
7779 usesLibraryDep := module.(java.UsesLibraryDependency)
7780 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7781 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7782 usesLibraryDep.DexJarBuildPath().Path())
7783 })
7784
7785 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7786 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7787 image_name: "art",
7788 contents: ["libfoo"],
7789 `)+`
7790 java_sdk_library_import {
7791 name: "libfoo",
7792 public: {
7793 jars: ["libbar.jar"],
7794 },
7795 apex_available: [
7796 "com.android.myapex",
7797 "com.android.myapex_compressed",
7798 ],
7799 compile_dex: true,
7800 }
7801 `)
7802 })
7803}
7804
Jooyung Han548640b2020-04-27 12:10:30 +09007805func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7806 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7807 apex {
7808 name: "myapex",
7809 key: "myapex.key",
7810 updatable: true,
7811 }
7812
7813 apex_key {
7814 name: "myapex.key",
7815 public_key: "testkey.avbpubkey",
7816 private_key: "testkey.pem",
7817 }
7818 `)
7819}
7820
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007821func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7822 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7823 apex {
7824 name: "myapex",
7825 key: "myapex.key",
7826 }
7827
7828 apex_key {
7829 name: "myapex.key",
7830 public_key: "testkey.avbpubkey",
7831 private_key: "testkey.pem",
7832 }
7833 `)
7834}
7835
Daniel Norman69109112021-12-02 12:52:42 -08007836func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7837 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7838 apex {
7839 name: "myapex",
7840 key: "myapex.key",
7841 updatable: true,
7842 soc_specific: true,
7843 }
7844
7845 apex_key {
7846 name: "myapex.key",
7847 public_key: "testkey.avbpubkey",
7848 private_key: "testkey.pem",
7849 }
7850 `)
7851}
7852
satayevb98371c2021-06-15 16:49:50 +01007853func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7854 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7855 apex {
7856 name: "myapex",
7857 key: "myapex.key",
7858 systemserverclasspath_fragments: [
7859 "mysystemserverclasspathfragment",
7860 ],
7861 min_sdk_version: "29",
7862 updatable: true,
7863 }
7864
7865 apex_key {
7866 name: "myapex.key",
7867 public_key: "testkey.avbpubkey",
7868 private_key: "testkey.pem",
7869 }
7870
7871 java_library {
7872 name: "foo",
7873 srcs: ["b.java"],
7874 min_sdk_version: "29",
7875 installable: true,
7876 apex_available: [
7877 "myapex",
7878 ],
7879 }
7880
7881 systemserverclasspath_fragment {
7882 name: "mysystemserverclasspathfragment",
7883 generate_classpaths_proto: false,
7884 contents: [
7885 "foo",
7886 ],
7887 apex_available: [
7888 "myapex",
7889 ],
7890 }
satayevabcd5972021-08-06 17:49:46 +01007891 `,
7892 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7893 )
satayevb98371c2021-06-15 16:49:50 +01007894}
7895
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007896func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007897 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7898 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7899 // modules to be included in the BootJars.
7900 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7901 return android.GroupFixturePreparers(
7902 dexpreopt.FixtureSetBootJars(bootJars...),
7903 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7904 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7905 }),
7906 )
7907 }
7908
7909 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7910 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7911 // specified in the ArtApexJars configuration.
7912 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7913 return android.GroupFixturePreparers(
7914 dexpreopt.FixtureSetArtBootJars(bootJars...),
7915 dexpreopt.FixtureSetBootJars(bootJars...),
7916 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7917 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7918 }),
7919 )
7920 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007921
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007922 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007923 preparer := android.GroupFixturePreparers(
7924 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7925 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7926 )
7927 fragments := []java.ApexVariantReference{
7928 {
7929 Apex: proptools.StringPtr("com.android.art.debug"),
7930 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7931 },
7932 {
7933 Apex: proptools.StringPtr("some-non-updatable-apex"),
7934 Module: proptools.StringPtr("some-non-updatable-fragment"),
7935 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007936 }
satayevabcd5972021-08-06 17:49:46 +01007937 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007938 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007939
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007940 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007941 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7942 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007943 preparer := android.GroupFixturePreparers(
7944 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7945 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7946 )
Paul Duffin60264a02021-04-12 20:02:36 +01007947 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007948 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007949
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007950 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 +01007951 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 +01007952 // Update the dexpreopt ArtApexJars directly.
7953 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7954 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007955 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007956
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007957 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 +01007958 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 +01007959 // Update the dexpreopt ArtApexJars directly.
7960 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7961 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007962 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007963
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007964 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 +01007965 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 +01007966 preparer := android.GroupFixturePreparers(
7967 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7968 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7969 )
Paul Duffin60264a02021-04-12 20:02:36 +01007970 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007971 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007972
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007973 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 +01007974 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007975 fragment := java.ApexVariantReference{
7976 Apex: proptools.StringPtr("some-non-updatable-apex"),
7977 Module: proptools.StringPtr("some-non-updatable-fragment"),
7978 }
7979 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007980 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007981
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007982 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007983 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007984 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7985 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007986 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007987
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007988 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007989 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007990 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7991 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007992 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007993
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007994 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007995 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007996 // Update the dexpreopt ArtApexJars directly.
7997 preparer := prepareSetArtJars("platform:some-platform-lib")
7998 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007999 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008000
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008001 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008002 preparer := android.GroupFixturePreparers(
8003 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8004 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8005 )
8006 fragments := []java.ApexVariantReference{
8007 {
8008 Apex: proptools.StringPtr("some-non-updatable-apex"),
8009 Module: proptools.StringPtr("some-non-updatable-fragment"),
8010 },
8011 }
8012 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008013 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008014}
8015
8016func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008017 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008018 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008019 fragment := java.ApexVariantReference{
8020 Apex: proptools.StringPtr("myapex"),
8021 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8022 }
8023
Paul Duffin064b70c2020-11-02 17:32:38 +00008024 testDexpreoptWithApexes(t, `
8025 prebuilt_apex {
8026 name: "myapex" ,
8027 arch: {
8028 arm64: {
8029 src: "myapex-arm64.apex",
8030 },
8031 arm: {
8032 src: "myapex-arm.apex",
8033 },
8034 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008035 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8036 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008037
Paul Duffin89f570a2021-06-16 01:42:33 +01008038 prebuilt_bootclasspath_fragment {
8039 name: "my-bootclasspath-fragment",
8040 contents: ["libfoo"],
8041 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008042 hidden_api: {
8043 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8044 metadata: "my-bootclasspath-fragment/metadata.csv",
8045 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008046 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8047 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8048 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008049 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008050 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008051
Paul Duffin89f570a2021-06-16 01:42:33 +01008052 java_import {
8053 name: "libfoo",
8054 jars: ["libfoo.jar"],
8055 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008056 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008057 }
8058 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008059 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008060}
8061
Spandan Dasf14e2542021-11-12 00:01:37 +00008062func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008063 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008064 bp += `
8065 apex_key {
8066 name: "myapex.key",
8067 public_key: "testkey.avbpubkey",
8068 private_key: "testkey.pem",
8069 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008070 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008071 "lib1/src/A.java": nil,
8072 "lib2/src/B.java": nil,
8073 "system/sepolicy/apex/myapex-file_contexts": nil,
8074 }
8075
Paul Duffin45338f02021-03-30 23:07:52 +01008076 errorHandler := android.FixtureExpectsNoErrors
8077 if errmsg != "" {
8078 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008079 }
Colin Crossae8600b2020-10-29 17:09:13 -07008080
Paul Duffin45338f02021-03-30 23:07:52 +01008081 android.GroupFixturePreparers(
8082 android.PrepareForTestWithAndroidBuildComponents,
8083 java.PrepareForTestWithJavaBuildComponents,
8084 PrepareForTestWithApexBuildComponents,
8085 android.PrepareForTestWithNeverallowRules(rules),
8086 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008087 apexBootJars := make([]string, 0, len(bootJars))
8088 for _, apexBootJar := range bootJars {
8089 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008090 }
satayevd604b212021-07-21 14:23:52 +01008091 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008092 }),
8093 fs.AddToFixture(),
8094 ).
8095 ExtendWithErrorHandler(errorHandler).
8096 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008097}
8098
8099func TestApexPermittedPackagesRules(t *testing.T) {
8100 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008101 name string
8102 expectedError string
8103 bp string
8104 bootJars []string
8105 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008106 }{
8107
8108 {
8109 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8110 expectedError: "",
8111 bp: `
8112 java_library {
8113 name: "bcp_lib1",
8114 srcs: ["lib1/src/*.java"],
8115 permitted_packages: ["foo.bar"],
8116 apex_available: ["myapex"],
8117 sdk_version: "none",
8118 system_modules: "none",
8119 }
8120 java_library {
8121 name: "nonbcp_lib2",
8122 srcs: ["lib2/src/*.java"],
8123 apex_available: ["myapex"],
8124 permitted_packages: ["a.b"],
8125 sdk_version: "none",
8126 system_modules: "none",
8127 }
8128 apex {
8129 name: "myapex",
8130 key: "myapex.key",
8131 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008132 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008133 }`,
8134 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008135 bcpPermittedPackages: map[string][]string{
8136 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008137 "foo.bar",
8138 },
8139 },
8140 },
8141 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008142 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008143 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 +01008144 bp: `
8145 java_library {
8146 name: "bcp_lib1",
8147 srcs: ["lib1/src/*.java"],
8148 apex_available: ["myapex"],
8149 permitted_packages: ["foo.bar"],
8150 sdk_version: "none",
8151 system_modules: "none",
8152 }
8153 java_library {
8154 name: "bcp_lib2",
8155 srcs: ["lib2/src/*.java"],
8156 apex_available: ["myapex"],
8157 permitted_packages: ["foo.bar", "bar.baz"],
8158 sdk_version: "none",
8159 system_modules: "none",
8160 }
8161 apex {
8162 name: "myapex",
8163 key: "myapex.key",
8164 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008165 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008166 }
8167 `,
8168 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008169 bcpPermittedPackages: map[string][]string{
8170 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008171 "foo.bar",
8172 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008173 "bcp_lib2": []string{
8174 "foo.bar",
8175 },
8176 },
8177 },
8178 {
8179 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8180 expectedError: "",
8181 bp: `
8182 java_library {
8183 name: "bcp_lib_restricted",
8184 srcs: ["lib1/src/*.java"],
8185 apex_available: ["myapex"],
8186 permitted_packages: ["foo.bar"],
8187 sdk_version: "none",
8188 min_sdk_version: "29",
8189 system_modules: "none",
8190 }
8191 java_library {
8192 name: "bcp_lib_unrestricted",
8193 srcs: ["lib2/src/*.java"],
8194 apex_available: ["myapex"],
8195 permitted_packages: ["foo.bar", "bar.baz"],
8196 sdk_version: "none",
8197 min_sdk_version: "29",
8198 system_modules: "none",
8199 }
8200 apex {
8201 name: "myapex",
8202 key: "myapex.key",
8203 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8204 updatable: true,
8205 min_sdk_version: "29",
8206 }
8207 `,
8208 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8209 bcpPermittedPackages: map[string][]string{
8210 "bcp_lib1_non_updateable": []string{
8211 "foo.bar",
8212 },
8213 // 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 +01008214 },
8215 },
8216 }
8217 for _, tc := range testcases {
8218 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008219 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8220 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008221 })
8222 }
8223}
8224
Jiyong Park62304bb2020-04-13 16:19:48 +09008225func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008226 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008227 apex {
8228 name: "myapex",
8229 key: "myapex.key",
8230 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008231 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008232 }
8233
8234 apex_key {
8235 name: "myapex.key",
8236 public_key: "testkey.avbpubkey",
8237 private_key: "testkey.pem",
8238 }
8239
8240 cc_library {
8241 name: "mylib",
8242 srcs: ["mylib.cpp"],
8243 system_shared_libs: [],
8244 stl: "none",
8245 stubs: {
8246 versions: ["1"],
8247 },
8248 apex_available: ["myapex"],
8249 }
8250
8251 cc_library {
8252 name: "myprivlib",
8253 srcs: ["mylib.cpp"],
8254 system_shared_libs: [],
8255 stl: "none",
8256 apex_available: ["myapex"],
8257 }
8258
8259
8260 cc_test {
8261 name: "mytest",
8262 gtest: false,
8263 srcs: ["mylib.cpp"],
8264 system_shared_libs: [],
8265 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008266 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008267 test_for: ["myapex"]
8268 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008269
8270 cc_library {
8271 name: "mytestlib",
8272 srcs: ["mylib.cpp"],
8273 system_shared_libs: [],
8274 shared_libs: ["mylib", "myprivlib"],
8275 stl: "none",
8276 test_for: ["myapex"],
8277 }
8278
8279 cc_benchmark {
8280 name: "mybench",
8281 srcs: ["mylib.cpp"],
8282 system_shared_libs: [],
8283 shared_libs: ["mylib", "myprivlib"],
8284 stl: "none",
8285 test_for: ["myapex"],
8286 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008287 `)
8288
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008289 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008290 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008291 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8292 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8293 }
8294
8295 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008296 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008297 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8298 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8299 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8300}
Jiyong Park46a512f2020-12-04 18:02:13 +09008301
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008302func TestIndirectTestFor(t *testing.T) {
8303 ctx := testApex(t, `
8304 apex {
8305 name: "myapex",
8306 key: "myapex.key",
8307 native_shared_libs: ["mylib", "myprivlib"],
8308 updatable: false,
8309 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008310
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008311 apex_key {
8312 name: "myapex.key",
8313 public_key: "testkey.avbpubkey",
8314 private_key: "testkey.pem",
8315 }
8316
8317 cc_library {
8318 name: "mylib",
8319 srcs: ["mylib.cpp"],
8320 system_shared_libs: [],
8321 stl: "none",
8322 stubs: {
8323 versions: ["1"],
8324 },
8325 apex_available: ["myapex"],
8326 }
8327
8328 cc_library {
8329 name: "myprivlib",
8330 srcs: ["mylib.cpp"],
8331 system_shared_libs: [],
8332 stl: "none",
8333 shared_libs: ["mylib"],
8334 apex_available: ["myapex"],
8335 }
8336
8337 cc_library {
8338 name: "mytestlib",
8339 srcs: ["mylib.cpp"],
8340 system_shared_libs: [],
8341 shared_libs: ["myprivlib"],
8342 stl: "none",
8343 test_for: ["myapex"],
8344 }
8345 `)
8346
8347 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008348 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008349 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8350 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8351 }
8352
8353 // The platform variant of mytestlib links to the platform variant of the
8354 // internal myprivlib.
8355 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8356
8357 // The platform variant of myprivlib links to the platform variant of mylib
8358 // and bypasses its stubs.
8359 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 +09008360}
8361
Martin Stjernholmec009002021-03-27 15:18:31 +00008362func TestTestForForLibInOtherApex(t *testing.T) {
8363 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8364 _ = testApex(t, `
8365 apex {
8366 name: "com.android.art",
8367 key: "myapex.key",
8368 native_shared_libs: ["mylib"],
8369 updatable: false,
8370 }
8371
8372 apex {
8373 name: "com.android.art.debug",
8374 key: "myapex.key",
8375 native_shared_libs: ["mylib", "mytestlib"],
8376 updatable: false,
8377 }
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: ["com.android.art", "com.android.art.debug"],
8394 }
8395
8396 cc_library {
8397 name: "mytestlib",
8398 srcs: ["mylib.cpp"],
8399 system_shared_libs: [],
8400 shared_libs: ["mylib"],
8401 stl: "none",
8402 apex_available: ["com.android.art.debug"],
8403 test_for: ["com.android.art"],
8404 }
8405 `,
8406 android.MockFS{
8407 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8408 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8409 }.AddToFixture())
8410}
8411
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008412// TODO(jungjw): Move this to proptools
8413func intPtr(i int) *int {
8414 return &i
8415}
8416
8417func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008418 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008419 apex_set {
8420 name: "myapex",
8421 set: "myapex.apks",
8422 filename: "foo_v2.apex",
8423 overrides: ["foo"],
8424 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008425 `,
8426 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8427 variables.Platform_sdk_version = intPtr(30)
8428 }),
8429 android.FixtureModifyConfig(func(config android.Config) {
8430 config.Targets[android.Android] = []android.Target{
8431 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8432 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8433 }
8434 }),
8435 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008436
Paul Duffin24704672021-04-06 16:09:30 +01008437 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008438
8439 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008440 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008441 actual := extractedApex.Args["abis"]
8442 expected := "ARMEABI_V7A,ARM64_V8A"
8443 if actual != expected {
8444 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8445 }
8446 actual = extractedApex.Args["sdk-version"]
8447 expected = "30"
8448 if actual != expected {
8449 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8450 }
8451
Paul Duffin6717d882021-06-15 19:09:41 +01008452 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008453 a := m.Module().(*ApexSet)
8454 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008455 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008456 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8457 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8458 }
8459}
8460
Anton Hansson805e0a52022-11-25 14:06:46 +00008461func TestApexSet_NativeBridge(t *testing.T) {
8462 ctx := testApex(t, `
8463 apex_set {
8464 name: "myapex",
8465 set: "myapex.apks",
8466 filename: "foo_v2.apex",
8467 overrides: ["foo"],
8468 }
8469 `,
8470 android.FixtureModifyConfig(func(config android.Config) {
8471 config.Targets[android.Android] = []android.Target{
8472 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8473 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8474 }
8475 }),
8476 )
8477
8478 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8479
8480 // Check extract_apks tool parameters. No native bridge arch expected
8481 extractedApex := m.Output("extracted/myapex.apks")
8482 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8483}
8484
Jiyong Park7d95a512020-05-10 15:16:24 +09008485func TestNoStaticLinkingToStubsLib(t *testing.T) {
8486 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8487 apex {
8488 name: "myapex",
8489 key: "myapex.key",
8490 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008491 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008492 }
8493
8494 apex_key {
8495 name: "myapex.key",
8496 public_key: "testkey.avbpubkey",
8497 private_key: "testkey.pem",
8498 }
8499
8500 cc_library {
8501 name: "mylib",
8502 srcs: ["mylib.cpp"],
8503 static_libs: ["otherlib"],
8504 system_shared_libs: [],
8505 stl: "none",
8506 apex_available: [ "myapex" ],
8507 }
8508
8509 cc_library {
8510 name: "otherlib",
8511 srcs: ["mylib.cpp"],
8512 system_shared_libs: [],
8513 stl: "none",
8514 stubs: {
8515 versions: ["1", "2", "3"],
8516 },
8517 apex_available: [ "myapex" ],
8518 }
8519 `)
8520}
8521
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008522func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008523 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008524 apex {
8525 name: "myapex",
8526 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008527 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008528 custom_sign_tool: "sign_myapex",
8529 }
8530
8531 apex_key {
8532 name: "myapex.key",
8533 public_key: "testkey.avbpubkey",
8534 private_key: "testkey.pem",
8535 }
8536 `)
8537
8538 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8539 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8540 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"`)
8541}
8542
8543func TestApexKeysTxtOverrides(t *testing.T) {
8544 ctx := testApex(t, `
8545 apex {
8546 name: "myapex",
8547 key: "myapex.key",
8548 updatable: false,
8549 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008550 }
8551
8552 apex_key {
8553 name: "myapex.key",
8554 public_key: "testkey.avbpubkey",
8555 private_key: "testkey.pem",
8556 }
8557
8558 prebuilt_apex {
8559 name: "myapex",
8560 prefer: true,
8561 arch: {
8562 arm64: {
8563 src: "myapex-arm64.apex",
8564 },
8565 arm: {
8566 src: "myapex-arm.apex",
8567 },
8568 },
8569 }
8570
8571 apex_set {
8572 name: "myapex_set",
8573 set: "myapex.apks",
8574 filename: "myapex_set.apex",
8575 overrides: ["myapex"],
8576 }
8577 `)
8578
8579 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8580 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8581 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 +09008582 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 +09008583}
8584
Jooyung Han938b5932020-06-20 12:47:47 +09008585func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008586 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008587 apex {
8588 name: "myapex",
8589 key: "myapex.key",
8590 apps: ["app"],
8591 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008592 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008593 }
8594
8595 apex_key {
8596 name: "myapex.key",
8597 public_key: "testkey.avbpubkey",
8598 private_key: "testkey.pem",
8599 }
8600
8601 android_app {
8602 name: "app",
8603 srcs: ["foo/bar/MyClass.java"],
8604 package_name: "foo",
8605 sdk_version: "none",
8606 system_modules: "none",
8607 apex_available: [ "myapex" ],
8608 }
8609 `, withFiles(map[string][]byte{
8610 "sub/Android.bp": []byte(`
8611 override_apex {
8612 name: "override_myapex",
8613 base: "myapex",
8614 apps: ["override_app"],
8615 allowed_files: ":allowed",
8616 }
8617 // Overridable "path" property should be referenced indirectly
8618 filegroup {
8619 name: "allowed",
8620 srcs: ["allowed.txt"],
8621 }
8622 override_android_app {
8623 name: "override_app",
8624 base: "app",
8625 package_name: "bar",
8626 }
8627 `),
8628 }))
8629
8630 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8631 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8632 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8633 }
8634
8635 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8636 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8637 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8638 }
8639}
8640
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008641func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008642 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008643 apex {
8644 name: "myapex",
8645 key: "myapex.key",
8646 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008647 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008648 }
8649
8650 apex_key {
8651 name: "myapex.key",
8652 public_key: "testkey.avbpubkey",
8653 private_key: "testkey.pem",
8654 }
8655
8656 cc_library {
8657 name: "mylib",
8658 srcs: ["mylib.cpp"],
8659 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008660 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008661 },
8662 apex_available: ["myapex"],
8663 }
8664
8665 cc_prebuilt_library_shared {
8666 name: "mylib",
8667 prefer: false,
8668 srcs: ["prebuilt.so"],
8669 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008670 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008671 },
8672 apex_available: ["myapex"],
8673 }
8674 `)
8675}
8676
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008677func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008678 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008679 apex {
8680 name: "myapex",
8681 key: "myapex.key",
8682 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008683 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008684 }
8685 apex_key {
8686 name: "myapex.key",
8687 public_key: "testkey.avbpubkey",
8688 private_key: "testkey.pem",
8689 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008690 `,
8691 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8692 variables.CompressedApex = proptools.BoolPtr(true)
8693 }),
8694 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008695
8696 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8697 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8698
8699 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8700 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8701
8702 // Make sure output of bundle is .capex
8703 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8704 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8705
8706 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008707 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008708 var builder strings.Builder
8709 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8710 androidMk := builder.String()
8711 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8712}
8713
Martin Stjernholm2856c662020-12-02 15:03:42 +00008714func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008715 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008716 apex {
8717 name: "myapex",
8718 key: "myapex.key",
8719 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008720 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008721 }
8722
8723 apex_key {
8724 name: "myapex.key",
8725 public_key: "testkey.avbpubkey",
8726 private_key: "testkey.pem",
8727 }
8728
8729 cc_library {
8730 name: "mylib",
8731 srcs: ["mylib.cpp"],
8732 apex_available: ["myapex"],
8733 shared_libs: ["otherlib"],
8734 system_shared_libs: [],
8735 }
8736
8737 cc_library {
8738 name: "otherlib",
8739 srcs: ["mylib.cpp"],
8740 stubs: {
8741 versions: ["current"],
8742 },
8743 }
8744
8745 cc_prebuilt_library_shared {
8746 name: "otherlib",
8747 prefer: true,
8748 srcs: ["prebuilt.so"],
8749 stubs: {
8750 versions: ["current"],
8751 },
8752 }
8753 `)
8754
8755 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008756 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008757 var builder strings.Builder
8758 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8759 androidMk := builder.String()
8760
8761 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8762 // a thing there.
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008763 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 +00008764}
8765
Jiyong Parke3867542020-12-03 17:28:25 +09008766func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008767 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008768 apex {
8769 name: "myapex",
8770 key: "myapex.key",
8771 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008772 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008773 }
8774
8775 apex_key {
8776 name: "myapex.key",
8777 public_key: "testkey.avbpubkey",
8778 private_key: "testkey.pem",
8779 }
8780
8781 cc_library {
8782 name: "mylib",
8783 srcs: ["mylib.cpp"],
8784 system_shared_libs: [],
8785 stl: "none",
8786 apex_available: ["myapex"],
8787 shared_libs: ["mylib2"],
8788 target: {
8789 apex: {
8790 exclude_shared_libs: ["mylib2"],
8791 },
8792 },
8793 }
8794
8795 cc_library {
8796 name: "mylib2",
8797 srcs: ["mylib.cpp"],
8798 system_shared_libs: [],
8799 stl: "none",
8800 }
8801 `)
8802
8803 // Check if mylib is linked to mylib2 for the non-apex target
8804 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8805 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8806
8807 // Make sure that the link doesn't occur for the apex target
8808 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8809 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8810
8811 // It shouldn't appear in the copy cmd as well.
8812 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8813 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8814}
8815
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008816func TestPrebuiltStubLibDep(t *testing.T) {
8817 bpBase := `
8818 apex {
8819 name: "myapex",
8820 key: "myapex.key",
8821 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008822 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008823 }
8824 apex_key {
8825 name: "myapex.key",
8826 public_key: "testkey.avbpubkey",
8827 private_key: "testkey.pem",
8828 }
8829 cc_library {
8830 name: "mylib",
8831 srcs: ["mylib.cpp"],
8832 apex_available: ["myapex"],
8833 shared_libs: ["stublib"],
8834 system_shared_libs: [],
8835 }
8836 apex {
8837 name: "otherapex",
8838 enabled: %s,
8839 key: "myapex.key",
8840 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008841 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008842 }
8843 `
8844
8845 stublibSourceBp := `
8846 cc_library {
8847 name: "stublib",
8848 srcs: ["mylib.cpp"],
8849 apex_available: ["otherapex"],
8850 system_shared_libs: [],
8851 stl: "none",
8852 stubs: {
8853 versions: ["1"],
8854 },
8855 }
8856 `
8857
8858 stublibPrebuiltBp := `
8859 cc_prebuilt_library_shared {
8860 name: "stublib",
8861 srcs: ["prebuilt.so"],
8862 apex_available: ["otherapex"],
8863 stubs: {
8864 versions: ["1"],
8865 },
8866 %s
8867 }
8868 `
8869
8870 tests := []struct {
8871 name string
8872 stublibBp string
8873 usePrebuilt bool
8874 modNames []string // Modules to collect AndroidMkEntries for
8875 otherApexEnabled []string
8876 }{
8877 {
8878 name: "only_source",
8879 stublibBp: stublibSourceBp,
8880 usePrebuilt: false,
8881 modNames: []string{"stublib"},
8882 otherApexEnabled: []string{"true", "false"},
8883 },
8884 {
8885 name: "source_preferred",
8886 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8887 usePrebuilt: false,
8888 modNames: []string{"stublib", "prebuilt_stublib"},
8889 otherApexEnabled: []string{"true", "false"},
8890 },
8891 {
8892 name: "prebuilt_preferred",
8893 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8894 usePrebuilt: true,
8895 modNames: []string{"stublib", "prebuilt_stublib"},
8896 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8897 },
8898 {
8899 name: "only_prebuilt",
8900 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8901 usePrebuilt: true,
8902 modNames: []string{"stublib"},
8903 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8904 },
8905 }
8906
8907 for _, test := range tests {
8908 t.Run(test.name, func(t *testing.T) {
8909 for _, otherApexEnabled := range test.otherApexEnabled {
8910 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008911 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008912
8913 type modAndMkEntries struct {
8914 mod *cc.Module
8915 mkEntries android.AndroidMkEntries
8916 }
8917 entries := []*modAndMkEntries{}
8918
8919 // Gather shared lib modules that are installable
8920 for _, modName := range test.modNames {
8921 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8922 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8923 continue
8924 }
8925 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008926 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008927 continue
8928 }
Colin Crossaa255532020-07-03 13:18:24 -07008929 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008930 if ent.Disabled {
8931 continue
8932 }
8933 entries = append(entries, &modAndMkEntries{
8934 mod: mod,
8935 mkEntries: ent,
8936 })
8937 }
8938 }
8939 }
8940
8941 var entry *modAndMkEntries = nil
8942 for _, ent := range entries {
8943 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8944 if entry != nil {
8945 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8946 } else {
8947 entry = ent
8948 }
8949 }
8950 }
8951
8952 if entry == nil {
8953 t.Errorf("AndroidMk entry for \"stublib\" missing")
8954 } else {
8955 isPrebuilt := entry.mod.Prebuilt() != nil
8956 if isPrebuilt != test.usePrebuilt {
8957 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8958 }
8959 if !entry.mod.IsStubs() {
8960 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8961 }
8962 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8963 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8964 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008965 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008966 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008967 if !android.InList(expected, cflags) {
8968 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8969 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008970 }
8971 })
8972 }
8973 })
8974 }
8975}
8976
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008977func TestHostApexInHostOnlyBuild(t *testing.T) {
8978 testApex(t, `
8979 apex {
8980 name: "myapex",
8981 host_supported: true,
8982 key: "myapex.key",
8983 updatable: false,
8984 payload_type: "zip",
8985 }
8986 apex_key {
8987 name: "myapex.key",
8988 public_key: "testkey.avbpubkey",
8989 private_key: "testkey.pem",
8990 }
8991 `,
8992 android.FixtureModifyConfig(func(config android.Config) {
8993 // We may not have device targets in all builds, e.g. in
8994 // prebuilts/build-tools/build-prebuilts.sh
8995 config.Targets[android.Android] = []android.Target{}
8996 }))
8997}
8998
Colin Crossc33e5212021-05-25 18:16:02 -07008999func TestApexJavaCoverage(t *testing.T) {
9000 bp := `
9001 apex {
9002 name: "myapex",
9003 key: "myapex.key",
9004 java_libs: ["mylib"],
9005 bootclasspath_fragments: ["mybootclasspathfragment"],
9006 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9007 updatable: false,
9008 }
9009
9010 apex_key {
9011 name: "myapex.key",
9012 public_key: "testkey.avbpubkey",
9013 private_key: "testkey.pem",
9014 }
9015
9016 java_library {
9017 name: "mylib",
9018 srcs: ["mylib.java"],
9019 apex_available: ["myapex"],
9020 compile_dex: true,
9021 }
9022
9023 bootclasspath_fragment {
9024 name: "mybootclasspathfragment",
9025 contents: ["mybootclasspathlib"],
9026 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009027 hidden_api: {
9028 split_packages: ["*"],
9029 },
Colin Crossc33e5212021-05-25 18:16:02 -07009030 }
9031
9032 java_library {
9033 name: "mybootclasspathlib",
9034 srcs: ["mybootclasspathlib.java"],
9035 apex_available: ["myapex"],
9036 compile_dex: true,
9037 }
9038
9039 systemserverclasspath_fragment {
9040 name: "mysystemserverclasspathfragment",
9041 contents: ["mysystemserverclasspathlib"],
9042 apex_available: ["myapex"],
9043 }
9044
9045 java_library {
9046 name: "mysystemserverclasspathlib",
9047 srcs: ["mysystemserverclasspathlib.java"],
9048 apex_available: ["myapex"],
9049 compile_dex: true,
9050 }
9051 `
9052
9053 result := android.GroupFixturePreparers(
9054 PrepareForTestWithApexBuildComponents,
9055 prepareForTestWithMyapex,
9056 java.PrepareForTestWithJavaDefaultModules,
9057 android.PrepareForTestWithAndroidBuildComponents,
9058 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009059 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9060 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009061 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009062 ).RunTest(t)
9063
9064 // Make sure jacoco ran on both mylib and mybootclasspathlib
9065 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9066 t.Errorf("Failed to find jacoco rule for mylib")
9067 }
9068 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9069 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9070 }
9071 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9072 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9073 }
9074}
9075
Jiyong Park192600a2021-08-03 07:52:17 +00009076func TestProhibitStaticExecutable(t *testing.T) {
9077 testApexError(t, `executable mybin is static`, `
9078 apex {
9079 name: "myapex",
9080 key: "myapex.key",
9081 binaries: ["mybin"],
9082 min_sdk_version: "29",
9083 }
9084
9085 apex_key {
9086 name: "myapex.key",
9087 public_key: "testkey.avbpubkey",
9088 private_key: "testkey.pem",
9089 }
9090
9091 cc_binary {
9092 name: "mybin",
9093 srcs: ["mylib.cpp"],
9094 relative_install_path: "foo/bar",
9095 static_executable: true,
9096 system_shared_libs: [],
9097 stl: "none",
9098 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009099 min_sdk_version: "29",
9100 }
9101 `)
9102
9103 testApexError(t, `executable mybin.rust is static`, `
9104 apex {
9105 name: "myapex",
9106 key: "myapex.key",
9107 binaries: ["mybin.rust"],
9108 min_sdk_version: "29",
9109 }
9110
9111 apex_key {
9112 name: "myapex.key",
9113 public_key: "testkey.avbpubkey",
9114 private_key: "testkey.pem",
9115 }
9116
9117 rust_binary {
9118 name: "mybin.rust",
9119 srcs: ["foo.rs"],
9120 static_executable: true,
9121 apex_available: ["myapex"],
9122 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009123 }
9124 `)
9125}
9126
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009127func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9128 ctx := testApex(t, `
9129 apex {
9130 name: "myapex",
9131 key: "myapex.key",
9132 updatable: false,
9133 java_libs: ["foo"],
9134 }
9135
9136 apex_key {
9137 name: "myapex.key",
9138 public_key: "testkey.avbpubkey",
9139 private_key: "testkey.pem",
9140 }
9141
9142 java_library {
9143 name: "foo",
9144 srcs: ["foo.java"],
9145 apex_available: ["myapex"],
9146 installable: true,
9147 }
9148 `,
9149 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9150 )
9151
9152 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9153 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9154 var builder strings.Builder
9155 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9156 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009157 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 +00009158}
9159
9160func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9161 ctx := testApex(t, `
9162 prebuilt_apex {
9163 name: "myapex",
9164 arch: {
9165 arm64: {
9166 src: "myapex-arm64.apex",
9167 },
9168 arm: {
9169 src: "myapex-arm.apex",
9170 },
9171 },
9172 exported_java_libs: ["foo"],
9173 }
9174
9175 java_import {
9176 name: "foo",
9177 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009178 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009179 }
9180 `,
9181 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9182 )
9183
9184 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9185 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9186 mainModuleEntries := entriesList[0]
9187 android.AssertArrayString(t,
9188 "LOCAL_REQUIRED_MODULES",
9189 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9190 []string{
9191 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9192 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9193 })
9194}
9195
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009196func TestAndroidMk_RequiredModules(t *testing.T) {
9197 ctx := testApex(t, `
9198 apex {
9199 name: "myapex",
9200 key: "myapex.key",
9201 updatable: false,
9202 java_libs: ["foo"],
9203 required: ["otherapex"],
9204 }
9205
9206 apex {
9207 name: "otherapex",
9208 key: "myapex.key",
9209 updatable: false,
9210 java_libs: ["foo"],
9211 required: ["otherapex"],
9212 }
9213
9214 apex_key {
9215 name: "myapex.key",
9216 public_key: "testkey.avbpubkey",
9217 private_key: "testkey.pem",
9218 }
9219
9220 java_library {
9221 name: "foo",
9222 srcs: ["foo.java"],
9223 apex_available: ["myapex", "otherapex"],
9224 installable: true,
9225 }
9226 `)
9227
9228 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9229 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9230 var builder strings.Builder
9231 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9232 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009233 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009234}
9235
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009236func TestAndroidMk_RequiredDeps(t *testing.T) {
9237 ctx := testApex(t, `
9238 apex {
9239 name: "myapex",
9240 key: "myapex.key",
9241 updatable: false,
9242 }
9243
9244 apex_key {
9245 name: "myapex.key",
9246 public_key: "testkey.avbpubkey",
9247 private_key: "testkey.pem",
9248 }
9249 `)
9250
9251 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009252 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009253 data := android.AndroidMkDataForTest(t, ctx, bundle)
9254 var builder strings.Builder
9255 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9256 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009257 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009258
9259 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009260 flattenedBundle.makeModulesToInstall = append(flattenedBundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009261 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9262 var flattenedBuilder strings.Builder
9263 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9264 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009265 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009266}
9267
Jooyung Hana6d36672022-02-24 13:58:07 +09009268func TestApexOutputFileProducer(t *testing.T) {
9269 for _, tc := range []struct {
9270 name string
9271 ref string
9272 expected_data []string
9273 }{
9274 {
9275 name: "test_using_output",
9276 ref: ":myapex",
9277 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9278 },
9279 {
9280 name: "test_using_apex",
9281 ref: ":myapex{.apex}",
9282 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9283 },
9284 } {
9285 t.Run(tc.name, func(t *testing.T) {
9286 ctx := testApex(t, `
9287 apex {
9288 name: "myapex",
9289 key: "myapex.key",
9290 compressible: true,
9291 updatable: false,
9292 }
9293
9294 apex_key {
9295 name: "myapex.key",
9296 public_key: "testkey.avbpubkey",
9297 private_key: "testkey.pem",
9298 }
9299
9300 java_test {
9301 name: "`+tc.name+`",
9302 srcs: ["a.java"],
9303 data: ["`+tc.ref+`"],
9304 }
9305 `,
9306 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9307 variables.CompressedApex = proptools.BoolPtr(true)
9308 }))
9309 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9310 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9311 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9312 })
9313 }
9314}
9315
satayev758968a2021-12-06 11:42:40 +00009316func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9317 preparer := android.GroupFixturePreparers(
9318 PrepareForTestWithApexBuildComponents,
9319 prepareForTestWithMyapex,
9320 java.PrepareForTestWithJavaSdkLibraryFiles,
9321 java.PrepareForTestWithJavaDefaultModules,
9322 android.PrepareForTestWithAndroidBuildComponents,
9323 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9324 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9325 )
9326
9327 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9328 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9329 preparer.RunTestWithBp(t, `
9330 apex {
9331 name: "myapex",
9332 key: "myapex.key",
9333 bootclasspath_fragments: ["mybootclasspathfragment"],
9334 min_sdk_version: "30",
9335 updatable: false,
9336 }
9337
9338 apex_key {
9339 name: "myapex.key",
9340 public_key: "testkey.avbpubkey",
9341 private_key: "testkey.pem",
9342 }
9343
9344 bootclasspath_fragment {
9345 name: "mybootclasspathfragment",
9346 contents: ["mybootclasspathlib"],
9347 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009348 hidden_api: {
9349 split_packages: ["*"],
9350 },
satayev758968a2021-12-06 11:42:40 +00009351 }
9352
9353 java_sdk_library {
9354 name: "mybootclasspathlib",
9355 srcs: ["mybootclasspathlib.java"],
9356 apex_available: ["myapex"],
9357 compile_dex: true,
9358 unsafe_ignore_missing_latest_api: true,
9359 min_sdk_version: "31",
9360 static_libs: ["util"],
9361 }
9362
9363 java_library {
9364 name: "util",
9365 srcs: ["a.java"],
9366 apex_available: ["myapex"],
9367 min_sdk_version: "31",
9368 static_libs: ["another_util"],
9369 }
9370
9371 java_library {
9372 name: "another_util",
9373 srcs: ["a.java"],
9374 min_sdk_version: "31",
9375 apex_available: ["myapex"],
9376 }
9377 `)
9378 })
9379
9380 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9381 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9382 preparer.RunTestWithBp(t, `
9383 apex {
9384 name: "myapex",
9385 key: "myapex.key",
9386 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9387 min_sdk_version: "30",
9388 updatable: false,
9389 }
9390
9391 apex_key {
9392 name: "myapex.key",
9393 public_key: "testkey.avbpubkey",
9394 private_key: "testkey.pem",
9395 }
9396
9397 systemserverclasspath_fragment {
9398 name: "mysystemserverclasspathfragment",
9399 contents: ["mysystemserverclasspathlib"],
9400 apex_available: ["myapex"],
9401 }
9402
9403 java_sdk_library {
9404 name: "mysystemserverclasspathlib",
9405 srcs: ["mysystemserverclasspathlib.java"],
9406 apex_available: ["myapex"],
9407 compile_dex: true,
9408 min_sdk_version: "32",
9409 unsafe_ignore_missing_latest_api: true,
9410 static_libs: ["util"],
9411 }
9412
9413 java_library {
9414 name: "util",
9415 srcs: ["a.java"],
9416 apex_available: ["myapex"],
9417 min_sdk_version: "31",
9418 static_libs: ["another_util"],
9419 }
9420
9421 java_library {
9422 name: "another_util",
9423 srcs: ["a.java"],
9424 min_sdk_version: "31",
9425 apex_available: ["myapex"],
9426 }
9427 `)
9428 })
9429
9430 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9431 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9432 RunTestWithBp(t, `
9433 apex {
9434 name: "myapex",
9435 key: "myapex.key",
9436 bootclasspath_fragments: ["mybootclasspathfragment"],
9437 min_sdk_version: "30",
9438 updatable: false,
9439 }
9440
9441 apex_key {
9442 name: "myapex.key",
9443 public_key: "testkey.avbpubkey",
9444 private_key: "testkey.pem",
9445 }
9446
9447 bootclasspath_fragment {
9448 name: "mybootclasspathfragment",
9449 contents: ["mybootclasspathlib"],
9450 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009451 hidden_api: {
9452 split_packages: ["*"],
9453 },
satayev758968a2021-12-06 11:42:40 +00009454 }
9455
9456 java_sdk_library {
9457 name: "mybootclasspathlib",
9458 srcs: ["mybootclasspathlib.java"],
9459 apex_available: ["myapex"],
9460 compile_dex: true,
9461 unsafe_ignore_missing_latest_api: true,
9462 }
9463 `)
9464 })
9465
9466 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9467 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9468 RunTestWithBp(t, `
9469 apex {
9470 name: "myapex",
9471 key: "myapex.key",
9472 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9473 min_sdk_version: "30",
9474 updatable: false,
9475 }
9476
9477 apex_key {
9478 name: "myapex.key",
9479 public_key: "testkey.avbpubkey",
9480 private_key: "testkey.pem",
9481 }
9482
9483 systemserverclasspath_fragment {
9484 name: "mysystemserverclasspathfragment",
9485 contents: ["mysystemserverclasspathlib"],
9486 apex_available: ["myapex"],
9487 }
9488
9489 java_sdk_library {
9490 name: "mysystemserverclasspathlib",
9491 srcs: ["mysystemserverclasspathlib.java"],
9492 apex_available: ["myapex"],
9493 compile_dex: true,
9494 unsafe_ignore_missing_latest_api: true,
9495 }
9496 `)
9497 })
9498}
9499
Jiakai Zhang6decef92022-01-12 17:56:19 +00009500// Verifies that the APEX depends on all the Make modules in the list.
9501func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9502 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9503 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009504 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009505 }
9506}
9507
9508// Verifies that the APEX does not depend on any of the Make modules in the list.
9509func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9510 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9511 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009512 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009513 }
9514}
9515
Spandan Das66773252022-01-15 00:23:18 +00009516func TestApexStrictUpdtabilityLint(t *testing.T) {
9517 bpTemplate := `
9518 apex {
9519 name: "myapex",
9520 key: "myapex.key",
9521 java_libs: ["myjavalib"],
9522 updatable: %v,
9523 min_sdk_version: "29",
9524 }
9525 apex_key {
9526 name: "myapex.key",
9527 }
9528 java_library {
9529 name: "myjavalib",
9530 srcs: ["MyClass.java"],
9531 apex_available: [ "myapex" ],
9532 lint: {
9533 strict_updatability_linting: %v,
9534 },
9535 sdk_version: "current",
9536 min_sdk_version: "29",
9537 }
9538 `
9539 fs := android.MockFS{
9540 "lint-baseline.xml": nil,
9541 }
9542
9543 testCases := []struct {
9544 testCaseName string
9545 apexUpdatable bool
9546 javaStrictUpdtabilityLint bool
9547 lintFileExists bool
9548 disallowedFlagExpected bool
9549 }{
9550 {
9551 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9552 apexUpdatable: true,
9553 javaStrictUpdtabilityLint: true,
9554 lintFileExists: false,
9555 disallowedFlagExpected: false,
9556 },
9557 {
9558 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9559 apexUpdatable: false,
9560 javaStrictUpdtabilityLint: false,
9561 lintFileExists: true,
9562 disallowedFlagExpected: false,
9563 },
9564 {
9565 testCaseName: "non-updatable apex respects strict updatability of javalib",
9566 apexUpdatable: false,
9567 javaStrictUpdtabilityLint: true,
9568 lintFileExists: true,
9569 disallowedFlagExpected: true,
9570 },
9571 {
9572 testCaseName: "updatable apex sets strict updatability of javalib to true",
9573 apexUpdatable: true,
9574 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9575 lintFileExists: true,
9576 disallowedFlagExpected: true,
9577 },
9578 }
9579
9580 for _, testCase := range testCases {
9581 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9582 fixtures := []android.FixturePreparer{}
9583 if testCase.lintFileExists {
9584 fixtures = append(fixtures, fs.AddToFixture())
9585 }
9586
9587 result := testApex(t, bp, fixtures...)
9588 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9589 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9590 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9591
9592 if disallowedFlagActual != testCase.disallowedFlagExpected {
9593 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9594 }
9595 }
9596}
9597
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009598func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9599 bp := `
9600 apex {
9601 name: "myapex",
9602 key: "myapex.key",
9603 java_libs: ["myjavalib"],
9604 updatable: true,
9605 min_sdk_version: "29",
9606 }
9607 apex_key {
9608 name: "myapex.key",
9609 }
9610 java_library {
9611 name: "myjavalib",
9612 srcs: ["MyClass.java"],
9613 apex_available: [ "myapex" ],
9614 sdk_version: "current",
9615 min_sdk_version: "29",
9616 }
9617 `
9618
9619 testCases := []struct {
9620 testCaseName string
9621 moduleDirectory string
9622 disallowedFlagExpected bool
9623 }{
9624 {
9625 testCaseName: "lintable module defined outside libcore",
9626 moduleDirectory: "",
9627 disallowedFlagExpected: true,
9628 },
9629 {
9630 testCaseName: "lintable module defined in libcore root directory",
9631 moduleDirectory: "libcore/",
9632 disallowedFlagExpected: false,
9633 },
9634 {
9635 testCaseName: "lintable module defined in libcore child directory",
9636 moduleDirectory: "libcore/childdir/",
9637 disallowedFlagExpected: true,
9638 },
9639 }
9640
9641 for _, testCase := range testCases {
9642 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9643 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9644 result := testApex(t, "", lintFileCreator, bpFileCreator)
9645 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9646 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9647 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9648 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9649
9650 if disallowedFlagActual != testCase.disallowedFlagExpected {
9651 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9652 }
9653 }
9654}
9655
Spandan Das66773252022-01-15 00:23:18 +00009656// checks transtive deps of an apex coming from bootclasspath_fragment
9657func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9658 bp := `
9659 apex {
9660 name: "myapex",
9661 key: "myapex.key",
9662 bootclasspath_fragments: ["mybootclasspathfragment"],
9663 updatable: true,
9664 min_sdk_version: "29",
9665 }
9666 apex_key {
9667 name: "myapex.key",
9668 }
9669 bootclasspath_fragment {
9670 name: "mybootclasspathfragment",
9671 contents: ["myjavalib"],
9672 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009673 hidden_api: {
9674 split_packages: ["*"],
9675 },
Spandan Das66773252022-01-15 00:23:18 +00009676 }
9677 java_library {
9678 name: "myjavalib",
9679 srcs: ["MyClass.java"],
9680 apex_available: [ "myapex" ],
9681 sdk_version: "current",
9682 min_sdk_version: "29",
9683 compile_dex: true,
9684 }
9685 `
9686 fs := android.MockFS{
9687 "lint-baseline.xml": nil,
9688 }
9689
9690 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9691 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9692 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9693 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9694 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9695 }
9696}
9697
Spandan Das42e89502022-05-06 22:12:55 +00009698// updatable apexes should propagate updatable=true to its apps
9699func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9700 bp := `
9701 apex {
9702 name: "myapex",
9703 key: "myapex.key",
9704 updatable: %v,
9705 apps: [
9706 "myapp",
9707 ],
9708 min_sdk_version: "30",
9709 }
9710 apex_key {
9711 name: "myapex.key",
9712 }
9713 android_app {
9714 name: "myapp",
9715 updatable: %v,
9716 apex_available: [
9717 "myapex",
9718 ],
9719 sdk_version: "current",
9720 min_sdk_version: "30",
9721 }
9722 `
9723 testCases := []struct {
9724 name string
9725 apex_is_updatable_bp bool
9726 app_is_updatable_bp bool
9727 app_is_updatable_expected bool
9728 }{
9729 {
9730 name: "Non-updatable apex respects updatable property of non-updatable app",
9731 apex_is_updatable_bp: false,
9732 app_is_updatable_bp: false,
9733 app_is_updatable_expected: false,
9734 },
9735 {
9736 name: "Non-updatable apex respects updatable property of updatable app",
9737 apex_is_updatable_bp: false,
9738 app_is_updatable_bp: true,
9739 app_is_updatable_expected: true,
9740 },
9741 {
9742 name: "Updatable apex respects updatable property of updatable app",
9743 apex_is_updatable_bp: true,
9744 app_is_updatable_bp: true,
9745 app_is_updatable_expected: true,
9746 },
9747 {
9748 name: "Updatable apex sets updatable=true on non-updatable app",
9749 apex_is_updatable_bp: true,
9750 app_is_updatable_bp: false,
9751 app_is_updatable_expected: true,
9752 },
9753 }
9754 for _, testCase := range testCases {
9755 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9756 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9757 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9758 }
9759}
9760
Kiyoung Kim487689e2022-07-26 09:48:22 +09009761func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9762 bp := `
9763 apex {
9764 name: "myapex",
9765 key: "myapex.key",
9766 native_shared_libs: ["libfoo"],
9767 min_sdk_version: "29",
9768 }
9769 apex_key {
9770 name: "myapex.key",
9771 }
9772 cc_library {
9773 name: "libfoo",
9774 shared_libs: ["libc"],
9775 apex_available: ["myapex"],
9776 min_sdk_version: "29",
9777 }
9778 cc_api_library {
9779 name: "libc",
9780 src: "libc.so",
9781 min_sdk_version: "29",
9782 recovery_available: true,
9783 }
9784 api_imports {
9785 name: "api_imports",
9786 shared_libs: [
9787 "libc",
9788 ],
9789 header_libs: [],
9790 }
9791 `
9792 result := testApex(t, bp)
9793
9794 hasDep := func(m android.Module, wantDep android.Module) bool {
9795 t.Helper()
9796 var found bool
9797 result.VisitDirectDeps(m, func(dep blueprint.Module) {
9798 if dep == wantDep {
9799 found = true
9800 }
9801 })
9802 return found
9803 }
9804
9805 libfooApexVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex29").Module()
9806 libcApexVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared_apex29").Module()
9807
9808 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(libfooApexVariant, libcApexVariant))
9809
9810 // libfoo core variant should be buildable in the same inner tree since
9811 // certain mcombo files might build system and apexes in the same inner tree
9812 // libfoo core variant should link against source libc
9813 libfooCoreVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module()
9814 libcCoreVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared").Module()
9815 android.AssertBoolEquals(t, "core variant should link against source libc", true, hasDep(libfooCoreVariant, libcCoreVariant))
9816}
Dennis Shend4f5d932023-01-31 20:27:21 +00009817
9818func TestTrimmedApex(t *testing.T) {
9819 bp := `
9820 apex {
9821 name: "myapex",
9822 key: "myapex.key",
9823 native_shared_libs: ["libfoo","libbaz"],
9824 min_sdk_version: "29",
9825 trim_against: "mydcla",
9826 }
9827 apex {
9828 name: "mydcla",
9829 key: "myapex.key",
9830 native_shared_libs: ["libfoo","libbar"],
9831 min_sdk_version: "29",
9832 file_contexts: ":myapex-file_contexts",
9833 dynamic_common_lib_apex: true,
9834 }
9835 apex_key {
9836 name: "myapex.key",
9837 }
9838 cc_library {
9839 name: "libfoo",
9840 shared_libs: ["libc"],
9841 apex_available: ["myapex","mydcla"],
9842 min_sdk_version: "29",
9843 }
9844 cc_library {
9845 name: "libbar",
9846 shared_libs: ["libc"],
9847 apex_available: ["myapex","mydcla"],
9848 min_sdk_version: "29",
9849 }
9850 cc_library {
9851 name: "libbaz",
9852 shared_libs: ["libc"],
9853 apex_available: ["myapex","mydcla"],
9854 min_sdk_version: "29",
9855 }
9856 cc_api_library {
9857 name: "libc",
9858 src: "libc.so",
9859 min_sdk_version: "29",
9860 recovery_available: true,
9861 }
9862 api_imports {
9863 name: "api_imports",
9864 shared_libs: [
9865 "libc",
9866 ],
9867 header_libs: [],
9868 }
9869 `
9870 ctx := testApex(t, bp)
9871 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
9872 apexRule := module.MaybeRule("apexRule")
9873 if apexRule.Rule == nil {
9874 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
9875 }
9876
9877 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
9878 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
9879 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
9880 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
9881 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
9882 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
9883}