blob: ed5eb2e9addfae8e1f447f222209b17282882931 [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"
Colin Crossbd3a16b2023-04-25 11:30:51 -070036 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090037 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090038 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070039 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090040)
41
Jooyung Hand3639552019-08-09 12:57:43 +090042// names returns name list from white space separated string
43func names(s string) (ns []string) {
44 for _, n := range strings.Split(s, " ") {
45 if len(n) > 0 {
46 ns = append(ns, n)
47 }
48 }
49 return
50}
51
Paul Duffin40b62572021-03-20 11:39:01 +000052func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090053 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010054 android.GroupFixturePreparers(
55 prepareForApexTest,
56 android.GroupFixturePreparers(preparers...),
57 ).
Paul Duffine05480a2021-03-08 15:07:14 +000058 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000059 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090060}
61
Paul Duffin40b62572021-03-20 11:39:01 +000062func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090063 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010064
65 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000066 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010067 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000068 }
Paul Duffin284165a2021-03-29 01:50:31 +010069
70 result := android.GroupFixturePreparers(
71 prepareForApexTest,
72 android.GroupFixturePreparers(preparers...),
73 optionalBpPreparer,
74 ).RunTest(t)
75
Paul Duffine05480a2021-03-08 15:07:14 +000076 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090077}
78
Paul Duffin810f33d2021-03-09 14:12:32 +000079func withFiles(files android.MockFS) android.FixturePreparer {
80 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090081}
82
Paul Duffin810f33d2021-03-09 14:12:32 +000083func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
84 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090085 for k, v := range targets {
86 config.Targets[k] = v
87 }
Paul Duffin810f33d2021-03-09 14:12:32 +000088 })
Jooyung Han344d5432019-08-23 11:17:39 +090089}
90
Jooyung Han35155c42020-02-06 17:33:20 +090091// withNativeBridgeTargets sets configuration with targets including:
92// - X86_64 (primary)
93// - X86 (secondary)
94// - Arm64 on X86_64 (native bridge)
95// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000096var withNativeBridgeEnabled = android.FixtureModifyConfig(
97 func(config android.Config) {
98 config.Targets[android.Android] = []android.Target{
99 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
100 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
104 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
107 }
108 },
109)
110
111func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
112 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
113 variables.ManifestPackageNameOverrides = specs
114 })
Jooyung Han35155c42020-02-06 17:33:20 +0900115}
116
Albert Martineefabcf2022-03-21 20:11:16 +0000117func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
118 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
119 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
120 })
121}
122
Paul Duffin810f33d2021-03-09 14:12:32 +0000123var withBinder32bit = android.FixtureModifyProductVariables(
124 func(variables android.FixtureProductVariables) {
125 variables.Binder32bit = proptools.BoolPtr(true)
126 },
127)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900128
Paul Duffin810f33d2021-03-09 14:12:32 +0000129var withUnbundledBuild = android.FixtureModifyProductVariables(
130 func(variables android.FixtureProductVariables) {
131 variables.Unbundled_build = proptools.BoolPtr(true)
132 },
133)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900134
Paul Duffin284165a2021-03-29 01:50:31 +0100135// Legacy preparer used for running tests within the apex package.
136//
137// This includes everything that was needed to run any test in the apex package prior to the
138// introduction of the test fixtures. Tests that are being converted to use fixtures directly
139// rather than through the testApex...() methods should avoid using this and instead use the
140// various preparers directly, using android.GroupFixturePreparers(...) to group them when
141// necessary.
142//
143// deprecated
144var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000145 // General preparers in alphabetical order as test infrastructure will enforce correct
146 // registration order.
147 android.PrepareForTestWithAndroidBuildComponents,
148 bpf.PrepareForTestWithBpf,
149 cc.PrepareForTestWithCcBuildComponents,
150 java.PrepareForTestWithJavaDefaultModules,
151 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
152 rust.PrepareForTestWithRustDefaultModules,
153 sh.PrepareForTestWithShBuildComponents,
154
155 PrepareForTestWithApexBuildComponents,
156
157 // Additional apex test specific preparers.
158 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
159 filegroup {
160 name: "myapex-file_contexts",
161 srcs: [
162 "apex/myapex-file_contexts",
163 ],
164 }
165 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000166 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000167 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000168 "a.java": nil,
169 "PrebuiltAppFoo.apk": nil,
170 "PrebuiltAppFooPriv.apk": nil,
171 "apex_manifest.json": nil,
172 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000173 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
174 "system/sepolicy/apex/myapex2-file_contexts": nil,
175 "system/sepolicy/apex/otherapex-file_contexts": nil,
176 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
177 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700178 "mylib.cpp": nil,
179 "mytest.cpp": nil,
180 "mytest1.cpp": nil,
181 "mytest2.cpp": nil,
182 "mytest3.cpp": nil,
183 "myprebuilt": nil,
184 "my_include": nil,
185 "foo/bar/MyClass.java": nil,
186 "prebuilt.jar": nil,
187 "prebuilt.so": nil,
188 "vendor/foo/devkeys/test.x509.pem": nil,
189 "vendor/foo/devkeys/test.pk8": nil,
190 "testkey.x509.pem": nil,
191 "testkey.pk8": nil,
192 "testkey.override.x509.pem": nil,
193 "testkey.override.pk8": nil,
194 "vendor/foo/devkeys/testkey.avbpubkey": nil,
195 "vendor/foo/devkeys/testkey.pem": nil,
196 "NOTICE": nil,
197 "custom_notice": nil,
198 "custom_notice_for_static_lib": nil,
199 "testkey2.avbpubkey": nil,
200 "testkey2.pem": nil,
201 "myapex-arm64.apex": nil,
202 "myapex-arm.apex": nil,
203 "myapex.apks": nil,
204 "frameworks/base/api/current.txt": nil,
205 "framework/aidl/a.aidl": nil,
206 "dummy.txt": nil,
207 "baz": nil,
208 "bar/baz": nil,
209 "testdata/baz": nil,
210 "AppSet.apks": nil,
211 "foo.rs": nil,
212 "libfoo.jar": nil,
213 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000214 },
215 ),
216
217 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
218 variables.DeviceVndkVersion = proptools.StringPtr("current")
219 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
220 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
221 variables.Platform_sdk_codename = proptools.StringPtr("Q")
222 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000223 // "Tiramisu" needs to be in the next line for compatibility with soong code,
224 // not because of these tests specifically (it's not used by the tests)
225 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900226 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000227 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000228 }),
229)
230
Paul Duffin52bfaa42021-03-23 23:40:12 +0000231var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
232 "system/sepolicy/apex/myapex-file_contexts": nil,
233})
234
Jooyung Han643adc42020-02-27 13:50:06 +0900235// ensure that 'result' equals 'expected'
236func ensureEquals(t *testing.T, result string, expected string) {
237 t.Helper()
238 if result != expected {
239 t.Errorf("%q != %q", expected, result)
240 }
241}
242
Jiyong Park25fc6a92018-11-18 18:02:45 +0900243// ensure that 'result' contains 'expected'
244func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900245 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900246 if !strings.Contains(result, expected) {
247 t.Errorf("%q is not found in %q", expected, result)
248 }
249}
250
Liz Kammer5bd365f2020-05-27 15:15:11 -0700251// ensure that 'result' contains 'expected' exactly one time
252func ensureContainsOnce(t *testing.T, result string, expected string) {
253 t.Helper()
254 count := strings.Count(result, expected)
255 if count != 1 {
256 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
257 }
258}
259
Jiyong Park25fc6a92018-11-18 18:02:45 +0900260// ensures that 'result' does not contain 'notExpected'
261func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900262 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900263 if strings.Contains(result, notExpected) {
264 t.Errorf("%q is found in %q", notExpected, result)
265 }
266}
267
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700268func ensureMatches(t *testing.T, result string, expectedRex string) {
269 ok, err := regexp.MatchString(expectedRex, result)
270 if err != nil {
271 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
272 return
273 }
274 if !ok {
275 t.Errorf("%s does not match regular expession %s", result, expectedRex)
276 }
277}
278
Jiyong Park25fc6a92018-11-18 18:02:45 +0900279func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900280 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900281 if !android.InList(expected, result) {
282 t.Errorf("%q is not found in %v", expected, result)
283 }
284}
285
286func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900287 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900288 if android.InList(notExpected, result) {
289 t.Errorf("%q is found in %v", notExpected, result)
290 }
291}
292
Jooyung Hane1633032019-08-01 17:41:43 +0900293func ensureListEmpty(t *testing.T, result []string) {
294 t.Helper()
295 if len(result) > 0 {
296 t.Errorf("%q is expected to be empty", result)
297 }
298}
299
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000300func ensureListNotEmpty(t *testing.T, result []string) {
301 t.Helper()
302 if len(result) == 0 {
303 t.Errorf("%q is expected to be not empty", result)
304 }
305}
306
Jiyong Park25fc6a92018-11-18 18:02:45 +0900307// Minimal test
308func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800309 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900310 apex_defaults {
311 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900312 manifest: ":myapex.manifest",
313 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900314 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900315 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900316 native_shared_libs: [
317 "mylib",
318 "libfoo.ffi",
319 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900320 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800321 multilib: {
322 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900323 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800324 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900325 },
Jiyong Park77acec62020-06-01 21:39:15 +0900326 java_libs: [
327 "myjar",
328 "myjar_dex",
329 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000330 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900331 }
332
Jiyong Park30ca9372019-02-07 16:27:23 +0900333 apex {
334 name: "myapex",
335 defaults: ["myapex-defaults"],
336 }
337
Jiyong Park25fc6a92018-11-18 18:02:45 +0900338 apex_key {
339 name: "myapex.key",
340 public_key: "testkey.avbpubkey",
341 private_key: "testkey.pem",
342 }
343
Jiyong Park809bb722019-02-13 21:33:49 +0900344 filegroup {
345 name: "myapex.manifest",
346 srcs: ["apex_manifest.json"],
347 }
348
349 filegroup {
350 name: "myapex.androidmanifest",
351 srcs: ["AndroidManifest.xml"],
352 }
353
Jiyong Park25fc6a92018-11-18 18:02:45 +0900354 cc_library {
355 name: "mylib",
356 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900357 shared_libs: [
358 "mylib2",
359 "libbar.ffi",
360 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900361 system_shared_libs: [],
362 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000363 // TODO: remove //apex_available:platform
364 apex_available: [
365 "//apex_available:platform",
366 "myapex",
367 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900368 }
369
Alex Light3d673592019-01-18 14:37:31 -0800370 cc_binary {
371 name: "foo",
372 srcs: ["mylib.cpp"],
373 compile_multilib: "both",
374 multilib: {
375 lib32: {
376 suffix: "32",
377 },
378 lib64: {
379 suffix: "64",
380 },
381 },
382 symlinks: ["foo_link_"],
383 symlink_preferred_arch: true,
384 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800385 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700386 apex_available: [ "myapex", "com.android.gki.*" ],
387 }
388
Jiyong Park99644e92020-11-17 22:21:02 +0900389 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000390 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900391 srcs: ["foo.rs"],
392 rlibs: ["libfoo.rlib.rust"],
393 dylibs: ["libfoo.dylib.rust"],
394 apex_available: ["myapex"],
395 }
396
397 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000398 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900399 srcs: ["foo.rs"],
400 crate_name: "foo",
401 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900402 shared_libs: ["libfoo.shared_from_rust"],
403 }
404
405 cc_library_shared {
406 name: "libfoo.shared_from_rust",
407 srcs: ["mylib.cpp"],
408 system_shared_libs: [],
409 stl: "none",
410 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900411 }
412
413 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000414 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900415 srcs: ["foo.rs"],
416 crate_name: "foo",
417 apex_available: ["myapex"],
418 }
419
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900420 rust_ffi_shared {
421 name: "libfoo.ffi",
422 srcs: ["foo.rs"],
423 crate_name: "foo",
424 apex_available: ["myapex"],
425 }
426
427 rust_ffi_shared {
428 name: "libbar.ffi",
429 srcs: ["foo.rs"],
430 crate_name: "bar",
431 apex_available: ["myapex"],
432 }
433
Yifan Hongd22a84a2020-07-28 17:37:46 -0700434 apex {
435 name: "com.android.gki.fake",
436 binaries: ["foo"],
437 key: "myapex.key",
438 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000439 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800440 }
441
Paul Duffindddd5462020-04-07 15:25:44 +0100442 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900443 name: "mylib2",
444 srcs: ["mylib.cpp"],
445 system_shared_libs: [],
446 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900447 static_libs: ["libstatic"],
448 // TODO: remove //apex_available:platform
449 apex_available: [
450 "//apex_available:platform",
451 "myapex",
452 ],
453 }
454
Paul Duffindddd5462020-04-07 15:25:44 +0100455 cc_prebuilt_library_shared {
456 name: "mylib2",
457 srcs: ["prebuilt.so"],
458 // TODO: remove //apex_available:platform
459 apex_available: [
460 "//apex_available:platform",
461 "myapex",
462 ],
463 }
464
Jiyong Park9918e1a2020-03-17 19:16:40 +0900465 cc_library_static {
466 name: "libstatic",
467 srcs: ["mylib.cpp"],
468 system_shared_libs: [],
469 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000470 // TODO: remove //apex_available:platform
471 apex_available: [
472 "//apex_available:platform",
473 "myapex",
474 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900475 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476
477 java_library {
478 name: "myjar",
479 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900480 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900481 sdk_version: "none",
482 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900484 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000485 // TODO: remove //apex_available:platform
486 apex_available: [
487 "//apex_available:platform",
488 "myapex",
489 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 }
491
Jiyong Park77acec62020-06-01 21:39:15 +0900492 dex_import {
493 name: "myjar_dex",
494 jars: ["prebuilt.jar"],
495 apex_available: [
496 "//apex_available:platform",
497 "myapex",
498 ],
499 }
500
Jiyong Park7f7766d2019-07-25 22:02:35 +0900501 java_library {
502 name: "myotherjar",
503 srcs: ["foo/bar/MyClass.java"],
504 sdk_version: "none",
505 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900506 // TODO: remove //apex_available:platform
507 apex_available: [
508 "//apex_available:platform",
509 "myapex",
510 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900511 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900512
513 java_library {
514 name: "mysharedjar",
515 srcs: ["foo/bar/MyClass.java"],
516 sdk_version: "none",
517 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900518 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900519 `)
520
Paul Duffina71a67a2021-03-29 00:42:57 +0100521 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900523 // Make sure that Android.mk is created
524 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700525 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900526 var builder strings.Builder
527 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
528
529 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000530 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900531 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
532
Jiyong Park42cca6c2019-04-01 11:15:50 +0900533 optFlags := apexRule.Args["opt_flags"]
534 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700535 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100536 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900537
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538 copyCmds := apexRule.Args["copy_commands"]
539
540 // Ensure that main rule creates an output
541 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
542
543 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700544 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
546 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900547 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900548 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900549
550 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700551 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
552 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900553 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900557
558 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800559 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
560 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900561 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900562 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900563 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900564 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
565 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900567 // .. but not for java libs
568 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900569 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800570
Colin Cross7113d202019-11-20 16:39:12 -0800571 // Ensure that the platform variant ends with _shared or _common
572 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
573 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900574 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
575 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900576 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
577
578 // Ensure that dynamic dependency to java libs are not included
579 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800580
581 // Ensure that all symlinks are present.
582 found_foo_link_64 := false
583 found_foo := false
584 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900585 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800586 if strings.HasSuffix(cmd, "bin/foo") {
587 found_foo = true
588 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
589 found_foo_link_64 = true
590 }
591 }
592 }
593 good := found_foo && found_foo_link_64
594 if !good {
595 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
596 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900597
Artur Satayeva8bd1132020-04-27 18:07:06 +0100598 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100600 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
601 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
602 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100603
604 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100606 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
607 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
608 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800609}
610
Jooyung Hanf21c7972019-12-16 22:32:06 +0900611func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800612 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900613 apex_defaults {
614 name: "myapex-defaults",
615 key: "myapex.key",
616 prebuilts: ["myetc"],
617 native_shared_libs: ["mylib"],
618 java_libs: ["myjar"],
619 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900620 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800621 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000622 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900623 }
624
625 prebuilt_etc {
626 name: "myetc",
627 src: "myprebuilt",
628 }
629
630 apex {
631 name: "myapex",
632 defaults: ["myapex-defaults"],
633 }
634
635 apex_key {
636 name: "myapex.key",
637 public_key: "testkey.avbpubkey",
638 private_key: "testkey.pem",
639 }
640
641 cc_library {
642 name: "mylib",
643 system_shared_libs: [],
644 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000645 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900646 }
647
648 java_library {
649 name: "myjar",
650 srcs: ["foo/bar/MyClass.java"],
651 sdk_version: "none",
652 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000653 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900654 }
655
656 android_app {
657 name: "AppFoo",
658 srcs: ["foo/bar/MyClass.java"],
659 sdk_version: "none",
660 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000661 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900662 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900663
664 runtime_resource_overlay {
665 name: "rro",
666 theme: "blue",
667 }
668
markchien2f59ec92020-09-02 16:23:38 +0800669 bpf {
670 name: "bpf",
671 srcs: ["bpf.c", "bpf2.c"],
672 }
673
Ken Chenfad7f9d2021-11-10 22:02:57 +0800674 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800675 name: "netdTest",
676 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800677 sub_dir: "netd",
678 }
679
Jooyung Hanf21c7972019-12-16 22:32:06 +0900680 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000681 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900682 "etc/myetc",
683 "javalib/myjar.jar",
684 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000685 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900686 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800687 "etc/bpf/bpf.o",
688 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800689 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900690 })
691}
692
Jooyung Han01a3ee22019-11-02 02:52:25 +0900693func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800694 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695 apex {
696 name: "myapex",
697 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000698 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900699 }
700
701 apex_key {
702 name: "myapex.key",
703 public_key: "testkey.avbpubkey",
704 private_key: "testkey.pem",
705 }
706 `)
707
708 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900709 args := module.Rule("apexRule").Args
710 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
711 t.Error("manifest should be apex_manifest.pb, but " + manifest)
712 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900713}
714
Liz Kammer4854a7d2021-05-27 14:28:27 -0400715func TestApexManifestMinSdkVersion(t *testing.T) {
716 ctx := testApex(t, `
717 apex_defaults {
718 name: "my_defaults",
719 key: "myapex.key",
720 product_specific: true,
721 file_contexts: ":my-file-contexts",
722 updatable: false,
723 }
724 apex {
725 name: "myapex_30",
726 min_sdk_version: "30",
727 defaults: ["my_defaults"],
728 }
729
730 apex {
731 name: "myapex_current",
732 min_sdk_version: "current",
733 defaults: ["my_defaults"],
734 }
735
736 apex {
737 name: "myapex_none",
738 defaults: ["my_defaults"],
739 }
740
741 apex_key {
742 name: "myapex.key",
743 public_key: "testkey.avbpubkey",
744 private_key: "testkey.pem",
745 }
746
747 filegroup {
748 name: "my-file-contexts",
749 srcs: ["product_specific_file_contexts"],
750 }
751 `, withFiles(map[string][]byte{
752 "product_specific_file_contexts": nil,
753 }), android.FixtureModifyProductVariables(
754 func(variables android.FixtureProductVariables) {
755 variables.Unbundled_build = proptools.BoolPtr(true)
756 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
757 }), android.FixtureMergeEnv(map[string]string{
758 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
759 }))
760
761 testCases := []struct {
762 module string
763 minSdkVersion string
764 }{
765 {
766 module: "myapex_30",
767 minSdkVersion: "30",
768 },
769 {
770 module: "myapex_current",
771 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
772 },
773 {
774 module: "myapex_none",
775 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
776 },
777 }
778 for _, tc := range testCases {
779 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
780 args := module.Rule("apexRule").Args
781 optFlags := args["opt_flags"]
782 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
783 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
784 }
785 }
786}
787
Jooyung Hanaf730952023-02-28 14:13:38 +0900788func TestFileContexts(t *testing.T) {
789 for _, useFileContextsAsIs := range []bool{true, false} {
790 prop := ""
791 if useFileContextsAsIs {
792 prop = "use_file_contexts_as_is: true,\n"
793 }
794 ctx := testApex(t, `
795 apex {
796 name: "myapex",
797 key: "myapex.key",
798 file_contexts: "file_contexts",
799 updatable: false,
800 vendor: true,
801 `+prop+`
802 }
803
804 apex_key {
805 name: "myapex.key",
806 public_key: "testkey.avbpubkey",
807 private_key: "testkey.pem",
808 }
809 `, withFiles(map[string][]byte{
810 "file_contexts": nil,
811 }))
812
813 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("file_contexts")
814 forceLabellingCommand := "apex_manifest\\\\.pb u:object_r:system_file:s0"
815 if useFileContextsAsIs {
816 android.AssertStringDoesNotContain(t, "should force-label",
817 rule.RuleParams.Command, forceLabellingCommand)
818 } else {
819 android.AssertStringDoesContain(t, "shouldn't force-label",
820 rule.RuleParams.Command, forceLabellingCommand)
821 }
822 }
823}
824
Alex Light5098a612018-11-29 17:12:15 -0800825func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800826 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800827 apex {
828 name: "myapex",
829 key: "myapex.key",
830 payload_type: "zip",
831 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000832 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800833 }
834
835 apex_key {
836 name: "myapex.key",
837 public_key: "testkey.avbpubkey",
838 private_key: "testkey.pem",
839 }
840
841 cc_library {
842 name: "mylib",
843 srcs: ["mylib.cpp"],
844 shared_libs: ["mylib2"],
845 system_shared_libs: [],
846 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000847 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800848 }
849
850 cc_library {
851 name: "mylib2",
852 srcs: ["mylib.cpp"],
853 system_shared_libs: [],
854 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000855 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800856 }
857 `)
858
Sundong Ahnabb64432019-10-22 13:58:29 +0900859 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800860 copyCmds := zipApexRule.Args["copy_commands"]
861
862 // Ensure that main rule creates an output
863 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
864
865 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700866 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800867
868 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700869 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800870
871 // Ensure that both direct and indirect deps are copied into apex
872 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
873 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900874}
875
876func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800877 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900878 apex {
879 name: "myapex",
880 key: "myapex.key",
881 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900882 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000883 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900884 }
885
886 apex_key {
887 name: "myapex.key",
888 public_key: "testkey.avbpubkey",
889 private_key: "testkey.pem",
890 }
891
892 cc_library {
893 name: "mylib",
894 srcs: ["mylib.cpp"],
895 shared_libs: ["mylib2", "mylib3"],
896 system_shared_libs: [],
897 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000898 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900899 }
900
901 cc_library {
902 name: "mylib2",
903 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900904 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900905 system_shared_libs: [],
906 stl: "none",
907 stubs: {
908 versions: ["1", "2", "3"],
909 },
910 }
911
912 cc_library {
913 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900914 srcs: ["mylib.cpp"],
915 shared_libs: ["mylib4"],
916 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900917 stl: "none",
918 stubs: {
919 versions: ["10", "11", "12"],
920 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000921 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900922 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900923
924 cc_library {
925 name: "mylib4",
926 srcs: ["mylib.cpp"],
927 system_shared_libs: [],
928 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000929 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900930 }
Jiyong Park105dc322021-06-11 17:22:09 +0900931
932 rust_binary {
933 name: "foo.rust",
934 srcs: ["foo.rs"],
935 shared_libs: ["libfoo.shared_from_rust"],
936 prefer_rlib: true,
937 apex_available: ["myapex"],
938 }
939
940 cc_library_shared {
941 name: "libfoo.shared_from_rust",
942 srcs: ["mylib.cpp"],
943 system_shared_libs: [],
944 stl: "none",
945 stubs: {
946 versions: ["10", "11", "12"],
947 },
948 }
949
Jiyong Park25fc6a92018-11-18 18:02:45 +0900950 `)
951
Sundong Ahnabb64432019-10-22 13:58:29 +0900952 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900953 copyCmds := apexRule.Args["copy_commands"]
954
955 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800956 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900957
958 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800959 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900960
961 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800962 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900963
Colin Crossaede88c2020-08-11 12:17:01 -0700964 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900965
966 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900967 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900968 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900969 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900970
971 // 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 -0700972 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900973 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700974 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900975
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700976 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
977 // is replaced by sharing of "cFlags" in cc/builder.go.
978 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
979 // module variable representing "cflags". So it was not detected by ensureNotContains.
980 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
981 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
982 // including the original cflags's "-include mylib.h".
983 //
Jiyong Park64379952018-12-13 18:37:29 +0900984 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700985 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
986 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900987
Jiyong Park85cc35a2022-07-17 11:30:47 +0900988 // Ensure that genstub for platform-provided lib is invoked with --systemapi
989 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
990 // Ensure that genstub for apex-provided lib is invoked with --apex
991 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900992
Jooyung Hana57af4a2020-01-23 05:36:59 +0000993 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900994 "lib64/mylib.so",
995 "lib64/mylib3.so",
996 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900997 "bin/foo.rust",
998 "lib64/libc++.so", // by the implicit dependency from foo.rust
999 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001000 })
Jiyong Park105dc322021-06-11 17:22:09 +09001001
1002 // Ensure that stub dependency from a rust module is not included
1003 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1004 // The rust module is linked to the stub cc library
Peter Collingbournee7c71c32023-03-31 20:21:19 -07001005 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001006 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1007 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001008
1009 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1010 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001011}
1012
Jiyong Park1bc84122021-06-22 20:23:05 +09001013func TestApexCanUsePrivateApis(t *testing.T) {
1014 ctx := testApex(t, `
1015 apex {
1016 name: "myapex",
1017 key: "myapex.key",
1018 native_shared_libs: ["mylib"],
1019 binaries: ["foo.rust"],
1020 updatable: false,
1021 platform_apis: true,
1022 }
1023
1024 apex_key {
1025 name: "myapex.key",
1026 public_key: "testkey.avbpubkey",
1027 private_key: "testkey.pem",
1028 }
1029
1030 cc_library {
1031 name: "mylib",
1032 srcs: ["mylib.cpp"],
1033 shared_libs: ["mylib2"],
1034 system_shared_libs: [],
1035 stl: "none",
1036 apex_available: [ "myapex" ],
1037 }
1038
1039 cc_library {
1040 name: "mylib2",
1041 srcs: ["mylib.cpp"],
1042 cflags: ["-include mylib.h"],
1043 system_shared_libs: [],
1044 stl: "none",
1045 stubs: {
1046 versions: ["1", "2", "3"],
1047 },
1048 }
1049
1050 rust_binary {
1051 name: "foo.rust",
1052 srcs: ["foo.rs"],
1053 shared_libs: ["libfoo.shared_from_rust"],
1054 prefer_rlib: true,
1055 apex_available: ["myapex"],
1056 }
1057
1058 cc_library_shared {
1059 name: "libfoo.shared_from_rust",
1060 srcs: ["mylib.cpp"],
1061 system_shared_libs: [],
1062 stl: "none",
1063 stubs: {
1064 versions: ["10", "11", "12"],
1065 },
1066 }
1067 `)
1068
1069 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1070 copyCmds := apexRule.Args["copy_commands"]
1071
1072 // Ensure that indirect stubs dep is not included
1073 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1074 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1075
1076 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1077 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001078 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001079 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1080 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Peter Collingbournee7c71c32023-03-31 20:21:19 -07001081 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001082 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1083 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1084}
1085
Colin Cross7812fd32020-09-25 12:35:10 -07001086func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1087 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001088 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001089 apex {
1090 name: "myapex",
1091 key: "myapex.key",
1092 native_shared_libs: ["mylib", "mylib3"],
1093 min_sdk_version: "29",
1094 }
1095
1096 apex_key {
1097 name: "myapex.key",
1098 public_key: "testkey.avbpubkey",
1099 private_key: "testkey.pem",
1100 }
1101
1102 cc_library {
1103 name: "mylib",
1104 srcs: ["mylib.cpp"],
1105 shared_libs: ["mylib2", "mylib3"],
1106 system_shared_libs: [],
1107 stl: "none",
1108 apex_available: [ "myapex" ],
1109 min_sdk_version: "28",
1110 }
1111
1112 cc_library {
1113 name: "mylib2",
1114 srcs: ["mylib.cpp"],
1115 cflags: ["-include mylib.h"],
1116 system_shared_libs: [],
1117 stl: "none",
1118 stubs: {
1119 versions: ["28", "29", "30", "current"],
1120 },
1121 min_sdk_version: "28",
1122 }
1123
1124 cc_library {
1125 name: "mylib3",
1126 srcs: ["mylib.cpp"],
1127 shared_libs: ["mylib4"],
1128 system_shared_libs: [],
1129 stl: "none",
1130 stubs: {
1131 versions: ["28", "29", "30", "current"],
1132 },
1133 apex_available: [ "myapex" ],
1134 min_sdk_version: "28",
1135 }
1136
1137 cc_library {
1138 name: "mylib4",
1139 srcs: ["mylib.cpp"],
1140 system_shared_libs: [],
1141 stl: "none",
1142 apex_available: [ "myapex" ],
1143 min_sdk_version: "28",
1144 }
1145 `)
1146
1147 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1148 copyCmds := apexRule.Args["copy_commands"]
1149
1150 // Ensure that direct non-stubs dep is always included
1151 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1152
1153 // Ensure that indirect stubs dep is not included
1154 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1155
1156 // Ensure that direct stubs dep is included
1157 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1158
1159 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1160
Jiyong Park55549df2021-02-26 23:57:23 +09001161 // Ensure that mylib is linking with the latest version of stub for mylib2
1162 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001163 // ... and not linking to the non-stub (impl) variant of mylib2
1164 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1165
1166 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1167 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1168 // .. and not linking to the stubs variant of mylib3
1169 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1170
1171 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001172 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001173 ensureNotContains(t, mylib2Cflags, "-include ")
1174
Jiyong Park85cc35a2022-07-17 11:30:47 +09001175 // Ensure that genstub is invoked with --systemapi
1176 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001177
1178 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1179 "lib64/mylib.so",
1180 "lib64/mylib3.so",
1181 "lib64/mylib4.so",
1182 })
1183}
1184
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001185func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1186 t.Parallel()
1187 // myapex (Z)
1188 // mylib -----------------.
1189 // |
1190 // otherapex (29) |
1191 // libstub's versions: 29 Z current
1192 // |
1193 // <platform> |
1194 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001195 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001196 apex {
1197 name: "myapex",
1198 key: "myapex.key",
1199 native_shared_libs: ["mylib"],
1200 min_sdk_version: "Z", // non-final
1201 }
1202
1203 cc_library {
1204 name: "mylib",
1205 srcs: ["mylib.cpp"],
1206 shared_libs: ["libstub"],
1207 apex_available: ["myapex"],
1208 min_sdk_version: "Z",
1209 }
1210
1211 apex_key {
1212 name: "myapex.key",
1213 public_key: "testkey.avbpubkey",
1214 private_key: "testkey.pem",
1215 }
1216
1217 apex {
1218 name: "otherapex",
1219 key: "myapex.key",
1220 native_shared_libs: ["libstub"],
1221 min_sdk_version: "29",
1222 }
1223
1224 cc_library {
1225 name: "libstub",
1226 srcs: ["mylib.cpp"],
1227 stubs: {
1228 versions: ["29", "Z", "current"],
1229 },
1230 apex_available: ["otherapex"],
1231 min_sdk_version: "29",
1232 }
1233
1234 // platform module depending on libstub from otherapex should use the latest stub("current")
1235 cc_library {
1236 name: "libplatform",
1237 srcs: ["mylib.cpp"],
1238 shared_libs: ["libstub"],
1239 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001240 `,
1241 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1242 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1243 variables.Platform_sdk_final = proptools.BoolPtr(false)
1244 variables.Platform_version_active_codenames = []string{"Z"}
1245 }),
1246 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001247
Jiyong Park55549df2021-02-26 23:57:23 +09001248 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001249 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001250 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001251 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001252 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001253
1254 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1255 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1256 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1257 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1258 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1259}
1260
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001261func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001262 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001263 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001264 name: "myapex2",
1265 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001266 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001267 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001268 }
1269
1270 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001271 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001272 public_key: "testkey.avbpubkey",
1273 private_key: "testkey.pem",
1274 }
1275
1276 cc_library {
1277 name: "mylib",
1278 srcs: ["mylib.cpp"],
1279 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001280 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001281 system_shared_libs: [],
1282 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001283 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001284 }
1285
1286 cc_library {
1287 name: "libfoo",
1288 srcs: ["mylib.cpp"],
1289 shared_libs: ["libbar"],
1290 system_shared_libs: [],
1291 stl: "none",
1292 stubs: {
1293 versions: ["10", "20", "30"],
1294 },
1295 }
1296
1297 cc_library {
1298 name: "libbar",
1299 srcs: ["mylib.cpp"],
1300 system_shared_libs: [],
1301 stl: "none",
1302 }
1303
Jiyong Park678c8812020-02-07 17:25:49 +09001304 cc_library_static {
1305 name: "libbaz",
1306 srcs: ["mylib.cpp"],
1307 system_shared_libs: [],
1308 stl: "none",
1309 apex_available: [ "myapex2" ],
1310 }
1311
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001312 `)
1313
Jiyong Park83dc74b2020-01-14 18:38:44 +09001314 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001315 copyCmds := apexRule.Args["copy_commands"]
1316
1317 // Ensure that direct non-stubs dep is always included
1318 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1319
1320 // Ensure that indirect stubs dep is not included
1321 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1322
1323 // Ensure that dependency of stubs is not included
1324 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1325
Colin Crossaede88c2020-08-11 12:17:01 -07001326 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001327
1328 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001329 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001330 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001331 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001332
Jiyong Park3ff16992019-12-27 14:11:47 +09001333 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001334
1335 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1336 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001337
Artur Satayeva8bd1132020-04-27 18:07:06 +01001338 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001339 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001340
Artur Satayeva8bd1132020-04-27 18:07:06 +01001341 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001342 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001343}
1344
Jooyung Hand3639552019-08-09 12:57:43 +09001345func TestApexWithRuntimeLibsDependency(t *testing.T) {
1346 /*
1347 myapex
1348 |
1349 v (runtime_libs)
1350 mylib ------+------> libfoo [provides stub]
1351 |
1352 `------> libbar
1353 */
Colin Cross1c460562021-02-16 17:55:47 -08001354 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001355 apex {
1356 name: "myapex",
1357 key: "myapex.key",
1358 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001359 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001360 }
1361
1362 apex_key {
1363 name: "myapex.key",
1364 public_key: "testkey.avbpubkey",
1365 private_key: "testkey.pem",
1366 }
1367
1368 cc_library {
1369 name: "mylib",
1370 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001371 static_libs: ["libstatic"],
1372 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001373 runtime_libs: ["libfoo", "libbar"],
1374 system_shared_libs: [],
1375 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001376 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001377 }
1378
1379 cc_library {
1380 name: "libfoo",
1381 srcs: ["mylib.cpp"],
1382 system_shared_libs: [],
1383 stl: "none",
1384 stubs: {
1385 versions: ["10", "20", "30"],
1386 },
1387 }
1388
1389 cc_library {
1390 name: "libbar",
1391 srcs: ["mylib.cpp"],
1392 system_shared_libs: [],
1393 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001394 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001395 }
1396
Liz Kammer5f108fa2023-05-11 14:33:17 -04001397 cc_library {
1398 name: "libstatic",
1399 srcs: ["mylib.cpp"],
1400 system_shared_libs: [],
1401 stl: "none",
1402 apex_available: [ "myapex" ],
1403 runtime_libs: ["libstatic_to_runtime"],
1404 }
1405
1406 cc_library {
1407 name: "libshared",
1408 srcs: ["mylib.cpp"],
1409 system_shared_libs: [],
1410 stl: "none",
1411 apex_available: [ "myapex" ],
1412 runtime_libs: ["libshared_to_runtime"],
1413 }
1414
1415 cc_library {
1416 name: "libstatic_to_runtime",
1417 srcs: ["mylib.cpp"],
1418 system_shared_libs: [],
1419 stl: "none",
1420 apex_available: [ "myapex" ],
1421 }
1422
1423 cc_library {
1424 name: "libshared_to_runtime",
1425 srcs: ["mylib.cpp"],
1426 system_shared_libs: [],
1427 stl: "none",
1428 apex_available: [ "myapex" ],
1429 }
Jooyung Hand3639552019-08-09 12:57:43 +09001430 `)
1431
Sundong Ahnabb64432019-10-22 13:58:29 +09001432 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001433 copyCmds := apexRule.Args["copy_commands"]
1434
1435 // Ensure that direct non-stubs dep is always included
1436 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1437
1438 // Ensure that indirect stubs dep is not included
1439 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1440
1441 // Ensure that runtime_libs dep in included
1442 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001443 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1444 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1445
1446 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001447
Sundong Ahnabb64432019-10-22 13:58:29 +09001448 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001449 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1450 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001451}
1452
Paul Duffina02cae32021-03-09 01:44:06 +00001453var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1454 cc.PrepareForTestWithCcBuildComponents,
1455 PrepareForTestWithApexBuildComponents,
1456 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001457 apex {
1458 name: "com.android.runtime",
1459 key: "com.android.runtime.key",
1460 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001461 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001462 }
1463
1464 apex_key {
1465 name: "com.android.runtime.key",
1466 public_key: "testkey.avbpubkey",
1467 private_key: "testkey.pem",
1468 }
Paul Duffina02cae32021-03-09 01:44:06 +00001469 `),
1470 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1471)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001472
Paul Duffina02cae32021-03-09 01:44:06 +00001473func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001474 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001475 cc_library {
1476 name: "libc",
1477 no_libcrt: true,
1478 nocrt: true,
1479 stl: "none",
1480 system_shared_libs: [],
1481 stubs: { versions: ["1"] },
1482 apex_available: ["com.android.runtime"],
1483
1484 sanitize: {
1485 hwaddress: true,
1486 }
1487 }
1488
1489 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001490 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001491 no_libcrt: true,
1492 nocrt: true,
1493 stl: "none",
1494 system_shared_libs: [],
1495 srcs: [""],
1496 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001497 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001498
1499 sanitize: {
1500 never: true,
1501 },
Paul Duffina02cae32021-03-09 01:44:06 +00001502 } `)
1503 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001504
1505 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1506 "lib64/bionic/libc.so",
1507 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1508 })
1509
Colin Cross4c4c1be2022-02-10 11:41:18 -08001510 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001511
1512 installed := hwasan.Description("install libclang_rt.hwasan")
1513 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1514
1515 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1516 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1517 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1518}
1519
1520func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001521 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001522 prepareForTestOfRuntimeApexWithHwasan,
1523 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1524 variables.SanitizeDevice = []string{"hwaddress"}
1525 }),
1526 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001527 cc_library {
1528 name: "libc",
1529 no_libcrt: true,
1530 nocrt: true,
1531 stl: "none",
1532 system_shared_libs: [],
1533 stubs: { versions: ["1"] },
1534 apex_available: ["com.android.runtime"],
1535 }
1536
1537 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001538 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001539 no_libcrt: true,
1540 nocrt: true,
1541 stl: "none",
1542 system_shared_libs: [],
1543 srcs: [""],
1544 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001545 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001546
1547 sanitize: {
1548 never: true,
1549 },
1550 }
Paul Duffina02cae32021-03-09 01:44:06 +00001551 `)
1552 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001553
1554 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1555 "lib64/bionic/libc.so",
1556 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1557 })
1558
Colin Cross4c4c1be2022-02-10 11:41:18 -08001559 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001560
1561 installed := hwasan.Description("install libclang_rt.hwasan")
1562 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1563
1564 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1565 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1566 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1567}
1568
Jooyung Han61b66e92020-03-21 14:21:46 +00001569func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1570 testcases := []struct {
1571 name string
1572 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001573 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001574 shouldLink string
1575 shouldNotLink []string
1576 }{
1577 {
Jiyong Park55549df2021-02-26 23:57:23 +09001578 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001579 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001580 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001581 shouldLink: "current",
1582 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001583 },
1584 {
Jiyong Park55549df2021-02-26 23:57:23 +09001585 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001586 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001587 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001588 shouldLink: "current",
1589 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001590 },
1591 }
1592 for _, tc := range testcases {
1593 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001594 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001595 apex {
1596 name: "myapex",
1597 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001598 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001599 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001600 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001601 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001602
Jooyung Han61b66e92020-03-21 14:21:46 +00001603 apex_key {
1604 name: "myapex.key",
1605 public_key: "testkey.avbpubkey",
1606 private_key: "testkey.pem",
1607 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001608
Jooyung Han61b66e92020-03-21 14:21:46 +00001609 cc_library {
1610 name: "mylib",
1611 srcs: ["mylib.cpp"],
1612 vendor_available: true,
1613 shared_libs: ["libbar"],
1614 system_shared_libs: [],
1615 stl: "none",
1616 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001617 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001618 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001619
Jooyung Han61b66e92020-03-21 14:21:46 +00001620 cc_library {
1621 name: "libbar",
1622 srcs: ["mylib.cpp"],
1623 system_shared_libs: [],
1624 stl: "none",
1625 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001626 llndk: {
1627 symbol_file: "libbar.map.txt",
1628 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001629 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001630 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001631 withUnbundledBuild,
1632 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001633
Jooyung Han61b66e92020-03-21 14:21:46 +00001634 // Ensure that LLNDK dep is not included
1635 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1636 "lib64/mylib.so",
1637 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001638
Jooyung Han61b66e92020-03-21 14:21:46 +00001639 // Ensure that LLNDK dep is required
1640 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1641 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1642 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001643
Steven Moreland2c4000c2021-04-27 02:08:49 +00001644 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1645 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001646 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001647 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001648 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001649
Steven Moreland2c4000c2021-04-27 02:08:49 +00001650 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001651 ver := tc.shouldLink
1652 if tc.shouldLink == "current" {
1653 ver = strconv.Itoa(android.FutureApiLevelInt)
1654 }
1655 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001656 })
1657 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001658}
1659
Jiyong Park25fc6a92018-11-18 18:02:45 +09001660func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001661 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001662 apex {
1663 name: "myapex",
1664 key: "myapex.key",
1665 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001666 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001667 }
1668
1669 apex_key {
1670 name: "myapex.key",
1671 public_key: "testkey.avbpubkey",
1672 private_key: "testkey.pem",
1673 }
1674
1675 cc_library {
1676 name: "mylib",
1677 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001678 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001679 shared_libs: ["libdl#27"],
1680 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001681 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001682 }
1683
1684 cc_library_shared {
1685 name: "mylib_shared",
1686 srcs: ["mylib.cpp"],
1687 shared_libs: ["libdl#27"],
1688 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001689 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001690 }
1691
1692 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001693 name: "libBootstrap",
1694 srcs: ["mylib.cpp"],
1695 stl: "none",
1696 bootstrap: true,
1697 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001698 `)
1699
Sundong Ahnabb64432019-10-22 13:58:29 +09001700 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001701 copyCmds := apexRule.Args["copy_commands"]
1702
1703 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001704 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001705 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1706 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001707
1708 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001709 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001710
Colin Crossaede88c2020-08-11 12:17:01 -07001711 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1712 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1713 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001714
1715 // For dependency to libc
1716 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001717 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001718 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001719 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001720 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001721 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1722 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001723
1724 // For dependency to libm
1725 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001726 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001727 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001728 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001729 // ... and is not compiling with the stub
1730 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1731 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1732
1733 // For dependency to libdl
1734 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001735 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001736 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001737 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1738 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001739 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001740 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001741 // ... Cflags from stub is correctly exported to mylib
1742 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1743 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001744
1745 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001746 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1747 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1748 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1749 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001750}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001751
Jooyung Han749dc692020-04-15 11:03:39 +09001752func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001753 // there are three links between liba --> libz.
1754 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001755 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001756 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001757 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001758 apex {
1759 name: "myapex",
1760 key: "myapex.key",
1761 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001762 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001763 }
1764
1765 apex {
1766 name: "otherapex",
1767 key: "myapex.key",
1768 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001769 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001770 }
1771
1772 apex_key {
1773 name: "myapex.key",
1774 public_key: "testkey.avbpubkey",
1775 private_key: "testkey.pem",
1776 }
1777
1778 cc_library {
1779 name: "libx",
1780 shared_libs: ["liba"],
1781 system_shared_libs: [],
1782 stl: "none",
1783 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001784 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001785 }
1786
1787 cc_library {
1788 name: "liby",
1789 shared_libs: ["liba"],
1790 system_shared_libs: [],
1791 stl: "none",
1792 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001793 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001794 }
1795
1796 cc_library {
1797 name: "liba",
1798 shared_libs: ["libz"],
1799 system_shared_libs: [],
1800 stl: "none",
1801 apex_available: [
1802 "//apex_available:anyapex",
1803 "//apex_available:platform",
1804 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001805 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001806 }
1807
1808 cc_library {
1809 name: "libz",
1810 system_shared_libs: [],
1811 stl: "none",
1812 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001813 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001814 },
1815 }
Jooyung Han749dc692020-04-15 11:03:39 +09001816 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001817
1818 expectLink := func(from, from_variant, to, to_variant string) {
1819 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1820 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1821 }
1822 expectNoLink := func(from, from_variant, to, to_variant string) {
1823 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1824 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1825 }
1826 // platform liba is linked to non-stub version
1827 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001828 // liba in myapex is linked to current
1829 expectLink("liba", "shared_apex29", "libz", "shared_current")
1830 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001831 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001832 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001833 // liba in otherapex is linked to current
1834 expectLink("liba", "shared_apex30", "libz", "shared_current")
1835 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001836 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1837 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001838}
1839
Jooyung Hanaed150d2020-04-02 01:41:41 +09001840func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001841 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001842 apex {
1843 name: "myapex",
1844 key: "myapex.key",
1845 native_shared_libs: ["libx"],
1846 min_sdk_version: "R",
1847 }
1848
1849 apex_key {
1850 name: "myapex.key",
1851 public_key: "testkey.avbpubkey",
1852 private_key: "testkey.pem",
1853 }
1854
1855 cc_library {
1856 name: "libx",
1857 shared_libs: ["libz"],
1858 system_shared_libs: [],
1859 stl: "none",
1860 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001861 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001862 }
1863
1864 cc_library {
1865 name: "libz",
1866 system_shared_libs: [],
1867 stl: "none",
1868 stubs: {
1869 versions: ["29", "R"],
1870 },
1871 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001872 `,
1873 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1874 variables.Platform_version_active_codenames = []string{"R"}
1875 }),
1876 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001877
1878 expectLink := func(from, from_variant, to, to_variant string) {
1879 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1880 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1881 }
1882 expectNoLink := func(from, from_variant, to, to_variant string) {
1883 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1884 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1885 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001886 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1887 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001888 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1889 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001890}
1891
Jooyung Han4c4da062021-06-23 10:23:16 +09001892func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1893 testApex(t, `
1894 apex {
1895 name: "myapex",
1896 key: "myapex.key",
1897 java_libs: ["libx"],
1898 min_sdk_version: "S",
1899 }
1900
1901 apex_key {
1902 name: "myapex.key",
1903 public_key: "testkey.avbpubkey",
1904 private_key: "testkey.pem",
1905 }
1906
1907 java_library {
1908 name: "libx",
1909 srcs: ["a.java"],
1910 apex_available: [ "myapex" ],
1911 sdk_version: "current",
1912 min_sdk_version: "S", // should be okay
1913 }
1914 `,
1915 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1916 variables.Platform_version_active_codenames = []string{"S"}
1917 variables.Platform_sdk_codename = proptools.StringPtr("S")
1918 }),
1919 )
1920}
1921
Jooyung Han749dc692020-04-15 11:03:39 +09001922func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001923 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001924 apex {
1925 name: "myapex",
1926 key: "myapex.key",
1927 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001928 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001929 }
1930
1931 apex_key {
1932 name: "myapex.key",
1933 public_key: "testkey.avbpubkey",
1934 private_key: "testkey.pem",
1935 }
1936
1937 cc_library {
1938 name: "libx",
1939 shared_libs: ["libz"],
1940 system_shared_libs: [],
1941 stl: "none",
1942 apex_available: [ "myapex" ],
1943 }
1944
1945 cc_library {
1946 name: "libz",
1947 system_shared_libs: [],
1948 stl: "none",
1949 stubs: {
1950 versions: ["1", "2"],
1951 },
1952 }
1953 `)
1954
1955 expectLink := func(from, from_variant, to, to_variant string) {
1956 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1957 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1958 }
1959 expectNoLink := func(from, from_variant, to, to_variant string) {
1960 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1961 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1962 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001963 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001964 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001965 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001966 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001967}
1968
Jooyung Handfc864c2023-03-20 18:19:07 +09001969func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001970 ctx := testApex(t, `
1971 apex {
1972 name: "myapex",
1973 key: "myapex.key",
1974 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001975 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001976 vendor: true,
1977 min_sdk_version: "29",
1978 }
1979
1980 apex_key {
1981 name: "myapex.key",
1982 public_key: "testkey.avbpubkey",
1983 private_key: "testkey.pem",
1984 }
1985
1986 cc_library {
1987 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001988 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001989 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001990 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001991 shared_libs: ["libbar"],
1992 }
1993
1994 cc_library {
1995 name: "libbar",
1996 stubs: { versions: ["29", "30"] },
1997 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09001998 }
1999 `)
2000
2001 vendorVariant := "android_vendor.29_arm64_armv8-a"
2002
Jooyung Handfc864c2023-03-20 18:19:07 +09002003 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
2004
2005 // Ensure that mylib links with "current" LLNDK
2006 libFlags := names(mylib.Rule("ld").Args["libFlags"])
2007 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
2008
2009 // Ensure that mylib is targeting 29
2010 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2011 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2012
2013 // Ensure that the correct variant of crtbegin_so is used.
2014 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2015 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002016
2017 // Ensure that the crtbegin_so used by the APEX is targeting 29
2018 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2019 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2020}
2021
Jooyung Han4495f842023-04-25 16:39:59 +09002022func TestTrackAllowedDeps(t *testing.T) {
2023 ctx := testApex(t, `
2024 apex {
2025 name: "myapex",
2026 key: "myapex.key",
2027 updatable: true,
2028 native_shared_libs: [
2029 "mylib",
2030 "yourlib",
2031 ],
2032 min_sdk_version: "29",
2033 }
2034
2035 apex {
2036 name: "myapex2",
2037 key: "myapex.key",
2038 updatable: false,
2039 native_shared_libs: ["yourlib"],
2040 }
2041
2042 apex_key {
2043 name: "myapex.key",
2044 public_key: "testkey.avbpubkey",
2045 private_key: "testkey.pem",
2046 }
2047
2048 cc_library {
2049 name: "mylib",
2050 srcs: ["mylib.cpp"],
2051 shared_libs: ["libbar"],
2052 min_sdk_version: "29",
2053 apex_available: ["myapex"],
2054 }
2055
2056 cc_library {
2057 name: "libbar",
2058 stubs: { versions: ["29", "30"] },
2059 }
2060
2061 cc_library {
2062 name: "yourlib",
2063 srcs: ["mylib.cpp"],
2064 min_sdk_version: "29",
2065 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2066 }
2067 `, withFiles(android.MockFS{
2068 "packages/modules/common/build/allowed_deps.txt": nil,
2069 }))
2070
2071 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2072 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2073 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2074 "out/soong/.intermediates/myapex/android_common_myapex_image/depsinfo/flatlist.txt")
2075 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2076 "out/soong/.intermediates/myapex2/android_common_myapex2_image/depsinfo/flatlist.txt")
2077
2078 myapex := ctx.ModuleForTests("myapex", "android_common_myapex_image")
2079 flatlist := strings.Split(myapex.Output("depsinfo/flatlist.txt").BuildParams.Args["content"], "\\n")
2080 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2081 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2082 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2083 flatlist, "mylib:(minSdkVersion:29)")
2084 android.AssertStringListContains(t, "track platform-available lib",
2085 flatlist, "yourlib(minSdkVersion:29)")
2086}
2087
2088func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2089 ctx := testApex(t, `
2090 apex {
2091 name: "myapex",
2092 key: "myapex.key",
2093 updatable: true,
2094 min_sdk_version: "29",
2095 }
2096
2097 apex_key {
2098 name: "myapex.key",
2099 public_key: "testkey.avbpubkey",
2100 private_key: "testkey.pem",
2101 }
2102 `)
2103 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2104 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2105 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2106 }
2107}
2108
Jooyung Han03b51852020-02-26 22:45:42 +09002109func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002110 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002111 apex {
2112 name: "myapex",
2113 key: "myapex.key",
2114 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002115 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002116 }
2117
2118 apex_key {
2119 name: "myapex.key",
2120 public_key: "testkey.avbpubkey",
2121 private_key: "testkey.pem",
2122 }
2123
2124 cc_library {
2125 name: "libx",
2126 system_shared_libs: [],
2127 stl: "none",
2128 apex_available: [ "myapex" ],
2129 stubs: {
2130 versions: ["1", "2"],
2131 },
2132 }
2133
2134 cc_library {
2135 name: "libz",
2136 shared_libs: ["libx"],
2137 system_shared_libs: [],
2138 stl: "none",
2139 }
2140 `)
2141
2142 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002143 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002144 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2145 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2146 }
2147 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002148 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002149 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2150 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2151 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002152 expectLink("libz", "shared", "libx", "shared_current")
2153 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002154 expectNoLink("libz", "shared", "libz", "shared_1")
2155 expectNoLink("libz", "shared", "libz", "shared")
2156}
2157
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002158var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2159 func(variables android.FixtureProductVariables) {
2160 variables.SanitizeDevice = []string{"hwaddress"}
2161 },
2162)
2163
Jooyung Han75568392020-03-20 04:29:24 +09002164func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002165 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002166 apex {
2167 name: "myapex",
2168 key: "myapex.key",
2169 native_shared_libs: ["libx"],
2170 min_sdk_version: "29",
2171 }
2172
2173 apex_key {
2174 name: "myapex.key",
2175 public_key: "testkey.avbpubkey",
2176 private_key: "testkey.pem",
2177 }
2178
2179 cc_library {
2180 name: "libx",
2181 shared_libs: ["libbar"],
2182 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002183 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002184 }
2185
2186 cc_library {
2187 name: "libbar",
2188 stubs: {
2189 versions: ["29", "30"],
2190 },
2191 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002192 `,
2193 prepareForTestWithSantitizeHwaddress,
2194 )
Jooyung Han03b51852020-02-26 22:45:42 +09002195 expectLink := func(from, from_variant, to, to_variant string) {
2196 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2197 libFlags := ld.Args["libFlags"]
2198 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2199 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002200 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002201}
2202
Jooyung Han75568392020-03-20 04:29:24 +09002203func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002204 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002205 apex {
2206 name: "myapex",
2207 key: "myapex.key",
2208 native_shared_libs: ["libx"],
2209 min_sdk_version: "29",
2210 }
2211
2212 apex_key {
2213 name: "myapex.key",
2214 public_key: "testkey.avbpubkey",
2215 private_key: "testkey.pem",
2216 }
2217
2218 cc_library {
2219 name: "libx",
2220 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002221 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002222 }
Jooyung Han75568392020-03-20 04:29:24 +09002223 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002224
2225 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002226 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002227 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002228 // note that platform variant is not.
2229 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002230 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002231}
2232
Jooyung Han749dc692020-04-15 11:03:39 +09002233func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2234 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002235 apex {
2236 name: "myapex",
2237 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002238 native_shared_libs: ["mylib"],
2239 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002240 }
2241
2242 apex_key {
2243 name: "myapex.key",
2244 public_key: "testkey.avbpubkey",
2245 private_key: "testkey.pem",
2246 }
Jooyung Han749dc692020-04-15 11:03:39 +09002247
2248 cc_library {
2249 name: "mylib",
2250 srcs: ["mylib.cpp"],
2251 system_shared_libs: [],
2252 stl: "none",
2253 apex_available: [
2254 "myapex",
2255 ],
2256 min_sdk_version: "30",
2257 }
2258 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002259
2260 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2261 apex {
2262 name: "myapex",
2263 key: "myapex.key",
2264 native_shared_libs: ["libfoo.ffi"],
2265 min_sdk_version: "29",
2266 }
2267
2268 apex_key {
2269 name: "myapex.key",
2270 public_key: "testkey.avbpubkey",
2271 private_key: "testkey.pem",
2272 }
2273
2274 rust_ffi_shared {
2275 name: "libfoo.ffi",
2276 srcs: ["foo.rs"],
2277 crate_name: "foo",
2278 apex_available: [
2279 "myapex",
2280 ],
2281 min_sdk_version: "30",
2282 }
2283 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002284
2285 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2286 apex {
2287 name: "myapex",
2288 key: "myapex.key",
2289 java_libs: ["libfoo"],
2290 min_sdk_version: "29",
2291 }
2292
2293 apex_key {
2294 name: "myapex.key",
2295 public_key: "testkey.avbpubkey",
2296 private_key: "testkey.pem",
2297 }
2298
2299 java_import {
2300 name: "libfoo",
2301 jars: ["libfoo.jar"],
2302 apex_available: [
2303 "myapex",
2304 ],
2305 min_sdk_version: "30",
2306 }
2307 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002308
2309 // Skip check for modules compiling against core API surface
2310 testApex(t, `
2311 apex {
2312 name: "myapex",
2313 key: "myapex.key",
2314 java_libs: ["libfoo"],
2315 min_sdk_version: "29",
2316 }
2317
2318 apex_key {
2319 name: "myapex.key",
2320 public_key: "testkey.avbpubkey",
2321 private_key: "testkey.pem",
2322 }
2323
2324 java_library {
2325 name: "libfoo",
2326 srcs: ["Foo.java"],
2327 apex_available: [
2328 "myapex",
2329 ],
2330 // Compile against core API surface
2331 sdk_version: "core_current",
2332 min_sdk_version: "30",
2333 }
2334 `)
2335
Jooyung Han749dc692020-04-15 11:03:39 +09002336}
2337
2338func TestApexMinSdkVersion_Okay(t *testing.T) {
2339 testApex(t, `
2340 apex {
2341 name: "myapex",
2342 key: "myapex.key",
2343 native_shared_libs: ["libfoo"],
2344 java_libs: ["libbar"],
2345 min_sdk_version: "29",
2346 }
2347
2348 apex_key {
2349 name: "myapex.key",
2350 public_key: "testkey.avbpubkey",
2351 private_key: "testkey.pem",
2352 }
2353
2354 cc_library {
2355 name: "libfoo",
2356 srcs: ["mylib.cpp"],
2357 shared_libs: ["libfoo_dep"],
2358 apex_available: ["myapex"],
2359 min_sdk_version: "29",
2360 }
2361
2362 cc_library {
2363 name: "libfoo_dep",
2364 srcs: ["mylib.cpp"],
2365 apex_available: ["myapex"],
2366 min_sdk_version: "29",
2367 }
2368
2369 java_library {
2370 name: "libbar",
2371 sdk_version: "current",
2372 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002373 static_libs: [
2374 "libbar_dep",
2375 "libbar_import_dep",
2376 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002377 apex_available: ["myapex"],
2378 min_sdk_version: "29",
2379 }
2380
2381 java_library {
2382 name: "libbar_dep",
2383 sdk_version: "current",
2384 srcs: ["a.java"],
2385 apex_available: ["myapex"],
2386 min_sdk_version: "29",
2387 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002388
2389 java_import {
2390 name: "libbar_import_dep",
2391 jars: ["libbar.jar"],
2392 apex_available: ["myapex"],
2393 min_sdk_version: "29",
2394 }
Jooyung Han03b51852020-02-26 22:45:42 +09002395 `)
2396}
2397
Colin Cross8ca61c12022-10-06 21:00:14 -07002398func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2399 // Tests that an apex dependency with min_sdk_version higher than the
2400 // min_sdk_version of the apex is allowed as long as the dependency's
2401 // min_sdk_version is less than or equal to the api level that the
2402 // architecture was introduced in. In this case, arm64 didn't exist
2403 // until api level 21, so the arm64 code will never need to run on
2404 // an api level 20 device, even if other architectures of the apex
2405 // will.
2406 testApex(t, `
2407 apex {
2408 name: "myapex",
2409 key: "myapex.key",
2410 native_shared_libs: ["libfoo"],
2411 min_sdk_version: "20",
2412 }
2413
2414 apex_key {
2415 name: "myapex.key",
2416 public_key: "testkey.avbpubkey",
2417 private_key: "testkey.pem",
2418 }
2419
2420 cc_library {
2421 name: "libfoo",
2422 srcs: ["mylib.cpp"],
2423 apex_available: ["myapex"],
2424 min_sdk_version: "21",
2425 stl: "none",
2426 }
2427 `)
2428}
2429
Artur Satayev8cf899a2020-04-15 17:29:42 +01002430func TestJavaStableSdkVersion(t *testing.T) {
2431 testCases := []struct {
2432 name string
2433 expectedError string
2434 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002435 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002436 }{
2437 {
2438 name: "Non-updatable apex with non-stable dep",
2439 bp: `
2440 apex {
2441 name: "myapex",
2442 java_libs: ["myjar"],
2443 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002444 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002445 }
2446 apex_key {
2447 name: "myapex.key",
2448 public_key: "testkey.avbpubkey",
2449 private_key: "testkey.pem",
2450 }
2451 java_library {
2452 name: "myjar",
2453 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002454 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002455 apex_available: ["myapex"],
2456 }
2457 `,
2458 },
2459 {
2460 name: "Updatable apex with stable dep",
2461 bp: `
2462 apex {
2463 name: "myapex",
2464 java_libs: ["myjar"],
2465 key: "myapex.key",
2466 updatable: true,
2467 min_sdk_version: "29",
2468 }
2469 apex_key {
2470 name: "myapex.key",
2471 public_key: "testkey.avbpubkey",
2472 private_key: "testkey.pem",
2473 }
2474 java_library {
2475 name: "myjar",
2476 srcs: ["foo/bar/MyClass.java"],
2477 sdk_version: "current",
2478 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002479 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002480 }
2481 `,
2482 },
2483 {
2484 name: "Updatable apex with non-stable dep",
2485 expectedError: "cannot depend on \"myjar\"",
2486 bp: `
2487 apex {
2488 name: "myapex",
2489 java_libs: ["myjar"],
2490 key: "myapex.key",
2491 updatable: true,
2492 }
2493 apex_key {
2494 name: "myapex.key",
2495 public_key: "testkey.avbpubkey",
2496 private_key: "testkey.pem",
2497 }
2498 java_library {
2499 name: "myjar",
2500 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002501 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002502 apex_available: ["myapex"],
2503 }
2504 `,
2505 },
2506 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002507 name: "Updatable apex with non-stable legacy core platform dep",
2508 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2509 bp: `
2510 apex {
2511 name: "myapex",
2512 java_libs: ["myjar-uses-legacy"],
2513 key: "myapex.key",
2514 updatable: true,
2515 }
2516 apex_key {
2517 name: "myapex.key",
2518 public_key: "testkey.avbpubkey",
2519 private_key: "testkey.pem",
2520 }
2521 java_library {
2522 name: "myjar-uses-legacy",
2523 srcs: ["foo/bar/MyClass.java"],
2524 sdk_version: "core_platform",
2525 apex_available: ["myapex"],
2526 }
2527 `,
2528 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2529 },
2530 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002531 name: "Updatable apex with non-stable transitive dep",
2532 // This is not actually detecting that the transitive dependency is unstable, rather it is
2533 // detecting that the transitive dependency is building against a wider API surface than the
2534 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002535 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002536 bp: `
2537 apex {
2538 name: "myapex",
2539 java_libs: ["myjar"],
2540 key: "myapex.key",
2541 updatable: true,
2542 }
2543 apex_key {
2544 name: "myapex.key",
2545 public_key: "testkey.avbpubkey",
2546 private_key: "testkey.pem",
2547 }
2548 java_library {
2549 name: "myjar",
2550 srcs: ["foo/bar/MyClass.java"],
2551 sdk_version: "current",
2552 apex_available: ["myapex"],
2553 static_libs: ["transitive-jar"],
2554 }
2555 java_library {
2556 name: "transitive-jar",
2557 srcs: ["foo/bar/MyClass.java"],
2558 sdk_version: "core_platform",
2559 apex_available: ["myapex"],
2560 }
2561 `,
2562 },
2563 }
2564
2565 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002566 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2567 continue
2568 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002569 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002570 errorHandler := android.FixtureExpectsNoErrors
2571 if test.expectedError != "" {
2572 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002573 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002574 android.GroupFixturePreparers(
2575 java.PrepareForTestWithJavaDefaultModules,
2576 PrepareForTestWithApexBuildComponents,
2577 prepareForTestWithMyapex,
2578 android.OptionalFixturePreparer(test.preparer),
2579 ).
2580 ExtendWithErrorHandler(errorHandler).
2581 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002582 })
2583 }
2584}
2585
Jooyung Han749dc692020-04-15 11:03:39 +09002586func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2587 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2588 apex {
2589 name: "myapex",
2590 key: "myapex.key",
2591 native_shared_libs: ["mylib"],
2592 min_sdk_version: "29",
2593 }
2594
2595 apex_key {
2596 name: "myapex.key",
2597 public_key: "testkey.avbpubkey",
2598 private_key: "testkey.pem",
2599 }
2600
2601 cc_library {
2602 name: "mylib",
2603 srcs: ["mylib.cpp"],
2604 shared_libs: ["mylib2"],
2605 system_shared_libs: [],
2606 stl: "none",
2607 apex_available: [
2608 "myapex",
2609 ],
2610 min_sdk_version: "29",
2611 }
2612
2613 // indirect part of the apex
2614 cc_library {
2615 name: "mylib2",
2616 srcs: ["mylib.cpp"],
2617 system_shared_libs: [],
2618 stl: "none",
2619 apex_available: [
2620 "myapex",
2621 ],
2622 min_sdk_version: "30",
2623 }
2624 `)
2625}
2626
2627func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2628 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2629 apex {
2630 name: "myapex",
2631 key: "myapex.key",
2632 apps: ["AppFoo"],
2633 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002634 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002635 }
2636
2637 apex_key {
2638 name: "myapex.key",
2639 public_key: "testkey.avbpubkey",
2640 private_key: "testkey.pem",
2641 }
2642
2643 android_app {
2644 name: "AppFoo",
2645 srcs: ["foo/bar/MyClass.java"],
2646 sdk_version: "current",
2647 min_sdk_version: "29",
2648 system_modules: "none",
2649 stl: "none",
2650 static_libs: ["bar"],
2651 apex_available: [ "myapex" ],
2652 }
2653
2654 java_library {
2655 name: "bar",
2656 sdk_version: "current",
2657 srcs: ["a.java"],
2658 apex_available: [ "myapex" ],
2659 }
2660 `)
2661}
2662
2663func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002664 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002665 apex {
2666 name: "myapex",
2667 key: "myapex.key",
2668 native_shared_libs: ["mylib"],
2669 min_sdk_version: "29",
2670 }
2671
2672 apex_key {
2673 name: "myapex.key",
2674 public_key: "testkey.avbpubkey",
2675 private_key: "testkey.pem",
2676 }
2677
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002678 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002679 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2680 cc_library {
2681 name: "mylib",
2682 srcs: ["mylib.cpp"],
2683 shared_libs: ["mylib2"],
2684 system_shared_libs: [],
2685 stl: "none",
2686 apex_available: ["myapex", "otherapex"],
2687 min_sdk_version: "29",
2688 }
2689
2690 cc_library {
2691 name: "mylib2",
2692 srcs: ["mylib.cpp"],
2693 system_shared_libs: [],
2694 stl: "none",
2695 apex_available: ["otherapex"],
2696 stubs: { versions: ["29", "30"] },
2697 min_sdk_version: "30",
2698 }
2699
2700 apex {
2701 name: "otherapex",
2702 key: "myapex.key",
2703 native_shared_libs: ["mylib", "mylib2"],
2704 min_sdk_version: "30",
2705 }
2706 `)
2707 expectLink := func(from, from_variant, to, to_variant string) {
2708 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2709 libFlags := ld.Args["libFlags"]
2710 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2711 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002712 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002713 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002714}
2715
Jooyung Haned124c32021-01-26 11:43:46 +09002716func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002717 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2718 func(variables android.FixtureProductVariables) {
2719 variables.Platform_sdk_codename = proptools.StringPtr("S")
2720 variables.Platform_version_active_codenames = []string{"S"}
2721 },
2722 )
Jooyung Haned124c32021-01-26 11:43:46 +09002723 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2724 apex {
2725 name: "myapex",
2726 key: "myapex.key",
2727 native_shared_libs: ["libfoo"],
2728 min_sdk_version: "S",
2729 }
2730 apex_key {
2731 name: "myapex.key",
2732 public_key: "testkey.avbpubkey",
2733 private_key: "testkey.pem",
2734 }
2735 cc_library {
2736 name: "libfoo",
2737 shared_libs: ["libbar"],
2738 apex_available: ["myapex"],
2739 min_sdk_version: "29",
2740 }
2741 cc_library {
2742 name: "libbar",
2743 apex_available: ["myapex"],
2744 }
2745 `, withSAsActiveCodeNames)
2746}
2747
2748func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002749 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2750 variables.Platform_sdk_codename = proptools.StringPtr("S")
2751 variables.Platform_version_active_codenames = []string{"S", "T"}
2752 })
Colin Cross1c460562021-02-16 17:55:47 -08002753 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002754 apex {
2755 name: "myapex",
2756 key: "myapex.key",
2757 native_shared_libs: ["libfoo"],
2758 min_sdk_version: "S",
2759 }
2760 apex_key {
2761 name: "myapex.key",
2762 public_key: "testkey.avbpubkey",
2763 private_key: "testkey.pem",
2764 }
2765 cc_library {
2766 name: "libfoo",
2767 shared_libs: ["libbar"],
2768 apex_available: ["myapex"],
2769 min_sdk_version: "S",
2770 }
2771 cc_library {
2772 name: "libbar",
2773 stubs: {
2774 symbol_file: "libbar.map.txt",
2775 versions: ["30", "S", "T"],
2776 },
2777 }
2778 `, withSAsActiveCodeNames)
2779
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002780 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002781 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2782 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002783 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002784}
2785
Jiyong Park7c2ee712018-12-07 00:42:25 +09002786func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002787 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002788 apex {
2789 name: "myapex",
2790 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002791 native_shared_libs: ["mylib"],
2792 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002793 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002794 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002795 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002796 }
2797
2798 apex_key {
2799 name: "myapex.key",
2800 public_key: "testkey.avbpubkey",
2801 private_key: "testkey.pem",
2802 }
2803
2804 prebuilt_etc {
2805 name: "myetc",
2806 src: "myprebuilt",
2807 sub_dir: "foo/bar",
2808 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002809
2810 cc_library {
2811 name: "mylib",
2812 srcs: ["mylib.cpp"],
2813 relative_install_path: "foo/bar",
2814 system_shared_libs: [],
2815 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002816 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002817 }
2818
2819 cc_binary {
2820 name: "mybin",
2821 srcs: ["mylib.cpp"],
2822 relative_install_path: "foo/bar",
2823 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002824 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002825 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002826 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002827 `)
2828
Sundong Ahnabb64432019-10-22 13:58:29 +09002829 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002830 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002831
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002832 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002833 ensureContains(t, cmd, "/etc ")
2834 ensureContains(t, cmd, "/etc/foo ")
2835 ensureContains(t, cmd, "/etc/foo/bar ")
2836 ensureContains(t, cmd, "/lib64 ")
2837 ensureContains(t, cmd, "/lib64/foo ")
2838 ensureContains(t, cmd, "/lib64/foo/bar ")
2839 ensureContains(t, cmd, "/lib ")
2840 ensureContains(t, cmd, "/lib/foo ")
2841 ensureContains(t, cmd, "/lib/foo/bar ")
2842 ensureContains(t, cmd, "/bin ")
2843 ensureContains(t, cmd, "/bin/foo ")
2844 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002845}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002846
Jooyung Han35155c42020-02-06 17:33:20 +09002847func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002848 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002849 apex {
2850 name: "myapex",
2851 key: "myapex.key",
2852 multilib: {
2853 both: {
2854 native_shared_libs: ["mylib"],
2855 binaries: ["mybin"],
2856 },
2857 },
2858 compile_multilib: "both",
2859 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002860 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002861 }
2862
2863 apex_key {
2864 name: "myapex.key",
2865 public_key: "testkey.avbpubkey",
2866 private_key: "testkey.pem",
2867 }
2868
2869 cc_library {
2870 name: "mylib",
2871 relative_install_path: "foo/bar",
2872 system_shared_libs: [],
2873 stl: "none",
2874 apex_available: [ "myapex" ],
2875 native_bridge_supported: true,
2876 }
2877
2878 cc_binary {
2879 name: "mybin",
2880 relative_install_path: "foo/bar",
2881 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002882 stl: "none",
2883 apex_available: [ "myapex" ],
2884 native_bridge_supported: true,
2885 compile_multilib: "both", // default is "first" for binary
2886 multilib: {
2887 lib64: {
2888 suffix: "64",
2889 },
2890 },
2891 }
2892 `, withNativeBridgeEnabled)
2893 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2894 "bin/foo/bar/mybin",
2895 "bin/foo/bar/mybin64",
2896 "bin/arm/foo/bar/mybin",
2897 "bin/arm64/foo/bar/mybin64",
2898 "lib/foo/bar/mylib.so",
2899 "lib/arm/foo/bar/mylib.so",
2900 "lib64/foo/bar/mylib.so",
2901 "lib64/arm64/foo/bar/mylib.so",
2902 })
2903}
2904
Jooyung Han85d61762020-06-24 23:50:26 +09002905func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002906 result := android.GroupFixturePreparers(
2907 prepareForApexTest,
2908 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2909 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002910 apex {
2911 name: "myapex",
2912 key: "myapex.key",
2913 binaries: ["mybin"],
2914 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002915 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002916 }
2917 apex_key {
2918 name: "myapex.key",
2919 public_key: "testkey.avbpubkey",
2920 private_key: "testkey.pem",
2921 }
2922 cc_binary {
2923 name: "mybin",
2924 vendor: true,
2925 shared_libs: ["libfoo"],
2926 }
2927 cc_library {
2928 name: "libfoo",
2929 proprietary: true,
2930 }
2931 `)
2932
Colin Crossc68db4b2021-11-11 18:59:15 -08002933 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002934 "bin/mybin",
2935 "lib64/libfoo.so",
2936 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2937 "lib64/libc++.so",
2938 })
2939
Colin Crossc68db4b2021-11-11 18:59:15 -08002940 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2941 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002942 name := apexBundle.BaseModuleName()
2943 prefix := "TARGET_"
2944 var builder strings.Builder
2945 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002946 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002947 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002948 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002949
Colin Crossc68db4b2021-11-11 18:59:15 -08002950 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002951 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2952 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002953}
2954
Jooyung Hanc5a96762022-02-04 11:54:50 +09002955func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2956 testApexError(t, `Trying to include a VNDK library`, `
2957 apex {
2958 name: "myapex",
2959 key: "myapex.key",
2960 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2961 vendor: true,
2962 use_vndk_as_stable: true,
2963 updatable: false,
2964 }
2965 apex_key {
2966 name: "myapex.key",
2967 public_key: "testkey.avbpubkey",
2968 private_key: "testkey.pem",
2969 }`)
2970}
2971
Jooyung Handf78e212020-07-22 15:54:47 +09002972func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002973 // myapex myapex2
2974 // | |
2975 // mybin ------. mybin2
2976 // \ \ / |
2977 // (stable) .---\--------` |
2978 // \ / \ |
2979 // \ / \ /
2980 // libvndk libvendor
2981 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002982 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002983 apex {
2984 name: "myapex",
2985 key: "myapex.key",
2986 binaries: ["mybin"],
2987 vendor: true,
2988 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002989 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002990 }
2991 apex_key {
2992 name: "myapex.key",
2993 public_key: "testkey.avbpubkey",
2994 private_key: "testkey.pem",
2995 }
2996 cc_binary {
2997 name: "mybin",
2998 vendor: true,
2999 shared_libs: ["libvndk", "libvendor"],
3000 }
3001 cc_library {
3002 name: "libvndk",
3003 vndk: {
3004 enabled: true,
3005 },
3006 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003007 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09003008 }
3009 cc_library {
3010 name: "libvendor",
3011 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09003012 stl: "none",
3013 }
3014 apex {
3015 name: "myapex2",
3016 key: "myapex.key",
3017 binaries: ["mybin2"],
3018 vendor: true,
3019 use_vndk_as_stable: false,
3020 updatable: false,
3021 }
3022 cc_binary {
3023 name: "mybin2",
3024 vendor: true,
3025 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09003026 }
3027 `)
3028
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003029 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09003030
Jooyung Han91f92032022-02-04 12:36:33 +09003031 for _, tc := range []struct {
3032 name string
3033 apexName string
3034 moduleName string
3035 moduleVariant string
3036 libs []string
3037 contents []string
3038 requireVndkNamespace bool
3039 }{
3040 {
3041 name: "use_vndk_as_stable",
3042 apexName: "myapex",
3043 moduleName: "mybin",
3044 moduleVariant: vendorVariant + "_apex10000",
3045 libs: []string{
3046 // should link with vendor variants of VNDK libs(libvndk/libc++)
3047 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3048 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3049 // unstable Vendor libs as APEX variant
3050 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3051 },
3052 contents: []string{
3053 "bin/mybin",
3054 "lib64/libvendor.so",
3055 // VNDK libs (libvndk/libc++) are not included
3056 },
3057 requireVndkNamespace: true,
3058 },
3059 {
3060 name: "!use_vndk_as_stable",
3061 apexName: "myapex2",
3062 moduleName: "mybin2",
3063 moduleVariant: vendorVariant + "_myapex2",
3064 libs: []string{
3065 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3066 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3067 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3068 // unstable vendor libs have "merged" APEX variants
3069 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3070 },
3071 contents: []string{
3072 "bin/mybin2",
3073 "lib64/libvendor.so",
3074 // VNDK libs are included as well
3075 "lib64/libvndk.so",
3076 "lib64/libc++.so",
3077 },
3078 requireVndkNamespace: false,
3079 },
3080 } {
3081 t.Run(tc.name, func(t *testing.T) {
3082 // Check linked libs
3083 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3084 libs := names(ldRule.Args["libFlags"])
3085 for _, lib := range tc.libs {
3086 ensureListContains(t, libs, lib)
3087 }
3088 // Check apex contents
3089 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003090
Jooyung Han91f92032022-02-04 12:36:33 +09003091 // Check "requireNativeLibs"
3092 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
3093 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3094 if tc.requireVndkNamespace {
3095 ensureListContains(t, requireNativeLibs, ":vndk")
3096 } else {
3097 ensureListNotContains(t, requireNativeLibs, ":vndk")
3098 }
3099 })
3100 }
Jooyung Handf78e212020-07-22 15:54:47 +09003101}
3102
Justin Yun13decfb2021-03-08 19:25:55 +09003103func TestProductVariant(t *testing.T) {
3104 ctx := testApex(t, `
3105 apex {
3106 name: "myapex",
3107 key: "myapex.key",
3108 updatable: false,
3109 product_specific: true,
3110 binaries: ["foo"],
3111 }
3112
3113 apex_key {
3114 name: "myapex.key",
3115 public_key: "testkey.avbpubkey",
3116 private_key: "testkey.pem",
3117 }
3118
3119 cc_binary {
3120 name: "foo",
3121 product_available: true,
3122 apex_available: ["myapex"],
3123 srcs: ["foo.cpp"],
3124 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003125 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3126 variables.ProductVndkVersion = proptools.StringPtr("current")
3127 }),
3128 )
Justin Yun13decfb2021-03-08 19:25:55 +09003129
3130 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003131 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003132 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3133 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3134 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3135 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3136}
3137
Jooyung Han8e5685d2020-09-21 11:02:57 +09003138func TestApex_withPrebuiltFirmware(t *testing.T) {
3139 testCases := []struct {
3140 name string
3141 additionalProp string
3142 }{
3143 {"system apex with prebuilt_firmware", ""},
3144 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3145 }
3146 for _, tc := range testCases {
3147 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003148 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003149 apex {
3150 name: "myapex",
3151 key: "myapex.key",
3152 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003153 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003154 `+tc.additionalProp+`
3155 }
3156 apex_key {
3157 name: "myapex.key",
3158 public_key: "testkey.avbpubkey",
3159 private_key: "testkey.pem",
3160 }
3161 prebuilt_firmware {
3162 name: "myfirmware",
3163 src: "myfirmware.bin",
3164 filename_from_src: true,
3165 `+tc.additionalProp+`
3166 }
3167 `)
3168 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3169 "etc/firmware/myfirmware.bin",
3170 })
3171 })
3172 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003173}
3174
Jooyung Hanefb184e2020-06-25 17:14:25 +09003175func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003176 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003177 apex {
3178 name: "myapex",
3179 key: "myapex.key",
3180 vendor: true,
3181 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003182 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003183 }
3184
3185 apex_key {
3186 name: "myapex.key",
3187 public_key: "testkey.avbpubkey",
3188 private_key: "testkey.pem",
3189 }
3190
3191 cc_library {
3192 name: "mylib",
3193 vendor_available: true,
3194 }
3195 `)
3196
3197 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003198 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003199 name := apexBundle.BaseModuleName()
3200 prefix := "TARGET_"
3201 var builder strings.Builder
3202 data.Custom(&builder, name, prefix, "", data)
3203 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00003204 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 +09003205}
3206
Jooyung Han2ed99d02020-06-24 23:26:26 +09003207func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003208 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003209 apex {
3210 name: "myapex",
3211 key: "myapex.key",
3212 vintf_fragments: ["fragment.xml"],
3213 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003214 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003215 }
3216 apex_key {
3217 name: "myapex.key",
3218 public_key: "testkey.avbpubkey",
3219 private_key: "testkey.pem",
3220 }
3221 cc_binary {
3222 name: "mybin",
3223 }
3224 `)
3225
3226 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003227 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003228 name := apexBundle.BaseModuleName()
3229 prefix := "TARGET_"
3230 var builder strings.Builder
3231 data.Custom(&builder, name, prefix, "", data)
3232 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003233 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003234 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003235}
3236
Jiyong Park16e91a02018-12-20 18:18:08 +09003237func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003238 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003239 apex {
3240 name: "myapex",
3241 key: "myapex.key",
3242 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003243 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003244 }
3245
3246 apex_key {
3247 name: "myapex.key",
3248 public_key: "testkey.avbpubkey",
3249 private_key: "testkey.pem",
3250 }
3251
3252 cc_library {
3253 name: "mylib",
3254 srcs: ["mylib.cpp"],
3255 system_shared_libs: [],
3256 stl: "none",
3257 stubs: {
3258 versions: ["1", "2", "3"],
3259 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003260 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003261 }
3262
3263 cc_binary {
3264 name: "not_in_apex",
3265 srcs: ["mylib.cpp"],
3266 static_libs: ["mylib"],
3267 static_executable: true,
3268 system_shared_libs: [],
3269 stl: "none",
3270 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003271 `)
3272
Colin Cross7113d202019-11-20 16:39:12 -08003273 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003274
3275 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003276 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003277}
Jiyong Park9335a262018-12-24 11:31:58 +09003278
3279func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003280 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003281 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003282 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003283 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003284 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003285 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003286 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003287 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003288 }
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: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003296 }
3297
3298 apex_key {
3299 name: "myapex.key",
3300 public_key: "testkey.avbpubkey",
3301 private_key: "testkey.pem",
3302 }
3303
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003304 android_app_certificate {
3305 name: "myapex.certificate",
3306 certificate: "testkey",
3307 }
3308
3309 android_app_certificate {
3310 name: "myapex.certificate.override",
3311 certificate: "testkey.override",
3312 }
3313
Jiyong Park9335a262018-12-24 11:31:58 +09003314 `)
3315
3316 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003317 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003318
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003319 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3320 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003321 "vendor/foo/devkeys/testkey.avbpubkey")
3322 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003323 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3324 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003325 "vendor/foo/devkeys/testkey.pem")
3326 }
3327
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003328 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003329 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003330 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003331 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003332 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003333 }
3334}
Jiyong Park58e364a2019-01-19 19:24:06 +09003335
Jooyung Hanf121a652019-12-17 14:30:11 +09003336func TestCertificate(t *testing.T) {
3337 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003338 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003339 apex {
3340 name: "myapex",
3341 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003342 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003343 }
3344 apex_key {
3345 name: "myapex.key",
3346 public_key: "testkey.avbpubkey",
3347 private_key: "testkey.pem",
3348 }`)
3349 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3350 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3351 if actual := rule.Args["certificates"]; actual != expected {
3352 t.Errorf("certificates should be %q, not %q", expected, actual)
3353 }
3354 })
3355 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003356 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003357 apex {
3358 name: "myapex_keytest",
3359 key: "myapex.key",
3360 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003361 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003362 }
3363 apex_key {
3364 name: "myapex.key",
3365 public_key: "testkey.avbpubkey",
3366 private_key: "testkey.pem",
3367 }
3368 android_app_certificate {
3369 name: "myapex.certificate.override",
3370 certificate: "testkey.override",
3371 }`)
3372 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3373 expected := "testkey.override.x509.pem testkey.override.pk8"
3374 if actual := rule.Args["certificates"]; actual != expected {
3375 t.Errorf("certificates should be %q, not %q", expected, actual)
3376 }
3377 })
3378 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003379 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003380 apex {
3381 name: "myapex",
3382 key: "myapex.key",
3383 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003384 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003385 }
3386 apex_key {
3387 name: "myapex.key",
3388 public_key: "testkey.avbpubkey",
3389 private_key: "testkey.pem",
3390 }
3391 android_app_certificate {
3392 name: "myapex.certificate",
3393 certificate: "testkey",
3394 }`)
3395 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3396 expected := "testkey.x509.pem testkey.pk8"
3397 if actual := rule.Args["certificates"]; actual != expected {
3398 t.Errorf("certificates should be %q, not %q", expected, actual)
3399 }
3400 })
3401 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003402 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003403 apex {
3404 name: "myapex_keytest",
3405 key: "myapex.key",
3406 file_contexts: ":myapex-file_contexts",
3407 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003408 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003409 }
3410 apex_key {
3411 name: "myapex.key",
3412 public_key: "testkey.avbpubkey",
3413 private_key: "testkey.pem",
3414 }
3415 android_app_certificate {
3416 name: "myapex.certificate.override",
3417 certificate: "testkey.override",
3418 }`)
3419 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3420 expected := "testkey.override.x509.pem testkey.override.pk8"
3421 if actual := rule.Args["certificates"]; actual != expected {
3422 t.Errorf("certificates should be %q, not %q", expected, actual)
3423 }
3424 })
3425 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003426 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003427 apex {
3428 name: "myapex",
3429 key: "myapex.key",
3430 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003431 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003432 }
3433 apex_key {
3434 name: "myapex.key",
3435 public_key: "testkey.avbpubkey",
3436 private_key: "testkey.pem",
3437 }`)
3438 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3439 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3440 if actual := rule.Args["certificates"]; actual != expected {
3441 t.Errorf("certificates should be %q, not %q", expected, actual)
3442 }
3443 })
3444 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003445 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003446 apex {
3447 name: "myapex_keytest",
3448 key: "myapex.key",
3449 file_contexts: ":myapex-file_contexts",
3450 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003451 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003452 }
3453 apex_key {
3454 name: "myapex.key",
3455 public_key: "testkey.avbpubkey",
3456 private_key: "testkey.pem",
3457 }
3458 android_app_certificate {
3459 name: "myapex.certificate.override",
3460 certificate: "testkey.override",
3461 }`)
3462 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3463 expected := "testkey.override.x509.pem testkey.override.pk8"
3464 if actual := rule.Args["certificates"]; actual != expected {
3465 t.Errorf("certificates should be %q, not %q", expected, actual)
3466 }
3467 })
3468}
3469
Jiyong Park58e364a2019-01-19 19:24:06 +09003470func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003471 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003472 apex {
3473 name: "myapex",
3474 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003475 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003476 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003477 }
3478
3479 apex {
3480 name: "otherapex",
3481 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003482 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003483 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003484 }
3485
3486 apex_key {
3487 name: "myapex.key",
3488 public_key: "testkey.avbpubkey",
3489 private_key: "testkey.pem",
3490 }
3491
3492 cc_library {
3493 name: "mylib",
3494 srcs: ["mylib.cpp"],
3495 system_shared_libs: [],
3496 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003497 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003498 "myapex",
3499 "otherapex",
3500 ],
Jooyung Han24282772020-03-21 23:20:55 +09003501 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003502 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003503 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003504 cc_library {
3505 name: "mylib2",
3506 srcs: ["mylib.cpp"],
3507 system_shared_libs: [],
3508 stl: "none",
3509 apex_available: [
3510 "myapex",
3511 "otherapex",
3512 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003513 static_libs: ["mylib3"],
3514 recovery_available: true,
3515 min_sdk_version: "29",
3516 }
3517 cc_library {
3518 name: "mylib3",
3519 srcs: ["mylib.cpp"],
3520 system_shared_libs: [],
3521 stl: "none",
3522 apex_available: [
3523 "myapex",
3524 "otherapex",
3525 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003526 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003527 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003528 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003529 `)
3530
Jooyung Hanc87a0592020-03-02 17:44:33 +09003531 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003532 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003533 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003534
Vinh Tranf9754732023-01-19 22:41:46 -05003535 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003536 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003537 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003538
Vinh Tranf9754732023-01-19 22:41:46 -05003539 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003540 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003541 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003542
Colin Crossaede88c2020-08-11 12:17:01 -07003543 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3544 // each variant defines additional macros to distinguish which apex variant it is built for
3545
3546 // non-APEX variant does not have __ANDROID_APEX__ defined
3547 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3548 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3549
Vinh Tranf9754732023-01-19 22:41:46 -05003550 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003551 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3552 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003553
Jooyung Hanc87a0592020-03-02 17:44:33 +09003554 // non-APEX variant does not have __ANDROID_APEX__ defined
3555 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3556 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3557
Vinh Tranf9754732023-01-19 22:41:46 -05003558 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003559 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003560 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003561}
Jiyong Park7e636d02019-01-28 16:16:54 +09003562
3563func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003564 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003565 apex {
3566 name: "myapex",
3567 key: "myapex.key",
3568 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003569 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003570 }
3571
3572 apex_key {
3573 name: "myapex.key",
3574 public_key: "testkey.avbpubkey",
3575 private_key: "testkey.pem",
3576 }
3577
3578 cc_library_headers {
3579 name: "mylib_headers",
3580 export_include_dirs: ["my_include"],
3581 system_shared_libs: [],
3582 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003583 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003584 }
3585
3586 cc_library {
3587 name: "mylib",
3588 srcs: ["mylib.cpp"],
3589 system_shared_libs: [],
3590 stl: "none",
3591 header_libs: ["mylib_headers"],
3592 export_header_lib_headers: ["mylib_headers"],
3593 stubs: {
3594 versions: ["1", "2", "3"],
3595 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003596 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003597 }
3598
3599 cc_library {
3600 name: "otherlib",
3601 srcs: ["mylib.cpp"],
3602 system_shared_libs: [],
3603 stl: "none",
3604 shared_libs: ["mylib"],
3605 }
3606 `)
3607
Colin Cross7113d202019-11-20 16:39:12 -08003608 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003609
3610 // Ensure that the include path of the header lib is exported to 'otherlib'
3611 ensureContains(t, cFlags, "-Imy_include")
3612}
Alex Light9670d332019-01-29 18:07:33 -08003613
Jiyong Park7cd10e32020-01-14 09:22:18 +09003614type fileInApex struct {
3615 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003616 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003617 isLink bool
3618}
3619
Jooyung Han1724d582022-12-21 10:17:44 +09003620func (f fileInApex) String() string {
3621 return f.src + ":" + f.path
3622}
3623
3624func (f fileInApex) match(expectation string) bool {
3625 parts := strings.Split(expectation, ":")
3626 if len(parts) == 1 {
3627 match, _ := path.Match(parts[0], f.path)
3628 return match
3629 }
3630 if len(parts) == 2 {
3631 matchSrc, _ := path.Match(parts[0], f.src)
3632 matchDst, _ := path.Match(parts[1], f.path)
3633 return matchSrc && matchDst
3634 }
3635 panic("invalid expected file specification: " + expectation)
3636}
3637
Jooyung Hana57af4a2020-01-23 05:36:59 +00003638func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003639 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003640 module := ctx.ModuleForTests(moduleName, variant)
3641 apexRule := module.MaybeRule("apexRule")
3642 apexDir := "/image.apex/"
3643 if apexRule.Rule == nil {
3644 apexRule = module.Rule("zipApexRule")
3645 apexDir = "/image.zipapex/"
3646 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003647 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003648 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003649 for _, cmd := range strings.Split(copyCmds, "&&") {
3650 cmd = strings.TrimSpace(cmd)
3651 if cmd == "" {
3652 continue
3653 }
3654 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003655 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003656 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003657 switch terms[0] {
3658 case "mkdir":
3659 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003660 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003661 t.Fatal("copyCmds contains invalid cp command", cmd)
3662 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003663 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003664 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003665 isLink = false
3666 case "ln":
3667 if len(terms) != 3 && len(terms) != 4 {
3668 // ln LINK TARGET or ln -s LINK TARGET
3669 t.Fatal("copyCmds contains invalid ln command", cmd)
3670 }
3671 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003672 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003673 isLink = true
3674 default:
3675 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3676 }
3677 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003678 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003679 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003680 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003681 }
Jooyung Han1724d582022-12-21 10:17:44 +09003682 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003683 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003684 }
3685 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003686 return ret
3687}
3688
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003689func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003690 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003691 var failed bool
3692 var surplus []string
3693 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003694 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003695 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003696 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003697 if file.match(expected) {
3698 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003699 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003700 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003701 }
3702 }
Jooyung Han1724d582022-12-21 10:17:44 +09003703 if !matchFound {
3704 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003705 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003706 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003707
Jooyung Han31c470b2019-10-18 16:26:59 +09003708 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003709 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003710 t.Log("surplus files", surplus)
3711 failed = true
3712 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003713
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003714 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003715 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003716 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003717 if !filesMatched[expected] {
3718 missing = append(missing, expected)
3719 }
3720 }
3721 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003722 t.Log("missing files", missing)
3723 failed = true
3724 }
3725 if failed {
3726 t.Fail()
3727 }
3728}
3729
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003730func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3731 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3732}
3733
3734func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3735 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3736 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3737 if deapexer.Output != nil {
3738 outputs = append(outputs, deapexer.Output.String())
3739 }
3740 for _, output := range deapexer.ImplicitOutputs {
3741 outputs = append(outputs, output.String())
3742 }
3743 actualFiles := make([]fileInApex, 0, len(outputs))
3744 for _, output := range outputs {
3745 dir := "/deapexer/"
3746 pos := strings.LastIndex(output, dir)
3747 if pos == -1 {
3748 t.Fatal("Unknown deapexer output ", output)
3749 }
3750 path := output[pos+len(dir):]
3751 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3752 }
3753 assertFileListEquals(t, files, actualFiles)
3754}
3755
Jooyung Han344d5432019-08-23 11:17:39 +09003756func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003757 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003758 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003759 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003760 "etc/llndk.libraries.29.txt",
3761 "etc/vndkcore.libraries.29.txt",
3762 "etc/vndksp.libraries.29.txt",
3763 "etc/vndkprivate.libraries.29.txt",
3764 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003765 }
3766 testCases := []struct {
3767 vndkVersion string
3768 expectedFiles []string
3769 }{
3770 {
3771 vndkVersion: "current",
3772 expectedFiles: append(commonFiles,
3773 "lib/libvndk.so",
3774 "lib/libvndksp.so",
3775 "lib64/libvndk.so",
3776 "lib64/libvndksp.so"),
3777 },
3778 {
3779 vndkVersion: "",
3780 expectedFiles: append(commonFiles,
3781 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3782 "lib/libvndksp.so",
3783 "lib64/libvndksp.so"),
3784 },
3785 }
3786 for _, tc := range testCases {
3787 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3788 ctx := testApex(t, `
3789 apex_vndk {
3790 name: "com.android.vndk.current",
3791 key: "com.android.vndk.current.key",
3792 updatable: false,
3793 }
3794
3795 apex_key {
3796 name: "com.android.vndk.current.key",
3797 public_key: "testkey.avbpubkey",
3798 private_key: "testkey.pem",
3799 }
3800
3801 cc_library {
3802 name: "libvndk",
3803 srcs: ["mylib.cpp"],
3804 vendor_available: true,
3805 product_available: true,
3806 vndk: {
3807 enabled: true,
3808 },
3809 system_shared_libs: [],
3810 stl: "none",
3811 apex_available: [ "com.android.vndk.current" ],
3812 }
3813
3814 cc_library {
3815 name: "libvndksp",
3816 srcs: ["mylib.cpp"],
3817 vendor_available: true,
3818 product_available: true,
3819 vndk: {
3820 enabled: true,
3821 support_system_process: true,
3822 },
3823 system_shared_libs: [],
3824 stl: "none",
3825 apex_available: [ "com.android.vndk.current" ],
3826 }
3827
3828 // VNDK-Ext should not cause any problems
3829
3830 cc_library {
3831 name: "libvndk.ext",
3832 srcs: ["mylib2.cpp"],
3833 vendor: true,
3834 vndk: {
3835 enabled: true,
3836 extends: "libvndk",
3837 },
3838 system_shared_libs: [],
3839 stl: "none",
3840 }
3841
3842 cc_library {
3843 name: "libvndksp.ext",
3844 srcs: ["mylib2.cpp"],
3845 vendor: true,
3846 vndk: {
3847 enabled: true,
3848 support_system_process: true,
3849 extends: "libvndksp",
3850 },
3851 system_shared_libs: [],
3852 stl: "none",
3853 }
3854 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3855 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3856 }))
3857 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3858 })
3859 }
Jooyung Han344d5432019-08-23 11:17:39 +09003860}
3861
3862func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003863 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003864 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003865 name: "com.android.vndk.current",
3866 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003867 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003868 }
3869
3870 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003871 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003872 public_key: "testkey.avbpubkey",
3873 private_key: "testkey.pem",
3874 }
3875
3876 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003877 name: "libvndk",
3878 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003879 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003880 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003881 vndk: {
3882 enabled: true,
3883 },
3884 system_shared_libs: [],
3885 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003886 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003887 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003888
3889 cc_prebuilt_library_shared {
3890 name: "libvndk.arm",
3891 srcs: ["libvndk.arm.so"],
3892 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003893 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003894 vndk: {
3895 enabled: true,
3896 },
3897 enabled: false,
3898 arch: {
3899 arm: {
3900 enabled: true,
3901 },
3902 },
3903 system_shared_libs: [],
3904 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003905 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003906 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003907 `+vndkLibrariesTxtFiles("current"),
3908 withFiles(map[string][]byte{
3909 "libvndk.so": nil,
3910 "libvndk.arm.so": nil,
3911 }))
Colin Cross2807f002021-03-02 10:15:29 -08003912 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003913 "lib/libvndk.so",
3914 "lib/libvndk.arm.so",
3915 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003916 "lib/libc++.so",
3917 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003918 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003919 })
Jooyung Han344d5432019-08-23 11:17:39 +09003920}
3921
Jooyung Han39edb6c2019-11-06 16:53:07 +09003922func vndkLibrariesTxtFiles(vers ...string) (result string) {
3923 for _, v := range vers {
3924 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003925 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003926 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003927 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003928 name: "` + txt + `.libraries.txt",
3929 }
3930 `
3931 }
3932 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003933 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003934 result += `
3935 prebuilt_etc {
3936 name: "` + txt + `.libraries.` + v + `.txt",
3937 src: "dummy.txt",
3938 }
3939 `
3940 }
3941 }
3942 }
3943 return
3944}
3945
Jooyung Han344d5432019-08-23 11:17:39 +09003946func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003947 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003948 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003949 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003950 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003951 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003952 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003953 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003954 }
3955
3956 apex_key {
3957 name: "myapex.key",
3958 public_key: "testkey.avbpubkey",
3959 private_key: "testkey.pem",
3960 }
3961
Jooyung Han31c470b2019-10-18 16:26:59 +09003962 vndk_prebuilt_shared {
3963 name: "libvndk27",
3964 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003965 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003966 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003967 vndk: {
3968 enabled: true,
3969 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003970 target_arch: "arm64",
3971 arch: {
3972 arm: {
3973 srcs: ["libvndk27_arm.so"],
3974 },
3975 arm64: {
3976 srcs: ["libvndk27_arm64.so"],
3977 },
3978 },
Colin Cross2807f002021-03-02 10:15:29 -08003979 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003980 }
3981
3982 vndk_prebuilt_shared {
3983 name: "libvndk27",
3984 version: "27",
3985 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003986 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003987 vndk: {
3988 enabled: true,
3989 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003990 target_arch: "x86_64",
3991 arch: {
3992 x86: {
3993 srcs: ["libvndk27_x86.so"],
3994 },
3995 x86_64: {
3996 srcs: ["libvndk27_x86_64.so"],
3997 },
3998 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003999 }
4000 `+vndkLibrariesTxtFiles("27"),
4001 withFiles(map[string][]byte{
4002 "libvndk27_arm.so": nil,
4003 "libvndk27_arm64.so": nil,
4004 "libvndk27_x86.so": nil,
4005 "libvndk27_x86_64.so": nil,
4006 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004007
Colin Cross2807f002021-03-02 10:15:29 -08004008 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004009 "lib/libvndk27_arm.so",
4010 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004011 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004012 })
Jooyung Han344d5432019-08-23 11:17:39 +09004013}
4014
Jooyung Han90eee022019-10-01 20:02:42 +09004015func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004016 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004017 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004018 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09004019 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004020 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004021 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004022 }
4023 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004024 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004025 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004026 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004027 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004028 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004029 }
4030 apex_key {
4031 name: "myapex.key",
4032 public_key: "testkey.avbpubkey",
4033 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004034 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004035
4036 assertApexName := func(expected, moduleName string) {
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004037 module := ctx.ModuleForTests(moduleName, "android_common_image")
4038 apexManifestRule := module.Rule("apexManifestRule")
4039 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004040 }
4041
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004042 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004043 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004044}
4045
Jooyung Han344d5432019-08-23 11:17:39 +09004046func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004047 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004048 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004049 name: "com.android.vndk.current",
4050 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004051 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004052 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004053 }
4054
4055 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004056 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004057 public_key: "testkey.avbpubkey",
4058 private_key: "testkey.pem",
4059 }
4060
4061 cc_library {
4062 name: "libvndk",
4063 srcs: ["mylib.cpp"],
4064 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004065 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004066 native_bridge_supported: true,
4067 host_supported: true,
4068 vndk: {
4069 enabled: true,
4070 },
4071 system_shared_libs: [],
4072 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004073 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004074 }
Colin Cross2807f002021-03-02 10:15:29 -08004075 `+vndkLibrariesTxtFiles("current"),
4076 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004077
Colin Cross2807f002021-03-02 10:15:29 -08004078 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004079 "lib/libvndk.so",
4080 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004081 "lib/libc++.so",
4082 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004083 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004084 })
Jooyung Han344d5432019-08-23 11:17:39 +09004085}
4086
4087func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004088 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004089 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004090 name: "com.android.vndk.current",
4091 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004092 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004093 native_bridge_supported: true,
4094 }
4095
4096 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004097 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004098 public_key: "testkey.avbpubkey",
4099 private_key: "testkey.pem",
4100 }
4101
4102 cc_library {
4103 name: "libvndk",
4104 srcs: ["mylib.cpp"],
4105 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004106 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004107 native_bridge_supported: true,
4108 host_supported: true,
4109 vndk: {
4110 enabled: true,
4111 },
4112 system_shared_libs: [],
4113 stl: "none",
4114 }
4115 `)
4116}
4117
Jooyung Han31c470b2019-10-18 16:26:59 +09004118func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004119 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004120 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004121 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004122 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004123 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004124 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004125 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004126 }
4127
4128 apex_key {
4129 name: "myapex.key",
4130 public_key: "testkey.avbpubkey",
4131 private_key: "testkey.pem",
4132 }
4133
4134 vndk_prebuilt_shared {
4135 name: "libvndk27",
4136 version: "27",
4137 target_arch: "arm",
4138 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004139 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004140 vndk: {
4141 enabled: true,
4142 },
4143 arch: {
4144 arm: {
4145 srcs: ["libvndk27.so"],
4146 }
4147 },
4148 }
4149
4150 vndk_prebuilt_shared {
4151 name: "libvndk27",
4152 version: "27",
4153 target_arch: "arm",
4154 binder32bit: true,
4155 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004156 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004157 vndk: {
4158 enabled: true,
4159 },
4160 arch: {
4161 arm: {
4162 srcs: ["libvndk27binder32.so"],
4163 }
4164 },
Colin Cross2807f002021-03-02 10:15:29 -08004165 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004166 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004167 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004168 withFiles(map[string][]byte{
4169 "libvndk27.so": nil,
4170 "libvndk27binder32.so": nil,
4171 }),
4172 withBinder32bit,
4173 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004174 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004175 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4176 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004177 },
4178 }),
4179 )
4180
Colin Cross2807f002021-03-02 10:15:29 -08004181 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004182 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004183 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004184 })
4185}
4186
Jooyung Han45a96772020-06-15 14:59:42 +09004187func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004188 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004189 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004190 name: "com.android.vndk.current",
4191 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004192 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004193 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004194 }
4195
4196 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004197 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004198 public_key: "testkey.avbpubkey",
4199 private_key: "testkey.pem",
4200 }
4201
4202 cc_library {
4203 name: "libz",
4204 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004205 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004206 vndk: {
4207 enabled: true,
4208 },
4209 stubs: {
4210 symbol_file: "libz.map.txt",
4211 versions: ["30"],
4212 }
4213 }
4214 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4215 "libz.map.txt": nil,
4216 }))
4217
Colin Cross2807f002021-03-02 10:15:29 -08004218 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004219 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4220 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09004221 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
4222 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4223 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4224 "*/*",
4225 })
Jooyung Han45a96772020-06-15 14:59:42 +09004226}
4227
Jooyung Hane3f02812023-05-08 13:54:50 +09004228func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4229 ctx := testApex(t, "",
4230 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4231 variables.DeviceVndkVersion = proptools.StringPtr("27")
4232 }),
4233 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4234 cc.RegisterVendorSnapshotModules(ctx)
4235 }),
4236 withFiles(map[string][]byte{
4237 "vendor/foo/Android.bp": []byte(`
4238 apex {
4239 name: "myapex",
4240 binaries: ["foo"],
4241 key: "myapex.key",
4242 min_sdk_version: "27",
4243 vendor: true,
4244 }
4245
4246 cc_binary {
4247 name: "foo",
4248 vendor: true,
4249 srcs: ["abc.cpp"],
4250 shared_libs: [
4251 "libllndk",
4252 "libvndk",
4253 ],
4254 nocrt: true,
4255 system_shared_libs: [],
4256 min_sdk_version: "27",
4257 }
4258
4259 apex_key {
4260 name: "myapex.key",
4261 public_key: "testkey.avbpubkey",
4262 private_key: "testkey.pem",
4263 }
4264 `),
4265 // Simulate VNDK prebuilts with vendor_snapshot
4266 "prebuilts/vndk/Android.bp": []byte(`
4267 vndk_prebuilt_shared {
4268 name: "libllndk",
4269 version: "27",
4270 vendor_available: true,
4271 product_available: true,
4272 target_arch: "arm64",
4273 arch: {
4274 arm64: {
4275 srcs: ["libllndk.so"],
4276 },
4277 },
4278 }
4279
4280 vndk_prebuilt_shared {
4281 name: "libvndk",
4282 version: "27",
4283 vendor_available: true,
4284 product_available: true,
4285 target_arch: "arm64",
4286 arch: {
4287 arm64: {
4288 srcs: ["libvndk.so"],
4289 },
4290 },
4291 vndk: {
4292 enabled: true,
4293 },
4294 min_sdk_version: "27",
4295 }
4296
4297 vndk_prebuilt_shared {
4298 name: "libc++",
4299 version: "27",
4300 target_arch: "arm64",
4301 vendor_available: true,
4302 product_available: true,
4303 vndk: {
4304 enabled: true,
4305 support_system_process: true,
4306 },
4307 arch: {
4308 arm64: {
4309 srcs: ["libc++.so"],
4310 },
4311 },
4312 min_sdk_version: "apex_inherit",
4313 }
4314
4315 vendor_snapshot {
4316 name: "vendor_snapshot",
4317 version: "27",
4318 arch: {
4319 arm64: {
4320 vndk_libs: [
4321 "libc++",
4322 "libllndk",
4323 "libvndk",
4324 ],
4325 static_libs: [
4326 "libc++demangle",
4327 "libclang_rt.builtins",
4328 "libunwind",
4329 ],
4330 },
4331 }
4332 }
4333
4334 vendor_snapshot_static {
4335 name: "libclang_rt.builtins",
4336 version: "27",
4337 target_arch: "arm64",
4338 vendor: true,
4339 arch: {
4340 arm64: {
4341 src: "libclang_rt.builtins-aarch64-android.a",
4342 },
4343 },
4344 }
4345
4346 vendor_snapshot_static {
4347 name: "libc++demangle",
4348 version: "27",
4349 target_arch: "arm64",
4350 compile_multilib: "64",
4351 vendor: true,
4352 arch: {
4353 arm64: {
4354 src: "libc++demangle.a",
4355 },
4356 },
4357 min_sdk_version: "apex_inherit",
4358 }
4359
4360 vendor_snapshot_static {
4361 name: "libunwind",
4362 version: "27",
4363 target_arch: "arm64",
4364 compile_multilib: "64",
4365 vendor: true,
4366 arch: {
4367 arm64: {
4368 src: "libunwind.a",
4369 },
4370 },
4371 min_sdk_version: "apex_inherit",
4372 }
4373 `),
4374 }))
4375
4376 // Should embed the prebuilt VNDK libraries in the apex
4377 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4378 "bin/foo",
4379 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4380 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4381 })
4382
4383 // Should link foo with prebuilt libraries (shared/static)
4384 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4385 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4386 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4387 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4388 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4389
4390 // Should declare the LLNDK library as a "required" external dependency
4391 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4392 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4393 ensureListContains(t, requireNativeLibs, "libllndk.so")
4394}
4395
Jooyung Hane1633032019-08-01 17:41:43 +09004396func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004397 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004398 apex {
4399 name: "myapex_nodep",
4400 key: "myapex.key",
4401 native_shared_libs: ["lib_nodep"],
4402 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004403 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004404 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004405 }
4406
4407 apex {
4408 name: "myapex_dep",
4409 key: "myapex.key",
4410 native_shared_libs: ["lib_dep"],
4411 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004412 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004413 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004414 }
4415
4416 apex {
4417 name: "myapex_provider",
4418 key: "myapex.key",
4419 native_shared_libs: ["libfoo"],
4420 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004421 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004422 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004423 }
4424
4425 apex {
4426 name: "myapex_selfcontained",
4427 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004428 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004429 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004430 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004431 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004432 }
4433
4434 apex_key {
4435 name: "myapex.key",
4436 public_key: "testkey.avbpubkey",
4437 private_key: "testkey.pem",
4438 }
4439
4440 cc_library {
4441 name: "lib_nodep",
4442 srcs: ["mylib.cpp"],
4443 system_shared_libs: [],
4444 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004445 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004446 }
4447
4448 cc_library {
4449 name: "lib_dep",
4450 srcs: ["mylib.cpp"],
4451 shared_libs: ["libfoo"],
4452 system_shared_libs: [],
4453 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004454 apex_available: [
4455 "myapex_dep",
4456 "myapex_provider",
4457 "myapex_selfcontained",
4458 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004459 }
4460
4461 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004462 name: "lib_dep_on_bar",
4463 srcs: ["mylib.cpp"],
4464 shared_libs: ["libbar"],
4465 system_shared_libs: [],
4466 stl: "none",
4467 apex_available: [
4468 "myapex_selfcontained",
4469 ],
4470 }
4471
4472
4473 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004474 name: "libfoo",
4475 srcs: ["mytest.cpp"],
4476 stubs: {
4477 versions: ["1"],
4478 },
4479 system_shared_libs: [],
4480 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004481 apex_available: [
4482 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004483 ],
4484 }
4485
4486 cc_library {
4487 name: "libbar",
4488 srcs: ["mytest.cpp"],
4489 stubs: {
4490 versions: ["1"],
4491 },
4492 system_shared_libs: [],
4493 stl: "none",
4494 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004495 "myapex_selfcontained",
4496 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004497 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004498
Jooyung Hane1633032019-08-01 17:41:43 +09004499 `)
4500
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004501 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004502 var provideNativeLibs, requireNativeLibs []string
4503
Sundong Ahnabb64432019-10-22 13:58:29 +09004504 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004505 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4506 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004507 ensureListEmpty(t, provideNativeLibs)
4508 ensureListEmpty(t, requireNativeLibs)
4509
Sundong Ahnabb64432019-10-22 13:58:29 +09004510 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004511 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4512 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004513 ensureListEmpty(t, provideNativeLibs)
4514 ensureListContains(t, requireNativeLibs, "libfoo.so")
4515
Sundong Ahnabb64432019-10-22 13:58:29 +09004516 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004517 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4518 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004519 ensureListContains(t, provideNativeLibs, "libfoo.so")
4520 ensureListEmpty(t, requireNativeLibs)
4521
Sundong Ahnabb64432019-10-22 13:58:29 +09004522 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004523 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4524 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004525 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004526 ensureListEmpty(t, requireNativeLibs)
4527}
4528
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004529func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4530 ctx := testApex(t, `
4531 apex {
4532 name: "myapex",
4533 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004534 native_shared_libs: ["mylib"],
4535 updatable: false,
4536 }
4537
4538 apex_key {
4539 name: "myapex.key",
4540 public_key: "testkey.avbpubkey",
4541 private_key: "testkey.pem",
4542 }
4543
4544 cc_library {
4545 name: "mylib",
4546 srcs: ["mylib.cpp"],
4547 system_shared_libs: [],
4548 stl: "none",
4549 apex_available: [
4550 "//apex_available:platform",
4551 "myapex",
4552 ],
4553 }
4554 `, android.FixtureMergeEnv(map[string]string{
4555 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4556 }))
4557
Jooyung Han63dff462023-02-09 00:11:27 +00004558 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004559 apexManifestRule := module.Rule("apexManifestRule")
4560 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4561}
4562
Vinh Tran8f5310f2022-10-07 18:16:47 -04004563func TestCompileMultilibProp(t *testing.T) {
4564 testCases := []struct {
4565 compileMultiLibProp string
4566 containedLibs []string
4567 notContainedLibs []string
4568 }{
4569 {
4570 containedLibs: []string{
4571 "image.apex/lib64/mylib.so",
4572 "image.apex/lib/mylib.so",
4573 },
4574 compileMultiLibProp: `compile_multilib: "both",`,
4575 },
4576 {
4577 containedLibs: []string{"image.apex/lib64/mylib.so"},
4578 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4579 compileMultiLibProp: `compile_multilib: "first",`,
4580 },
4581 {
4582 containedLibs: []string{"image.apex/lib64/mylib.so"},
4583 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4584 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4585 },
4586 {
4587 containedLibs: []string{"image.apex/lib64/mylib.so"},
4588 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4589 compileMultiLibProp: `compile_multilib: "64",`,
4590 },
4591 {
4592 containedLibs: []string{"image.apex/lib/mylib.so"},
4593 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4594 compileMultiLibProp: `compile_multilib: "32",`,
4595 },
4596 }
4597 for _, testCase := range testCases {
4598 ctx := testApex(t, fmt.Sprintf(`
4599 apex {
4600 name: "myapex",
4601 key: "myapex.key",
4602 %s
4603 native_shared_libs: ["mylib"],
4604 updatable: false,
4605 }
4606 apex_key {
4607 name: "myapex.key",
4608 public_key: "testkey.avbpubkey",
4609 private_key: "testkey.pem",
4610 }
4611 cc_library {
4612 name: "mylib",
4613 srcs: ["mylib.cpp"],
4614 apex_available: [
4615 "//apex_available:platform",
4616 "myapex",
4617 ],
4618 }
4619 `, testCase.compileMultiLibProp),
4620 )
4621 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4622 apexRule := module.Rule("apexRule")
4623 copyCmds := apexRule.Args["copy_commands"]
4624 for _, containedLib := range testCase.containedLibs {
4625 ensureContains(t, copyCmds, containedLib)
4626 }
4627 for _, notContainedLib := range testCase.notContainedLibs {
4628 ensureNotContains(t, copyCmds, notContainedLib)
4629 }
4630 }
4631}
4632
Alex Light0851b882019-02-07 13:20:53 -08004633func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004634 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004635 apex {
4636 name: "myapex",
4637 key: "myapex.key",
4638 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004639 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004640 }
4641
4642 apex_key {
4643 name: "myapex.key",
4644 public_key: "testkey.avbpubkey",
4645 private_key: "testkey.pem",
4646 }
4647
4648 cc_library {
4649 name: "mylib_common",
4650 srcs: ["mylib.cpp"],
4651 system_shared_libs: [],
4652 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004653 apex_available: [
4654 "//apex_available:platform",
4655 "myapex",
4656 ],
Alex Light0851b882019-02-07 13:20:53 -08004657 }
4658 `)
4659
Sundong Ahnabb64432019-10-22 13:58:29 +09004660 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004661 apexRule := module.Rule("apexRule")
4662 copyCmds := apexRule.Args["copy_commands"]
4663
4664 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4665 t.Log("Apex was a test apex!")
4666 t.Fail()
4667 }
4668 // Ensure that main rule creates an output
4669 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4670
4671 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004672 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004673
4674 // Ensure that both direct and indirect deps are copied into apex
4675 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4676
Colin Cross7113d202019-11-20 16:39:12 -08004677 // Ensure that the platform variant ends with _shared
4678 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004679
Colin Cross56a83212020-09-15 18:30:11 -07004680 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004681 t.Log("Found mylib_common not in any apex!")
4682 t.Fail()
4683 }
4684}
4685
4686func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004687 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004688 apex_test {
4689 name: "myapex",
4690 key: "myapex.key",
4691 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004692 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004693 }
4694
4695 apex_key {
4696 name: "myapex.key",
4697 public_key: "testkey.avbpubkey",
4698 private_key: "testkey.pem",
4699 }
4700
4701 cc_library {
4702 name: "mylib_common_test",
4703 srcs: ["mylib.cpp"],
4704 system_shared_libs: [],
4705 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004706 // TODO: remove //apex_available:platform
4707 apex_available: [
4708 "//apex_available:platform",
4709 "myapex",
4710 ],
Alex Light0851b882019-02-07 13:20:53 -08004711 }
4712 `)
4713
Sundong Ahnabb64432019-10-22 13:58:29 +09004714 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004715 apexRule := module.Rule("apexRule")
4716 copyCmds := apexRule.Args["copy_commands"]
4717
4718 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4719 t.Log("Apex was not a test apex!")
4720 t.Fail()
4721 }
4722 // Ensure that main rule creates an output
4723 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4724
4725 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004726 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004727
4728 // Ensure that both direct and indirect deps are copied into apex
4729 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4730
Colin Cross7113d202019-11-20 16:39:12 -08004731 // Ensure that the platform variant ends with _shared
4732 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004733}
4734
Alex Light9670d332019-01-29 18:07:33 -08004735func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004736 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004737 apex {
4738 name: "myapex",
4739 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004740 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004741 multilib: {
4742 first: {
4743 native_shared_libs: ["mylib_common"],
4744 }
4745 },
4746 target: {
4747 android: {
4748 multilib: {
4749 first: {
4750 native_shared_libs: ["mylib"],
4751 }
4752 }
4753 },
4754 host: {
4755 multilib: {
4756 first: {
4757 native_shared_libs: ["mylib2"],
4758 }
4759 }
4760 }
4761 }
4762 }
4763
4764 apex_key {
4765 name: "myapex.key",
4766 public_key: "testkey.avbpubkey",
4767 private_key: "testkey.pem",
4768 }
4769
4770 cc_library {
4771 name: "mylib",
4772 srcs: ["mylib.cpp"],
4773 system_shared_libs: [],
4774 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004775 // TODO: remove //apex_available:platform
4776 apex_available: [
4777 "//apex_available:platform",
4778 "myapex",
4779 ],
Alex Light9670d332019-01-29 18:07:33 -08004780 }
4781
4782 cc_library {
4783 name: "mylib_common",
4784 srcs: ["mylib.cpp"],
4785 system_shared_libs: [],
4786 stl: "none",
4787 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004788 // TODO: remove //apex_available:platform
4789 apex_available: [
4790 "//apex_available:platform",
4791 "myapex",
4792 ],
Alex Light9670d332019-01-29 18:07:33 -08004793 }
4794
4795 cc_library {
4796 name: "mylib2",
4797 srcs: ["mylib.cpp"],
4798 system_shared_libs: [],
4799 stl: "none",
4800 compile_multilib: "first",
4801 }
4802 `)
4803
Sundong Ahnabb64432019-10-22 13:58:29 +09004804 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004805 copyCmds := apexRule.Args["copy_commands"]
4806
4807 // Ensure that main rule creates an output
4808 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4809
4810 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004811 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4812 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4813 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004814
4815 // Ensure that both direct and indirect deps are copied into apex
4816 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4817 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4818 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4819
Colin Cross7113d202019-11-20 16:39:12 -08004820 // Ensure that the platform variant ends with _shared
4821 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4822 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4823 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004824}
Jiyong Park04480cf2019-02-06 00:16:29 +09004825
Jiyong Park59140302020-12-14 18:44:04 +09004826func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004827 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004828 apex {
4829 name: "myapex",
4830 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004831 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004832 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004833 arch: {
4834 arm64: {
4835 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004836 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004837 },
4838 x86_64: {
4839 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004840 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004841 },
4842 }
4843 }
4844
4845 apex_key {
4846 name: "myapex.key",
4847 public_key: "testkey.avbpubkey",
4848 private_key: "testkey.pem",
4849 }
4850
4851 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004852 name: "mylib.generic",
4853 srcs: ["mylib.cpp"],
4854 system_shared_libs: [],
4855 stl: "none",
4856 // TODO: remove //apex_available:platform
4857 apex_available: [
4858 "//apex_available:platform",
4859 "myapex",
4860 ],
4861 }
4862
4863 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004864 name: "mylib.arm64",
4865 srcs: ["mylib.cpp"],
4866 system_shared_libs: [],
4867 stl: "none",
4868 // TODO: remove //apex_available:platform
4869 apex_available: [
4870 "//apex_available:platform",
4871 "myapex",
4872 ],
4873 }
4874
4875 cc_library {
4876 name: "mylib.x64",
4877 srcs: ["mylib.cpp"],
4878 system_shared_libs: [],
4879 stl: "none",
4880 // TODO: remove //apex_available:platform
4881 apex_available: [
4882 "//apex_available:platform",
4883 "myapex",
4884 ],
4885 }
4886 `)
4887
4888 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4889 copyCmds := apexRule.Args["copy_commands"]
4890
4891 // Ensure that apex variant is created for the direct dep
4892 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004893 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004894 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4895
4896 // Ensure that both direct and indirect deps are copied into apex
4897 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4898 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4899}
4900
Jiyong Park04480cf2019-02-06 00:16:29 +09004901func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004902 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004903 apex {
4904 name: "myapex",
4905 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004906 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004907 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004908 }
4909
4910 apex_key {
4911 name: "myapex.key",
4912 public_key: "testkey.avbpubkey",
4913 private_key: "testkey.pem",
4914 }
4915
4916 sh_binary {
4917 name: "myscript",
4918 src: "mylib.cpp",
4919 filename: "myscript.sh",
4920 sub_dir: "script",
4921 }
4922 `)
4923
Sundong Ahnabb64432019-10-22 13:58:29 +09004924 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004925 copyCmds := apexRule.Args["copy_commands"]
4926
4927 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4928}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004929
Jooyung Han91df2082019-11-20 01:49:42 +09004930func TestApexInVariousPartition(t *testing.T) {
4931 testcases := []struct {
4932 propName, parition, flattenedPartition string
4933 }{
4934 {"", "system", "system_ext"},
4935 {"product_specific: true", "product", "product"},
4936 {"soc_specific: true", "vendor", "vendor"},
4937 {"proprietary: true", "vendor", "vendor"},
4938 {"vendor: true", "vendor", "vendor"},
4939 {"system_ext_specific: true", "system_ext", "system_ext"},
4940 }
4941 for _, tc := range testcases {
4942 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004943 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004944 apex {
4945 name: "myapex",
4946 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004947 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004948 `+tc.propName+`
4949 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004950
Jooyung Han91df2082019-11-20 01:49:42 +09004951 apex_key {
4952 name: "myapex.key",
4953 public_key: "testkey.avbpubkey",
4954 private_key: "testkey.pem",
4955 }
4956 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004957
Jooyung Han91df2082019-11-20 01:49:42 +09004958 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004959 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4960 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004961 if actual != expected {
4962 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4963 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004964
Jooyung Han91df2082019-11-20 01:49:42 +09004965 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004966 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4967 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004968 if actual != expected {
4969 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4970 }
4971 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004972 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004973}
Jiyong Park67882562019-03-21 01:11:21 +09004974
Jooyung Han580eb4f2020-06-24 19:33:06 +09004975func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004976 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004977 apex {
4978 name: "myapex",
4979 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004980 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004981 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004982
Jooyung Han580eb4f2020-06-24 19:33:06 +09004983 apex_key {
4984 name: "myapex.key",
4985 public_key: "testkey.avbpubkey",
4986 private_key: "testkey.pem",
4987 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004988 `)
4989 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004990 rule := module.Output("file_contexts")
4991 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4992}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004993
Jooyung Han580eb4f2020-06-24 19:33:06 +09004994func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004995 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004996 apex {
4997 name: "myapex",
4998 key: "myapex.key",
4999 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005000 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005001 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005002
Jooyung Han580eb4f2020-06-24 19:33:06 +09005003 apex_key {
5004 name: "myapex.key",
5005 public_key: "testkey.avbpubkey",
5006 private_key: "testkey.pem",
5007 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005008 `, withFiles(map[string][]byte{
5009 "my_own_file_contexts": nil,
5010 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005011}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005012
Jooyung Han580eb4f2020-06-24 19:33:06 +09005013func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005014 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005015 apex {
5016 name: "myapex",
5017 key: "myapex.key",
5018 product_specific: true,
5019 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005020 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005021 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005022
Jooyung Han580eb4f2020-06-24 19:33:06 +09005023 apex_key {
5024 name: "myapex.key",
5025 public_key: "testkey.avbpubkey",
5026 private_key: "testkey.pem",
5027 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005028 `)
5029
Colin Cross1c460562021-02-16 17:55:47 -08005030 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005031 apex {
5032 name: "myapex",
5033 key: "myapex.key",
5034 product_specific: true,
5035 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005036 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005037 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005038
Jooyung Han580eb4f2020-06-24 19:33:06 +09005039 apex_key {
5040 name: "myapex.key",
5041 public_key: "testkey.avbpubkey",
5042 private_key: "testkey.pem",
5043 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005044 `, withFiles(map[string][]byte{
5045 "product_specific_file_contexts": nil,
5046 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005047 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5048 rule := module.Output("file_contexts")
5049 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5050}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005051
Jooyung Han580eb4f2020-06-24 19:33:06 +09005052func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005053 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005054 apex {
5055 name: "myapex",
5056 key: "myapex.key",
5057 product_specific: true,
5058 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005059 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005060 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005061
Jooyung Han580eb4f2020-06-24 19:33:06 +09005062 apex_key {
5063 name: "myapex.key",
5064 public_key: "testkey.avbpubkey",
5065 private_key: "testkey.pem",
5066 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005067
Jooyung Han580eb4f2020-06-24 19:33:06 +09005068 filegroup {
5069 name: "my-file-contexts",
5070 srcs: ["product_specific_file_contexts"],
5071 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005072 `, withFiles(map[string][]byte{
5073 "product_specific_file_contexts": nil,
5074 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005075 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5076 rule := module.Output("file_contexts")
5077 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005078}
5079
Jiyong Park67882562019-03-21 01:11:21 +09005080func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005081 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005082 apex_key {
5083 name: "myapex.key",
5084 public_key: ":my.avbpubkey",
5085 private_key: ":my.pem",
5086 product_specific: true,
5087 }
5088
5089 filegroup {
5090 name: "my.avbpubkey",
5091 srcs: ["testkey2.avbpubkey"],
5092 }
5093
5094 filegroup {
5095 name: "my.pem",
5096 srcs: ["testkey2.pem"],
5097 }
5098 `)
5099
5100 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5101 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005102 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005103 if actual_pubkey != expected_pubkey {
5104 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5105 }
5106 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005107 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005108 if actual_privkey != expected_privkey {
5109 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5110 }
5111}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005112
5113func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005114 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005115 prebuilt_apex {
5116 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005117 arch: {
5118 arm64: {
5119 src: "myapex-arm64.apex",
5120 },
5121 arm: {
5122 src: "myapex-arm.apex",
5123 },
5124 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005125 }
5126 `)
5127
Wei Li340ee8e2022-03-18 17:33:24 -07005128 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5129 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005130
Jiyong Parkc95714e2019-03-29 14:23:10 +09005131 expectedInput := "myapex-arm64.apex"
5132 if prebuilt.inputApex.String() != expectedInput {
5133 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5134 }
Wei Li340ee8e2022-03-18 17:33:24 -07005135 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5136 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5137 rule := testingModule.Rule("genProvenanceMetaData")
5138 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5139 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5140 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5141 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005142
5143 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5144 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005145}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005146
Paul Duffinc0609c62021-03-01 17:27:16 +00005147func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005148 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005149 prebuilt_apex {
5150 name: "myapex",
5151 }
5152 `)
5153}
5154
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005155func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005156 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005157 prebuilt_apex {
5158 name: "myapex",
5159 src: "myapex-arm.apex",
5160 filename: "notmyapex.apex",
5161 }
5162 `)
5163
Wei Li340ee8e2022-03-18 17:33:24 -07005164 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5165 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005166
5167 expected := "notmyapex.apex"
5168 if p.installFilename != expected {
5169 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5170 }
Wei Li340ee8e2022-03-18 17:33:24 -07005171 rule := testingModule.Rule("genProvenanceMetaData")
5172 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5173 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5174 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5175 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005176}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005177
Samiul Islam7c02e262021-09-08 17:48:28 +01005178func TestApexSetFilenameOverride(t *testing.T) {
5179 testApex(t, `
5180 apex_set {
5181 name: "com.company.android.myapex",
5182 apex_name: "com.android.myapex",
5183 set: "company-myapex.apks",
5184 filename: "com.company.android.myapex.apex"
5185 }
5186 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5187
5188 testApex(t, `
5189 apex_set {
5190 name: "com.company.android.myapex",
5191 apex_name: "com.android.myapex",
5192 set: "company-myapex.apks",
5193 filename: "com.company.android.myapex.capex"
5194 }
5195 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5196
5197 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5198 apex_set {
5199 name: "com.company.android.myapex",
5200 apex_name: "com.android.myapex",
5201 set: "company-myapex.apks",
5202 filename: "some-random-suffix"
5203 }
5204 `)
5205}
5206
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005207func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005208 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005209 prebuilt_apex {
5210 name: "myapex.prebuilt",
5211 src: "myapex-arm.apex",
5212 overrides: [
5213 "myapex",
5214 ],
5215 }
5216 `)
5217
Wei Li340ee8e2022-03-18 17:33:24 -07005218 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5219 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005220
5221 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005222 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005223 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005224 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005225 }
Wei Li340ee8e2022-03-18 17:33:24 -07005226 rule := testingModule.Rule("genProvenanceMetaData")
5227 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5228 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5229 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5230 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005231}
5232
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005233func TestPrebuiltApexName(t *testing.T) {
5234 testApex(t, `
5235 prebuilt_apex {
5236 name: "com.company.android.myapex",
5237 apex_name: "com.android.myapex",
5238 src: "company-myapex-arm.apex",
5239 }
5240 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5241
5242 testApex(t, `
5243 apex_set {
5244 name: "com.company.android.myapex",
5245 apex_name: "com.android.myapex",
5246 set: "company-myapex.apks",
5247 }
5248 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5249}
5250
5251func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5252 _ = android.GroupFixturePreparers(
5253 java.PrepareForTestWithJavaDefaultModules,
5254 PrepareForTestWithApexBuildComponents,
5255 android.FixtureWithRootAndroidBp(`
5256 platform_bootclasspath {
5257 name: "platform-bootclasspath",
5258 fragments: [
5259 {
5260 apex: "com.android.art",
5261 module: "art-bootclasspath-fragment",
5262 },
5263 ],
5264 }
5265
5266 prebuilt_apex {
5267 name: "com.company.android.art",
5268 apex_name: "com.android.art",
5269 src: "com.company.android.art-arm.apex",
5270 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5271 }
5272
5273 prebuilt_bootclasspath_fragment {
5274 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005275 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005276 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005277 hidden_api: {
5278 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5279 metadata: "my-bootclasspath-fragment/metadata.csv",
5280 index: "my-bootclasspath-fragment/index.csv",
5281 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5282 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5283 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005284 }
5285
5286 java_import {
5287 name: "core-oj",
5288 jars: ["prebuilt.jar"],
5289 }
5290 `),
5291 ).RunTest(t)
5292}
5293
Paul Duffin092153d2021-01-26 11:42:39 +00005294// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5295// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005296func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005297 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005298
Paul Duffin89886cb2021-02-05 16:44:03 +00005299 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005300 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005301 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005302 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005303 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005304 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005305 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5306 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5307 android.NormalizePathForTesting(dexJarBuildPath))
5308 }
5309
5310 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005311 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005312 // Make sure the import has been given the correct path to the dex jar.
5313 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5314 dexJarBuildPath := p.DexJarInstallPath()
5315 stem := android.RemoveOptionalPrebuiltPrefix(name)
5316 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5317 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5318 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005319 }
5320
Paul Duffin39853512021-02-26 11:09:39 +00005321 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005322 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005323 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005324 android.AssertArrayString(t, "Check if there is no source variant",
5325 []string{"android_common"},
5326 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005327 }
5328
5329 t.Run("prebuilt only", func(t *testing.T) {
5330 bp := `
5331 prebuilt_apex {
5332 name: "myapex",
5333 arch: {
5334 arm64: {
5335 src: "myapex-arm64.apex",
5336 },
5337 arm: {
5338 src: "myapex-arm.apex",
5339 },
5340 },
Paul Duffin39853512021-02-26 11:09:39 +00005341 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005342 }
5343
5344 java_import {
5345 name: "libfoo",
5346 jars: ["libfoo.jar"],
5347 }
Paul Duffin39853512021-02-26 11:09:39 +00005348
5349 java_sdk_library_import {
5350 name: "libbar",
5351 public: {
5352 jars: ["libbar.jar"],
5353 },
5354 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005355 `
5356
5357 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5358 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5359
Martin Stjernholm44825602021-09-17 01:44:12 +01005360 deapexerName := deapexerModuleName("myapex")
5361 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5362
Paul Duffinf6932af2021-02-26 18:21:56 +00005363 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005364 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005365 rule := deapexer.Rule("deapexer")
5366 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5367 t.Errorf("expected: %q, found: %q", expected, actual)
5368 }
5369
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005370 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005371 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005372 rule = prebuiltApex.Rule("android/soong/android.Cp")
5373 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5374 t.Errorf("expected: %q, found: %q", expected, actual)
5375 }
5376
Paul Duffin89886cb2021-02-05 16:44:03 +00005377 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005378 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005379
5380 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005381 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005382 })
5383
5384 t.Run("prebuilt with source preferred", func(t *testing.T) {
5385
5386 bp := `
5387 prebuilt_apex {
5388 name: "myapex",
5389 arch: {
5390 arm64: {
5391 src: "myapex-arm64.apex",
5392 },
5393 arm: {
5394 src: "myapex-arm.apex",
5395 },
5396 },
Paul Duffin39853512021-02-26 11:09:39 +00005397 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005398 }
5399
5400 java_import {
5401 name: "libfoo",
5402 jars: ["libfoo.jar"],
5403 }
5404
5405 java_library {
5406 name: "libfoo",
5407 }
Paul Duffin39853512021-02-26 11:09:39 +00005408
5409 java_sdk_library_import {
5410 name: "libbar",
5411 public: {
5412 jars: ["libbar.jar"],
5413 },
5414 }
5415
5416 java_sdk_library {
5417 name: "libbar",
5418 srcs: ["foo/bar/MyClass.java"],
5419 unsafe_ignore_missing_latest_api: true,
5420 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005421 `
5422
5423 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5424 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5425
Paul Duffin89886cb2021-02-05 16:44:03 +00005426 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005427 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005428 ensureNoSourceVariant(t, ctx, "libfoo")
5429
5430 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005431 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005432 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005433 })
5434
5435 t.Run("prebuilt preferred with source", func(t *testing.T) {
5436 bp := `
5437 prebuilt_apex {
5438 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005439 arch: {
5440 arm64: {
5441 src: "myapex-arm64.apex",
5442 },
5443 arm: {
5444 src: "myapex-arm.apex",
5445 },
5446 },
Paul Duffin39853512021-02-26 11:09:39 +00005447 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005448 }
5449
5450 java_import {
5451 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005452 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005453 jars: ["libfoo.jar"],
5454 }
5455
5456 java_library {
5457 name: "libfoo",
5458 }
Paul Duffin39853512021-02-26 11:09:39 +00005459
5460 java_sdk_library_import {
5461 name: "libbar",
5462 prefer: true,
5463 public: {
5464 jars: ["libbar.jar"],
5465 },
5466 }
5467
5468 java_sdk_library {
5469 name: "libbar",
5470 srcs: ["foo/bar/MyClass.java"],
5471 unsafe_ignore_missing_latest_api: true,
5472 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005473 `
5474
5475 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5476 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5477
Paul Duffin89886cb2021-02-05 16:44:03 +00005478 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005479 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005480 ensureNoSourceVariant(t, ctx, "libfoo")
5481
5482 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005483 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005484 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005485 })
5486}
5487
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005488func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005489 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005490 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005491 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5492 // is disabled.
5493 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5494 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005495
Paul Duffin37856732021-02-26 14:24:15 +00005496 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5497 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005498 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005499 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005500 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005501 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005502 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005503 foundLibfooJar = true
5504 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005505 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005506 }
5507 }
5508 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005509 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 +00005510 }
5511 }
5512
Paul Duffin40a3f652021-07-19 13:11:24 +01005513 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005514 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005515 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005516 var rule android.TestingBuildParams
5517
5518 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5519 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005520 }
5521
Paul Duffin40a3f652021-07-19 13:11:24 +01005522 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5523 t.Helper()
5524 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5525 var rule android.TestingBuildParams
5526
5527 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5528 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5529 }
5530
Paul Duffin89f570a2021-06-16 01:42:33 +01005531 fragment := java.ApexVariantReference{
5532 Apex: proptools.StringPtr("myapex"),
5533 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5534 }
5535
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005536 t.Run("prebuilt only", func(t *testing.T) {
5537 bp := `
5538 prebuilt_apex {
5539 name: "myapex",
5540 arch: {
5541 arm64: {
5542 src: "myapex-arm64.apex",
5543 },
5544 arm: {
5545 src: "myapex-arm.apex",
5546 },
5547 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005548 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5549 }
5550
5551 prebuilt_bootclasspath_fragment {
5552 name: "my-bootclasspath-fragment",
5553 contents: ["libfoo", "libbar"],
5554 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005555 hidden_api: {
5556 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5557 metadata: "my-bootclasspath-fragment/metadata.csv",
5558 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005559 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5560 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5561 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005562 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005563 }
5564
5565 java_import {
5566 name: "libfoo",
5567 jars: ["libfoo.jar"],
5568 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005569 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005570 }
Paul Duffin37856732021-02-26 14:24:15 +00005571
5572 java_sdk_library_import {
5573 name: "libbar",
5574 public: {
5575 jars: ["libbar.jar"],
5576 },
5577 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005578 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005579 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005580 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005581 `
5582
Paul Duffin89f570a2021-06-16 01:42:33 +01005583 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005584 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5585 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005586
Paul Duffin537ea3d2021-05-14 10:38:00 +01005587 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005588 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005589 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005590 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005591 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5592 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005593 })
5594
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005595 t.Run("apex_set only", func(t *testing.T) {
5596 bp := `
5597 apex_set {
5598 name: "myapex",
5599 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005600 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005601 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005602 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5603 }
5604
5605 java_import {
5606 name: "myjavalib",
5607 jars: ["myjavalib.jar"],
5608 apex_available: ["myapex"],
5609 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005610 }
5611
5612 prebuilt_bootclasspath_fragment {
5613 name: "my-bootclasspath-fragment",
5614 contents: ["libfoo", "libbar"],
5615 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005616 hidden_api: {
5617 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5618 metadata: "my-bootclasspath-fragment/metadata.csv",
5619 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005620 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5621 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5622 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005623 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005624 }
5625
Liz Kammer2dc72442023-04-20 10:10:48 -04005626 prebuilt_systemserverclasspath_fragment {
5627 name: "my-systemserverclasspath-fragment",
5628 contents: ["libbaz"],
5629 apex_available: ["myapex"],
5630 }
5631
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005632 java_import {
5633 name: "libfoo",
5634 jars: ["libfoo.jar"],
5635 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005636 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005637 }
5638
5639 java_sdk_library_import {
5640 name: "libbar",
5641 public: {
5642 jars: ["libbar.jar"],
5643 },
5644 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005645 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005646 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005647 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005648
5649 java_sdk_library_import {
5650 name: "libbaz",
5651 public: {
5652 jars: ["libbaz.jar"],
5653 },
5654 apex_available: ["myapex"],
5655 shared_library: false,
5656 permitted_packages: ["baz"],
5657 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005658 `
5659
Paul Duffin89f570a2021-06-16 01:42:33 +01005660 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005661 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5662 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5663
Paul Duffin537ea3d2021-05-14 10:38:00 +01005664 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005665 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005666 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005667 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005668 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5669 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005670
5671 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5672
5673 overrideNames := []string{
5674 "",
5675 "myjavalib.myapex",
5676 "libfoo.myapex",
5677 "libbar.myapex",
5678 "libbaz.myapex",
5679 }
5680 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5681 for i, e := range mkEntries {
5682 g := e.OverrideName
5683 if w := overrideNames[i]; w != g {
5684 t.Errorf("Expected override name %q, got %q", w, g)
5685 }
5686 }
5687
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005688 })
5689
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005690 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5691 bp := `
5692 prebuilt_apex {
5693 name: "myapex",
5694 arch: {
5695 arm64: {
5696 src: "myapex-arm64.apex",
5697 },
5698 arm: {
5699 src: "myapex-arm.apex",
5700 },
5701 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005702 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5703 }
5704
5705 prebuilt_bootclasspath_fragment {
5706 name: "my-bootclasspath-fragment",
5707 contents: ["libfoo", "libbar"],
5708 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005709 hidden_api: {
5710 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5711 metadata: "my-bootclasspath-fragment/metadata.csv",
5712 index: "my-bootclasspath-fragment/index.csv",
5713 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5714 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5715 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005716 }
5717
5718 java_import {
5719 name: "libfoo",
5720 jars: ["libfoo.jar"],
5721 apex_available: ["myapex"],
5722 }
5723
5724 java_library {
5725 name: "libfoo",
5726 srcs: ["foo/bar/MyClass.java"],
5727 apex_available: ["myapex"],
5728 }
Paul Duffin37856732021-02-26 14:24:15 +00005729
5730 java_sdk_library_import {
5731 name: "libbar",
5732 public: {
5733 jars: ["libbar.jar"],
5734 },
5735 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005736 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005737 }
5738
5739 java_sdk_library {
5740 name: "libbar",
5741 srcs: ["foo/bar/MyClass.java"],
5742 unsafe_ignore_missing_latest_api: true,
5743 apex_available: ["myapex"],
5744 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005745 `
5746
5747 // In this test the source (java_library) libfoo is active since the
5748 // prebuilt (java_import) defaults to prefer:false. However the
5749 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5750 // find the dex boot jar in it. We either need to disable the source libfoo
5751 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005752 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005753 // dexbootjar check is skipped if AllowMissingDependencies is true
5754 preparerAllowMissingDeps := android.GroupFixturePreparers(
5755 preparer,
5756 android.PrepareForTestWithAllowMissingDependencies,
5757 )
5758 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005759 })
5760
5761 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5762 bp := `
5763 prebuilt_apex {
5764 name: "myapex",
5765 arch: {
5766 arm64: {
5767 src: "myapex-arm64.apex",
5768 },
5769 arm: {
5770 src: "myapex-arm.apex",
5771 },
5772 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005773 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5774 }
5775
5776 prebuilt_bootclasspath_fragment {
5777 name: "my-bootclasspath-fragment",
5778 contents: ["libfoo", "libbar"],
5779 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005780 hidden_api: {
5781 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5782 metadata: "my-bootclasspath-fragment/metadata.csv",
5783 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005784 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5785 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5786 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005787 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005788 }
5789
5790 java_import {
5791 name: "libfoo",
5792 prefer: true,
5793 jars: ["libfoo.jar"],
5794 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005795 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005796 }
5797
5798 java_library {
5799 name: "libfoo",
5800 srcs: ["foo/bar/MyClass.java"],
5801 apex_available: ["myapex"],
5802 }
Paul Duffin37856732021-02-26 14:24:15 +00005803
5804 java_sdk_library_import {
5805 name: "libbar",
5806 prefer: true,
5807 public: {
5808 jars: ["libbar.jar"],
5809 },
5810 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005811 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005812 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005813 }
5814
5815 java_sdk_library {
5816 name: "libbar",
5817 srcs: ["foo/bar/MyClass.java"],
5818 unsafe_ignore_missing_latest_api: true,
5819 apex_available: ["myapex"],
5820 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005821 `
5822
Paul Duffin89f570a2021-06-16 01:42:33 +01005823 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005824 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5825 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005826
Paul Duffin537ea3d2021-05-14 10:38:00 +01005827 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005828 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005829 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005830 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005831 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5832 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005833 })
5834
5835 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5836 bp := `
5837 apex {
5838 name: "myapex",
5839 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005840 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005841 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005842 }
5843
5844 apex_key {
5845 name: "myapex.key",
5846 public_key: "testkey.avbpubkey",
5847 private_key: "testkey.pem",
5848 }
5849
5850 prebuilt_apex {
5851 name: "myapex",
5852 arch: {
5853 arm64: {
5854 src: "myapex-arm64.apex",
5855 },
5856 arm: {
5857 src: "myapex-arm.apex",
5858 },
5859 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005860 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5861 }
5862
5863 prebuilt_bootclasspath_fragment {
5864 name: "my-bootclasspath-fragment",
5865 contents: ["libfoo", "libbar"],
5866 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005867 hidden_api: {
5868 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5869 metadata: "my-bootclasspath-fragment/metadata.csv",
5870 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005871 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5872 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5873 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005874 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005875 }
5876
5877 java_import {
5878 name: "libfoo",
5879 jars: ["libfoo.jar"],
5880 apex_available: ["myapex"],
5881 }
5882
5883 java_library {
5884 name: "libfoo",
5885 srcs: ["foo/bar/MyClass.java"],
5886 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005887 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005888 }
Paul Duffin37856732021-02-26 14:24:15 +00005889
5890 java_sdk_library_import {
5891 name: "libbar",
5892 public: {
5893 jars: ["libbar.jar"],
5894 },
5895 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005896 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005897 }
5898
5899 java_sdk_library {
5900 name: "libbar",
5901 srcs: ["foo/bar/MyClass.java"],
5902 unsafe_ignore_missing_latest_api: true,
5903 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005904 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005905 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005906 `
5907
Paul Duffin89f570a2021-06-16 01:42:33 +01005908 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005909 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5910 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005911
Paul Duffin537ea3d2021-05-14 10:38:00 +01005912 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005913 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005914 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005915 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005916 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5917 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005918 })
5919
5920 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5921 bp := `
5922 apex {
5923 name: "myapex",
5924 enabled: false,
5925 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005926 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005927 }
5928
5929 apex_key {
5930 name: "myapex.key",
5931 public_key: "testkey.avbpubkey",
5932 private_key: "testkey.pem",
5933 }
5934
5935 prebuilt_apex {
5936 name: "myapex",
5937 arch: {
5938 arm64: {
5939 src: "myapex-arm64.apex",
5940 },
5941 arm: {
5942 src: "myapex-arm.apex",
5943 },
5944 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005945 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5946 }
5947
5948 prebuilt_bootclasspath_fragment {
5949 name: "my-bootclasspath-fragment",
5950 contents: ["libfoo", "libbar"],
5951 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005952 hidden_api: {
5953 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5954 metadata: "my-bootclasspath-fragment/metadata.csv",
5955 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005956 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5957 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5958 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005959 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005960 }
5961
5962 java_import {
5963 name: "libfoo",
5964 prefer: true,
5965 jars: ["libfoo.jar"],
5966 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005967 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005968 }
5969
5970 java_library {
5971 name: "libfoo",
5972 srcs: ["foo/bar/MyClass.java"],
5973 apex_available: ["myapex"],
5974 }
Paul Duffin37856732021-02-26 14:24:15 +00005975
5976 java_sdk_library_import {
5977 name: "libbar",
5978 prefer: true,
5979 public: {
5980 jars: ["libbar.jar"],
5981 },
5982 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005983 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005984 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005985 }
5986
5987 java_sdk_library {
5988 name: "libbar",
5989 srcs: ["foo/bar/MyClass.java"],
5990 unsafe_ignore_missing_latest_api: true,
5991 apex_available: ["myapex"],
5992 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005993 `
5994
Paul Duffin89f570a2021-06-16 01:42:33 +01005995 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005996 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5997 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005998
Paul Duffin537ea3d2021-05-14 10:38:00 +01005999 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006000 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006001 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006002 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006003 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
6004 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006005 })
6006}
6007
Roland Levillain630846d2019-06-26 12:48:34 +01006008func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006009 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006010 apex_test {
6011 name: "myapex",
6012 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006013 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006014 tests: [
6015 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006016 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006017 ],
6018 }
6019
6020 apex_key {
6021 name: "myapex.key",
6022 public_key: "testkey.avbpubkey",
6023 private_key: "testkey.pem",
6024 }
6025
Liz Kammer1c14a212020-05-12 15:26:55 -07006026 filegroup {
6027 name: "fg",
6028 srcs: [
6029 "baz",
6030 "bar/baz"
6031 ],
6032 }
6033
Roland Levillain630846d2019-06-26 12:48:34 +01006034 cc_test {
6035 name: "mytest",
6036 gtest: false,
6037 srcs: ["mytest.cpp"],
6038 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006039 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006040 system_shared_libs: [],
6041 static_executable: true,
6042 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006043 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006044 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006045
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006046 cc_library {
6047 name: "mylib",
6048 srcs: ["mylib.cpp"],
6049 system_shared_libs: [],
6050 stl: "none",
6051 }
6052
Liz Kammer5bd365f2020-05-27 15:15:11 -07006053 filegroup {
6054 name: "fg2",
6055 srcs: [
6056 "testdata/baz"
6057 ],
6058 }
6059
Roland Levillain9b5fde92019-06-28 15:41:19 +01006060 cc_test {
6061 name: "mytests",
6062 gtest: false,
6063 srcs: [
6064 "mytest1.cpp",
6065 "mytest2.cpp",
6066 "mytest3.cpp",
6067 ],
6068 test_per_src: true,
6069 relative_install_path: "test",
6070 system_shared_libs: [],
6071 static_executable: true,
6072 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006073 data: [
6074 ":fg",
6075 ":fg2",
6076 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006077 }
Roland Levillain630846d2019-06-26 12:48:34 +01006078 `)
6079
Sundong Ahnabb64432019-10-22 13:58:29 +09006080 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006081 copyCmds := apexRule.Args["copy_commands"]
6082
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006083 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006084 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006085 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006086
Liz Kammer1c14a212020-05-12 15:26:55 -07006087 //Ensure that test data are copied into apex.
6088 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6089 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6090
Roland Levillain9b5fde92019-06-28 15:41:19 +01006091 // Ensure that test deps built with `test_per_src` are copied into apex.
6092 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6093 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6094 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006095
6096 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07006097 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006098 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006099 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006100 prefix := "TARGET_"
6101 var builder strings.Builder
6102 data.Custom(&builder, name, prefix, "", data)
6103 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006104 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6105 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6106 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6107 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
6108 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
6109 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006110 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07006111
6112 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006113 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006114 data.Custom(&builder, name, prefix, "", data)
6115 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07006116 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
6117 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006118}
6119
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006120func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006121 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006122 apex {
6123 name: "myapex",
6124 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006125 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006126 }
6127 apex_key {
6128 name: "myapex.key",
6129 public_key: "testkey.avbpubkey",
6130 private_key: "testkey.pem",
6131 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00006132 `,
6133 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6134 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
6135 }),
6136 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006137 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00006138 ensureListContains(t, ab.makeModulesToInstall, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07006139 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006140 var builder strings.Builder
6141 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
6142 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006143 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex myapex.flattened\n")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006144}
6145
Jooyung Hand48f3c32019-08-23 11:18:57 +09006146func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6147 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6148 apex {
6149 name: "myapex",
6150 key: "myapex.key",
6151 native_shared_libs: ["libfoo"],
6152 }
6153
6154 apex_key {
6155 name: "myapex.key",
6156 public_key: "testkey.avbpubkey",
6157 private_key: "testkey.pem",
6158 }
6159
6160 cc_library {
6161 name: "libfoo",
6162 stl: "none",
6163 system_shared_libs: [],
6164 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006165 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006166 }
6167 `)
6168 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6169 apex {
6170 name: "myapex",
6171 key: "myapex.key",
6172 java_libs: ["myjar"],
6173 }
6174
6175 apex_key {
6176 name: "myapex.key",
6177 public_key: "testkey.avbpubkey",
6178 private_key: "testkey.pem",
6179 }
6180
6181 java_library {
6182 name: "myjar",
6183 srcs: ["foo/bar/MyClass.java"],
6184 sdk_version: "none",
6185 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006186 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006187 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006188 }
6189 `)
6190}
6191
Bill Peckhama41a6962021-01-11 10:58:54 -08006192func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006193 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006194 apex {
6195 name: "myapex",
6196 key: "myapex.key",
6197 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006198 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006199 }
6200
6201 apex_key {
6202 name: "myapex.key",
6203 public_key: "testkey.avbpubkey",
6204 private_key: "testkey.pem",
6205 }
6206
6207 java_import {
6208 name: "myjavaimport",
6209 apex_available: ["myapex"],
6210 jars: ["my.jar"],
6211 compile_dex: true,
6212 }
6213 `)
6214
6215 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6216 apexRule := module.Rule("apexRule")
6217 copyCmds := apexRule.Args["copy_commands"]
6218 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6219}
6220
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006221func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006222 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006223 apex {
6224 name: "myapex",
6225 key: "myapex.key",
6226 apps: [
6227 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006228 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006229 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006230 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006231 }
6232
6233 apex_key {
6234 name: "myapex.key",
6235 public_key: "testkey.avbpubkey",
6236 private_key: "testkey.pem",
6237 }
6238
6239 android_app {
6240 name: "AppFoo",
6241 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006242 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006243 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006244 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006245 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006246 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006247 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006248
6249 android_app {
6250 name: "AppFooPriv",
6251 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006252 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006253 system_modules: "none",
6254 privileged: true,
Andrei Onea580636b2022-08-17 16:53:46 +00006255 privapp_allowlist: "perms.xml",
6256 package_name: "com.android.AppFooPriv",
Colin Cross094cde42020-02-15 10:38:00 -08006257 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006258 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006259 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006260
6261 cc_library_shared {
6262 name: "libjni",
6263 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006264 shared_libs: ["libfoo"],
6265 stl: "none",
6266 system_shared_libs: [],
6267 apex_available: [ "myapex" ],
6268 sdk_version: "current",
6269 }
6270
6271 cc_library_shared {
6272 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006273 stl: "none",
6274 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006275 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006276 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006277 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006278 `)
6279
Sundong Ahnabb64432019-10-22 13:58:29 +09006280 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006281 apexRule := module.Rule("apexRule")
6282 copyCmds := apexRule.Args["copy_commands"]
6283
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006284 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6285 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006286 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006287
Colin Crossaede88c2020-08-11 12:17:01 -07006288 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006289 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006290 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006291 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006292 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006293 // JNI libraries including transitive deps are
6294 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006295 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006296 // ... embedded inside APK (jnilibs.zip)
6297 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6298 // ... and not directly inside the APEX
6299 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6300 }
Dario Frenicde2a032019-10-27 00:29:22 +01006301}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006302
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006303func TestApexWithAppImportBuildId(t *testing.T) {
6304 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6305 for _, id := range invalidBuildIds {
6306 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6307 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6308 variables.BuildId = proptools.StringPtr(id)
6309 })
6310 testApexError(t, message, `apex {
6311 name: "myapex",
6312 key: "myapex.key",
6313 apps: ["AppFooPrebuilt"],
6314 updatable: false,
6315 }
6316
6317 apex_key {
6318 name: "myapex.key",
6319 public_key: "testkey.avbpubkey",
6320 private_key: "testkey.pem",
6321 }
6322
6323 android_app_import {
6324 name: "AppFooPrebuilt",
6325 apk: "PrebuiltAppFoo.apk",
6326 presigned: true,
6327 apex_available: ["myapex"],
6328 }
6329 `, fixture)
6330 }
6331}
6332
Dario Frenicde2a032019-10-27 00:29:22 +01006333func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006334 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006335 apex {
6336 name: "myapex",
6337 key: "myapex.key",
6338 apps: [
6339 "AppFooPrebuilt",
6340 "AppFooPrivPrebuilt",
6341 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006342 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006343 }
6344
6345 apex_key {
6346 name: "myapex.key",
6347 public_key: "testkey.avbpubkey",
6348 private_key: "testkey.pem",
6349 }
6350
6351 android_app_import {
6352 name: "AppFooPrebuilt",
6353 apk: "PrebuiltAppFoo.apk",
6354 presigned: true,
6355 dex_preopt: {
6356 enabled: false,
6357 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006358 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006359 }
6360
6361 android_app_import {
6362 name: "AppFooPrivPrebuilt",
6363 apk: "PrebuiltAppFooPriv.apk",
6364 privileged: true,
6365 presigned: true,
6366 dex_preopt: {
6367 enabled: false,
6368 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006369 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006370 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006371 }
6372 `)
6373
Sundong Ahnabb64432019-10-22 13:58:29 +09006374 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01006375 apexRule := module.Rule("apexRule")
6376 copyCmds := apexRule.Args["copy_commands"]
6377
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006378 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6379 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006380}
6381
6382func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006383 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006384 apex {
6385 name: "myapex",
6386 key: "myapex.key",
6387 apps: [
6388 "AppFoo",
6389 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006390 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006391 }
6392
6393 apex_key {
6394 name: "myapex.key",
6395 public_key: "testkey.avbpubkey",
6396 private_key: "testkey.pem",
6397 }
6398
6399 android_app {
6400 name: "AppFoo",
6401 srcs: ["foo/bar/MyClass.java"],
6402 sdk_version: "none",
6403 system_modules: "none",
6404 apex_available: [ "myapex" ],
6405 }
6406
6407 android_app_import {
6408 name: "AppFoo",
6409 apk: "AppFooPrebuilt.apk",
6410 filename: "AppFooPrebuilt.apk",
6411 presigned: true,
6412 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006413 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006414 }
6415 `, withFiles(map[string][]byte{
6416 "AppFooPrebuilt.apk": nil,
6417 }))
6418
6419 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006420 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006421 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006422}
6423
Dario Freni6f3937c2019-12-20 22:58:03 +00006424func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006425 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006426 apex {
6427 name: "myapex",
6428 key: "myapex.key",
6429 apps: [
6430 "TesterHelpAppFoo",
6431 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006432 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006433 }
6434
6435 apex_key {
6436 name: "myapex.key",
6437 public_key: "testkey.avbpubkey",
6438 private_key: "testkey.pem",
6439 }
6440
6441 android_test_helper_app {
6442 name: "TesterHelpAppFoo",
6443 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006444 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006445 }
6446
6447 `)
6448
6449 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6450 apexRule := module.Rule("apexRule")
6451 copyCmds := apexRule.Args["copy_commands"]
6452
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006453 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006454}
6455
Jooyung Han18020ea2019-11-13 10:50:48 +09006456func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6457 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006458 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006459 apex {
6460 name: "myapex",
6461 key: "myapex.key",
6462 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006463 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006464 }
6465
6466 apex_key {
6467 name: "myapex.key",
6468 public_key: "testkey.avbpubkey",
6469 private_key: "testkey.pem",
6470 }
6471
6472 apex {
6473 name: "otherapex",
6474 key: "myapex.key",
6475 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006476 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006477 }
6478
6479 cc_defaults {
6480 name: "libfoo-defaults",
6481 apex_available: ["otherapex"],
6482 }
6483
6484 cc_library {
6485 name: "libfoo",
6486 defaults: ["libfoo-defaults"],
6487 stl: "none",
6488 system_shared_libs: [],
6489 }`)
6490}
6491
Paul Duffine52e66f2020-03-30 17:54:29 +01006492func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006493 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006494 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006495 apex {
6496 name: "myapex",
6497 key: "myapex.key",
6498 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006499 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006500 }
6501
6502 apex_key {
6503 name: "myapex.key",
6504 public_key: "testkey.avbpubkey",
6505 private_key: "testkey.pem",
6506 }
6507
6508 apex {
6509 name: "otherapex",
6510 key: "otherapex.key",
6511 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006512 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006513 }
6514
6515 apex_key {
6516 name: "otherapex.key",
6517 public_key: "testkey.avbpubkey",
6518 private_key: "testkey.pem",
6519 }
6520
6521 cc_library {
6522 name: "libfoo",
6523 stl: "none",
6524 system_shared_libs: [],
6525 apex_available: ["otherapex"],
6526 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006527}
Jiyong Park127b40b2019-09-30 16:04:35 +09006528
Paul Duffine52e66f2020-03-30 17:54:29 +01006529func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006530 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006531 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006532.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006533.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006534.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006535.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006536.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006537.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006538 apex {
6539 name: "myapex",
6540 key: "myapex.key",
6541 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006542 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006543 }
6544
6545 apex_key {
6546 name: "myapex.key",
6547 public_key: "testkey.avbpubkey",
6548 private_key: "testkey.pem",
6549 }
6550
Jiyong Park127b40b2019-09-30 16:04:35 +09006551 cc_library {
6552 name: "libfoo",
6553 stl: "none",
6554 shared_libs: ["libbar"],
6555 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006556 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006557 }
6558
6559 cc_library {
6560 name: "libbar",
6561 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006562 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006563 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006564 apex_available: ["myapex"],
6565 }
6566
6567 cc_library {
6568 name: "libbaz",
6569 stl: "none",
6570 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006571 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006572}
Jiyong Park127b40b2019-09-30 16:04:35 +09006573
Liz Kammer5f108fa2023-05-11 14:33:17 -04006574func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6575 testApex(t, `
6576 apex {
6577 name: "myapex",
6578 key: "myapex.key",
6579 native_shared_libs: ["libfoo"],
6580 updatable: false,
6581 }
6582
6583 apex_key {
6584 name: "myapex.key",
6585 public_key: "testkey.avbpubkey",
6586 private_key: "testkey.pem",
6587 }
6588
6589 cc_library {
6590 name: "libfoo",
6591 stl: "none",
6592 static_libs: ["libbar"],
6593 system_shared_libs: [],
6594 apex_available: ["myapex"],
6595 }
6596
6597 cc_library {
6598 name: "libbar",
6599 stl: "none",
6600 shared_libs: ["libbaz"],
6601 system_shared_libs: [],
6602 apex_available: ["myapex"],
6603 }
6604
6605 cc_library {
6606 name: "libbaz",
6607 stl: "none",
6608 system_shared_libs: [],
6609 }`)
6610
6611 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6612 apex {
6613 name: "myapex",
6614 key: "myapex.key",
6615 native_shared_libs: ["libfoo"],
6616 updatable: false,
6617 }
6618
6619 apex_key {
6620 name: "myapex.key",
6621 public_key: "testkey.avbpubkey",
6622 private_key: "testkey.pem",
6623 }
6624
6625 cc_library {
6626 name: "libfoo",
6627 stl: "none",
6628 static_libs: ["libbar"],
6629 system_shared_libs: [],
6630 apex_available: ["myapex"],
6631 }
6632
6633 cc_library {
6634 name: "libbar",
6635 stl: "none",
6636 system_shared_libs: [],
6637 }`)
6638}
6639
Paul Duffine52e66f2020-03-30 17:54:29 +01006640func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006641 testApexError(t, "\"otherapex\" is not a valid module name", `
6642 apex {
6643 name: "myapex",
6644 key: "myapex.key",
6645 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006646 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006647 }
6648
6649 apex_key {
6650 name: "myapex.key",
6651 public_key: "testkey.avbpubkey",
6652 private_key: "testkey.pem",
6653 }
6654
6655 cc_library {
6656 name: "libfoo",
6657 stl: "none",
6658 system_shared_libs: [],
6659 apex_available: ["otherapex"],
6660 }`)
6661
Paul Duffine52e66f2020-03-30 17:54:29 +01006662 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006663 apex {
6664 name: "myapex",
6665 key: "myapex.key",
6666 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006667 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006668 }
6669
6670 apex_key {
6671 name: "myapex.key",
6672 public_key: "testkey.avbpubkey",
6673 private_key: "testkey.pem",
6674 }
6675
6676 cc_library {
6677 name: "libfoo",
6678 stl: "none",
6679 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006680 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006681 apex_available: ["myapex"],
6682 }
6683
6684 cc_library {
6685 name: "libbar",
6686 stl: "none",
6687 system_shared_libs: [],
6688 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006689 }
6690
6691 cc_library {
6692 name: "libbaz",
6693 stl: "none",
6694 system_shared_libs: [],
6695 stubs: {
6696 versions: ["10", "20", "30"],
6697 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006698 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006699}
Jiyong Park127b40b2019-09-30 16:04:35 +09006700
Jiyong Park89e850a2020-04-07 16:37:39 +09006701func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006702 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006703 apex {
6704 name: "myapex",
6705 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006706 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006707 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006708 }
6709
6710 apex_key {
6711 name: "myapex.key",
6712 public_key: "testkey.avbpubkey",
6713 private_key: "testkey.pem",
6714 }
6715
6716 cc_library {
6717 name: "libfoo",
6718 stl: "none",
6719 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006720 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006721 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006722 }
6723
6724 cc_library {
6725 name: "libfoo2",
6726 stl: "none",
6727 system_shared_libs: [],
6728 shared_libs: ["libbaz"],
6729 apex_available: ["//apex_available:platform"],
6730 }
6731
6732 cc_library {
6733 name: "libbar",
6734 stl: "none",
6735 system_shared_libs: [],
6736 apex_available: ["myapex"],
6737 }
6738
6739 cc_library {
6740 name: "libbaz",
6741 stl: "none",
6742 system_shared_libs: [],
6743 apex_available: ["myapex"],
6744 stubs: {
6745 versions: ["1"],
6746 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006747 }`)
6748
Jiyong Park89e850a2020-04-07 16:37:39 +09006749 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6750 // because it depends on libbar which isn't available to platform
6751 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6752 if libfoo.NotAvailableForPlatform() != true {
6753 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6754 }
6755
6756 // libfoo2 however can be available to platform because it depends on libbaz which provides
6757 // stubs
6758 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6759 if libfoo2.NotAvailableForPlatform() == true {
6760 t.Errorf("%q should be available to platform", libfoo2.String())
6761 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006762}
Jiyong Parka90ca002019-10-07 15:47:24 +09006763
Paul Duffine52e66f2020-03-30 17:54:29 +01006764func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006765 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006766 apex {
6767 name: "myapex",
6768 key: "myapex.key",
6769 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006770 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006771 }
6772
6773 apex_key {
6774 name: "myapex.key",
6775 public_key: "testkey.avbpubkey",
6776 private_key: "testkey.pem",
6777 }
6778
6779 cc_library {
6780 name: "libfoo",
6781 stl: "none",
6782 system_shared_libs: [],
6783 apex_available: ["myapex"],
6784 static: {
6785 apex_available: ["//apex_available:platform"],
6786 },
6787 }`)
6788
Jiyong Park89e850a2020-04-07 16:37:39 +09006789 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6790 if libfooShared.NotAvailableForPlatform() != true {
6791 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6792 }
6793 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6794 if libfooStatic.NotAvailableForPlatform() != false {
6795 t.Errorf("%q should be available to platform", libfooStatic.String())
6796 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006797}
6798
Jiyong Park5d790c32019-11-15 18:40:32 +09006799func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006800 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006801 apex {
6802 name: "myapex",
6803 key: "myapex.key",
6804 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006805 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006806 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006807 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006808 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006809 }
6810
6811 override_apex {
6812 name: "override_myapex",
6813 base: "myapex",
6814 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006815 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006816 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006817 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006818 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006819 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006820 key: "mynewapex.key",
6821 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006822 }
6823
6824 apex_key {
6825 name: "myapex.key",
6826 public_key: "testkey.avbpubkey",
6827 private_key: "testkey.pem",
6828 }
6829
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006830 apex_key {
6831 name: "mynewapex.key",
6832 public_key: "testkey2.avbpubkey",
6833 private_key: "testkey2.pem",
6834 }
6835
6836 android_app_certificate {
6837 name: "myapex.certificate",
6838 certificate: "testkey",
6839 }
6840
Jiyong Park5d790c32019-11-15 18:40:32 +09006841 android_app {
6842 name: "app",
6843 srcs: ["foo/bar/MyClass.java"],
6844 package_name: "foo",
6845 sdk_version: "none",
6846 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006847 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006848 }
6849
6850 override_android_app {
6851 name: "override_app",
6852 base: "app",
6853 package_name: "bar",
6854 }
markchien7c803b82021-08-26 22:10:06 +08006855
6856 bpf {
6857 name: "bpf",
6858 srcs: ["bpf.c"],
6859 }
6860
6861 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006862 name: "overrideBpf",
6863 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006864 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006865
6866 prebuilt_etc {
6867 name: "myetc",
6868 src: "myprebuilt",
6869 }
6870
6871 prebuilt_etc {
6872 name: "override_myetc",
6873 src: "override_myprebuilt",
6874 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006875 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006876
Jiyong Park317645e2019-12-05 13:20:58 +09006877 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6878 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6879 if originalVariant.GetOverriddenBy() != "" {
6880 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6881 }
6882 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6883 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6884 }
6885
Jiyong Park5d790c32019-11-15 18:40:32 +09006886 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6887 apexRule := module.Rule("apexRule")
6888 copyCmds := apexRule.Args["copy_commands"]
6889
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006890 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6891 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006892
markchien7c803b82021-08-26 22:10:06 +08006893 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006894 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006895
Daniel Norman5a3ce132021-08-26 15:44:43 -07006896 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6897 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6898
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006899 apexBundle := module.Module().(*apexBundle)
6900 name := apexBundle.Name()
6901 if name != "override_myapex" {
6902 t.Errorf("name should be \"override_myapex\", but was %q", name)
6903 }
6904
Baligh Uddin004d7172020-02-19 21:29:28 -08006905 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6906 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6907 }
6908
Jiyong Park20bacab2020-03-03 11:45:41 +09006909 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006910 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006911 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6912
6913 signApkRule := module.Rule("signapk")
6914 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006915
Colin Crossaa255532020-07-03 13:18:24 -07006916 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006917 var builder strings.Builder
6918 data.Custom(&builder, name, "TARGET_", "", data)
6919 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006920 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6921 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
6922 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006923 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006924 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006925 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006926 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006927 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006928 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
6929 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006930}
6931
Albert Martineefabcf2022-03-21 20:11:16 +00006932func TestMinSdkVersionOverride(t *testing.T) {
6933 // Override from 29 to 31
6934 minSdkOverride31 := "31"
6935 ctx := testApex(t, `
6936 apex {
6937 name: "myapex",
6938 key: "myapex.key",
6939 native_shared_libs: ["mylib"],
6940 updatable: true,
6941 min_sdk_version: "29"
6942 }
6943
6944 override_apex {
6945 name: "override_myapex",
6946 base: "myapex",
6947 logging_parent: "com.foo.bar",
6948 package_name: "test.overridden.package"
6949 }
6950
6951 apex_key {
6952 name: "myapex.key",
6953 public_key: "testkey.avbpubkey",
6954 private_key: "testkey.pem",
6955 }
6956
6957 cc_library {
6958 name: "mylib",
6959 srcs: ["mylib.cpp"],
6960 runtime_libs: ["libbar"],
6961 system_shared_libs: [],
6962 stl: "none",
6963 apex_available: [ "myapex" ],
6964 min_sdk_version: "apex_inherit"
6965 }
6966
6967 cc_library {
6968 name: "libbar",
6969 srcs: ["mylib.cpp"],
6970 system_shared_libs: [],
6971 stl: "none",
6972 apex_available: [ "myapex" ],
6973 min_sdk_version: "apex_inherit"
6974 }
6975
6976 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6977
6978 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6979 copyCmds := apexRule.Args["copy_commands"]
6980
6981 // Ensure that direct non-stubs dep is always included
6982 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6983
6984 // Ensure that runtime_libs dep in included
6985 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6986
6987 // Ensure libraries target overridden min_sdk_version value
6988 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6989}
6990
6991func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6992 // Attempt to override from 31 to 29, should be a NOOP
6993 minSdkOverride29 := "29"
6994 ctx := testApex(t, `
6995 apex {
6996 name: "myapex",
6997 key: "myapex.key",
6998 native_shared_libs: ["mylib"],
6999 updatable: true,
7000 min_sdk_version: "31"
7001 }
7002
7003 override_apex {
7004 name: "override_myapex",
7005 base: "myapex",
7006 logging_parent: "com.foo.bar",
7007 package_name: "test.overridden.package"
7008 }
7009
7010 apex_key {
7011 name: "myapex.key",
7012 public_key: "testkey.avbpubkey",
7013 private_key: "testkey.pem",
7014 }
7015
7016 cc_library {
7017 name: "mylib",
7018 srcs: ["mylib.cpp"],
7019 runtime_libs: ["libbar"],
7020 system_shared_libs: [],
7021 stl: "none",
7022 apex_available: [ "myapex" ],
7023 min_sdk_version: "apex_inherit"
7024 }
7025
7026 cc_library {
7027 name: "libbar",
7028 srcs: ["mylib.cpp"],
7029 system_shared_libs: [],
7030 stl: "none",
7031 apex_available: [ "myapex" ],
7032 min_sdk_version: "apex_inherit"
7033 }
7034
7035 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7036
7037 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
7038 copyCmds := apexRule.Args["copy_commands"]
7039
7040 // Ensure that direct non-stubs dep is always included
7041 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7042
7043 // Ensure that runtime_libs dep in included
7044 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7045
7046 // Ensure libraries target the original min_sdk_version value rather than the overridden
7047 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7048}
7049
Jooyung Han214bf372019-11-12 13:03:50 +09007050func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007051 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007052 apex {
7053 name: "myapex",
7054 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007055 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007056 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007057 }
7058
7059 apex_key {
7060 name: "myapex.key",
7061 public_key: "testkey.avbpubkey",
7062 private_key: "testkey.pem",
7063 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007064
7065 cc_library {
7066 name: "mylib",
7067 srcs: ["mylib.cpp"],
7068 stl: "libc++",
7069 system_shared_libs: [],
7070 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007071 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007072 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007073 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007074
7075 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
7076 args := module.Rule("apexRule").Args
7077 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007078 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007079
7080 // The copies of the libraries in the apex should have one more dependency than
7081 // the ones outside the apex, namely the unwinder. Ideally we should check
7082 // the dependency names directly here but for some reason the names are blank in
7083 // this test.
7084 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007085 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007086 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7087 if len(apexImplicits) != len(nonApexImplicits)+1 {
7088 t.Errorf("%q missing unwinder dep", lib)
7089 }
7090 }
Jooyung Han214bf372019-11-12 13:03:50 +09007091}
7092
Paul Duffine05480a2021-03-08 15:07:14 +00007093var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007094 "api/current.txt": nil,
7095 "api/removed.txt": nil,
7096 "api/system-current.txt": nil,
7097 "api/system-removed.txt": nil,
7098 "api/test-current.txt": nil,
7099 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007100
Anton Hanssondff2c782020-12-21 17:10:01 +00007101 "100/public/api/foo.txt": nil,
7102 "100/public/api/foo-removed.txt": nil,
7103 "100/system/api/foo.txt": nil,
7104 "100/system/api/foo-removed.txt": nil,
7105
Paul Duffineedc5d52020-06-12 17:46:39 +01007106 // For java_sdk_library_import
7107 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007108}
7109
Jooyung Han58f26ab2019-12-18 15:34:32 +09007110func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007111 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007112 apex {
7113 name: "myapex",
7114 key: "myapex.key",
7115 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007116 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007117 }
7118
7119 apex_key {
7120 name: "myapex.key",
7121 public_key: "testkey.avbpubkey",
7122 private_key: "testkey.pem",
7123 }
7124
7125 java_sdk_library {
7126 name: "foo",
7127 srcs: ["a.java"],
7128 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007129 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007130 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007131
7132 prebuilt_apis {
7133 name: "sdk",
7134 api_dirs: ["100"],
7135 }
Paul Duffin9b879592020-05-26 13:21:35 +01007136 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007137
7138 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00007139 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007140 "javalib/foo.jar",
7141 "etc/permissions/foo.xml",
7142 })
7143 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007144 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007145 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 +09007146}
7147
Paul Duffin9b879592020-05-26 13:21:35 +01007148func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007149 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007150 apex {
7151 name: "myapex",
7152 key: "myapex.key",
7153 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007154 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007155 }
7156
7157 apex_key {
7158 name: "myapex.key",
7159 public_key: "testkey.avbpubkey",
7160 private_key: "testkey.pem",
7161 }
7162
7163 java_sdk_library {
7164 name: "foo",
7165 srcs: ["a.java"],
7166 api_packages: ["foo"],
7167 apex_available: ["myapex"],
7168 sdk_version: "none",
7169 system_modules: "none",
7170 }
7171
7172 java_library {
7173 name: "bar",
7174 srcs: ["a.java"],
7175 libs: ["foo"],
7176 apex_available: ["myapex"],
7177 sdk_version: "none",
7178 system_modules: "none",
7179 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007180
7181 prebuilt_apis {
7182 name: "sdk",
7183 api_dirs: ["100"],
7184 }
Paul Duffin9b879592020-05-26 13:21:35 +01007185 `, withFiles(filesForSdkLibrary))
7186
7187 // java_sdk_library installs both impl jar and permission XML
7188 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7189 "javalib/bar.jar",
7190 "javalib/foo.jar",
7191 "etc/permissions/foo.xml",
7192 })
7193
7194 // The bar library should depend on the implementation jar.
7195 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007196 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007197 t.Errorf("expected %q, found %#q", expected, actual)
7198 }
7199}
7200
7201func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007202 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007203 apex {
7204 name: "myapex",
7205 key: "myapex.key",
7206 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007207 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007208 }
7209
7210 apex_key {
7211 name: "myapex.key",
7212 public_key: "testkey.avbpubkey",
7213 private_key: "testkey.pem",
7214 }
7215
7216 java_sdk_library {
7217 name: "foo",
7218 srcs: ["a.java"],
7219 api_packages: ["foo"],
7220 apex_available: ["myapex"],
7221 sdk_version: "none",
7222 system_modules: "none",
7223 }
7224
7225 java_library {
7226 name: "bar",
7227 srcs: ["a.java"],
7228 libs: ["foo"],
7229 sdk_version: "none",
7230 system_modules: "none",
7231 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007232
7233 prebuilt_apis {
7234 name: "sdk",
7235 api_dirs: ["100"],
7236 }
Paul Duffin9b879592020-05-26 13:21:35 +01007237 `, withFiles(filesForSdkLibrary))
7238
7239 // java_sdk_library installs both impl jar and permission XML
7240 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7241 "javalib/foo.jar",
7242 "etc/permissions/foo.xml",
7243 })
7244
7245 // The bar library should depend on the stubs jar.
7246 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007247 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007248 t.Errorf("expected %q, found %#q", expected, actual)
7249 }
7250}
7251
Paul Duffineedc5d52020-06-12 17:46:39 +01007252func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007253 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007254 prebuilt_apis {
7255 name: "sdk",
7256 api_dirs: ["100"],
7257 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007258 withFiles(map[string][]byte{
7259 "apex/a.java": nil,
7260 "apex/apex_manifest.json": nil,
7261 "apex/Android.bp": []byte(`
7262 package {
7263 default_visibility: ["//visibility:private"],
7264 }
7265
7266 apex {
7267 name: "myapex",
7268 key: "myapex.key",
7269 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007270 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007271 }
7272
7273 apex_key {
7274 name: "myapex.key",
7275 public_key: "testkey.avbpubkey",
7276 private_key: "testkey.pem",
7277 }
7278
7279 java_library {
7280 name: "bar",
7281 srcs: ["a.java"],
7282 libs: ["foo"],
7283 apex_available: ["myapex"],
7284 sdk_version: "none",
7285 system_modules: "none",
7286 }
7287`),
7288 "source/a.java": nil,
7289 "source/api/current.txt": nil,
7290 "source/api/removed.txt": nil,
7291 "source/Android.bp": []byte(`
7292 package {
7293 default_visibility: ["//visibility:private"],
7294 }
7295
7296 java_sdk_library {
7297 name: "foo",
7298 visibility: ["//apex"],
7299 srcs: ["a.java"],
7300 api_packages: ["foo"],
7301 apex_available: ["myapex"],
7302 sdk_version: "none",
7303 system_modules: "none",
7304 public: {
7305 enabled: true,
7306 },
7307 }
7308`),
7309 "prebuilt/a.jar": nil,
7310 "prebuilt/Android.bp": []byte(`
7311 package {
7312 default_visibility: ["//visibility:private"],
7313 }
7314
7315 java_sdk_library_import {
7316 name: "foo",
7317 visibility: ["//apex", "//source"],
7318 apex_available: ["myapex"],
7319 prefer: true,
7320 public: {
7321 jars: ["a.jar"],
7322 },
7323 }
7324`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007325 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007326 )
7327
7328 // java_sdk_library installs both impl jar and permission XML
7329 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7330 "javalib/bar.jar",
7331 "javalib/foo.jar",
7332 "etc/permissions/foo.xml",
7333 })
7334
7335 // The bar library should depend on the implementation jar.
7336 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007337 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007338 t.Errorf("expected %q, found %#q", expected, actual)
7339 }
7340}
7341
7342func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7343 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7344 apex {
7345 name: "myapex",
7346 key: "myapex.key",
7347 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007348 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007349 }
7350
7351 apex_key {
7352 name: "myapex.key",
7353 public_key: "testkey.avbpubkey",
7354 private_key: "testkey.pem",
7355 }
7356
7357 java_sdk_library_import {
7358 name: "foo",
7359 apex_available: ["myapex"],
7360 prefer: true,
7361 public: {
7362 jars: ["a.jar"],
7363 },
7364 }
7365
7366 `, withFiles(filesForSdkLibrary))
7367}
7368
atrost6e126252020-01-27 17:01:16 +00007369func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007370 result := android.GroupFixturePreparers(
7371 prepareForApexTest,
7372 java.PrepareForTestWithPlatformCompatConfig,
7373 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007374 apex {
7375 name: "myapex",
7376 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007377 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007378 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007379 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007380 }
7381
7382 apex_key {
7383 name: "myapex.key",
7384 public_key: "testkey.avbpubkey",
7385 private_key: "testkey.pem",
7386 }
7387
7388 platform_compat_config {
7389 name: "myjar-platform-compat-config",
7390 src: ":myjar",
7391 }
7392
7393 java_library {
7394 name: "myjar",
7395 srcs: ["foo/bar/MyClass.java"],
7396 sdk_version: "none",
7397 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007398 apex_available: [ "myapex" ],
7399 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007400
7401 // Make sure that a preferred prebuilt does not affect the apex contents.
7402 prebuilt_platform_compat_config {
7403 name: "myjar-platform-compat-config",
7404 metadata: "compat-config/metadata.xml",
7405 prefer: true,
7406 }
atrost6e126252020-01-27 17:01:16 +00007407 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007408 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007409 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7410 "etc/compatconfig/myjar-platform-compat-config.xml",
7411 "javalib/myjar.jar",
7412 })
7413}
7414
Jooyung Han862c0d62022-12-21 10:15:37 +09007415func TestNoDupeApexFiles(t *testing.T) {
7416 android.GroupFixturePreparers(
7417 android.PrepareForTestWithAndroidBuildComponents,
7418 PrepareForTestWithApexBuildComponents,
7419 prepareForTestWithMyapex,
7420 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7421 ).
7422 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7423 RunTestWithBp(t, `
7424 apex {
7425 name: "myapex",
7426 key: "myapex.key",
7427 prebuilts: ["foo", "bar"],
7428 updatable: false,
7429 }
7430
7431 apex_key {
7432 name: "myapex.key",
7433 public_key: "testkey.avbpubkey",
7434 private_key: "testkey.pem",
7435 }
7436
7437 prebuilt_etc {
7438 name: "foo",
7439 src: "myprebuilt",
7440 filename_from_src: true,
7441 }
7442
7443 prebuilt_etc {
7444 name: "bar",
7445 src: "myprebuilt",
7446 filename_from_src: true,
7447 }
7448 `)
7449}
7450
Jiyong Park479321d2019-12-16 11:47:12 +09007451func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7452 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7453 apex {
7454 name: "myapex",
7455 key: "myapex.key",
7456 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007457 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007458 }
7459
7460 apex_key {
7461 name: "myapex.key",
7462 public_key: "testkey.avbpubkey",
7463 private_key: "testkey.pem",
7464 }
7465
7466 java_library {
7467 name: "myjar",
7468 srcs: ["foo/bar/MyClass.java"],
7469 sdk_version: "none",
7470 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007471 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007472 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007473 }
7474 `)
7475}
7476
Jiyong Park7afd1072019-12-30 16:56:33 +09007477func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007478 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007479 apex {
7480 name: "myapex",
7481 key: "myapex.key",
7482 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007483 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007484 }
7485
7486 apex_key {
7487 name: "myapex.key",
7488 public_key: "testkey.avbpubkey",
7489 private_key: "testkey.pem",
7490 }
7491
7492 cc_library {
7493 name: "mylib",
7494 srcs: ["mylib.cpp"],
7495 system_shared_libs: [],
7496 stl: "none",
7497 required: ["a", "b"],
7498 host_required: ["c", "d"],
7499 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007500 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007501 }
7502 `)
7503
7504 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007505 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007506 name := apexBundle.BaseModuleName()
7507 prefix := "TARGET_"
7508 var builder strings.Builder
7509 data.Custom(&builder, name, prefix, "", data)
7510 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007511 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 -08007512 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7513 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007514}
7515
Jiyong Park7cd10e32020-01-14 09:22:18 +09007516func TestSymlinksFromApexToSystem(t *testing.T) {
7517 bp := `
7518 apex {
7519 name: "myapex",
7520 key: "myapex.key",
7521 native_shared_libs: ["mylib"],
7522 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007523 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007524 }
7525
Jiyong Park9d677202020-02-19 16:29:35 +09007526 apex {
7527 name: "myapex.updatable",
7528 key: "myapex.key",
7529 native_shared_libs: ["mylib"],
7530 java_libs: ["myjar"],
7531 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007532 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007533 }
7534
Jiyong Park7cd10e32020-01-14 09:22:18 +09007535 apex_key {
7536 name: "myapex.key",
7537 public_key: "testkey.avbpubkey",
7538 private_key: "testkey.pem",
7539 }
7540
7541 cc_library {
7542 name: "mylib",
7543 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007544 shared_libs: [
7545 "myotherlib",
7546 "myotherlib_ext",
7547 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007548 system_shared_libs: [],
7549 stl: "none",
7550 apex_available: [
7551 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007552 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007553 "//apex_available:platform",
7554 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007555 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007556 }
7557
7558 cc_library {
7559 name: "myotherlib",
7560 srcs: ["mylib.cpp"],
7561 system_shared_libs: [],
7562 stl: "none",
7563 apex_available: [
7564 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007565 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007566 "//apex_available:platform",
7567 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007568 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007569 }
7570
Jiyong Parkce243632023-02-17 18:22:25 +09007571 cc_library {
7572 name: "myotherlib_ext",
7573 srcs: ["mylib.cpp"],
7574 system_shared_libs: [],
7575 system_ext_specific: true,
7576 stl: "none",
7577 apex_available: [
7578 "myapex",
7579 "myapex.updatable",
7580 "//apex_available:platform",
7581 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007582 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007583 }
7584
Jiyong Park7cd10e32020-01-14 09:22:18 +09007585 java_library {
7586 name: "myjar",
7587 srcs: ["foo/bar/MyClass.java"],
7588 sdk_version: "none",
7589 system_modules: "none",
7590 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007591 apex_available: [
7592 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007593 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007594 "//apex_available:platform",
7595 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007596 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007597 }
7598
7599 java_library {
7600 name: "myotherjar",
7601 srcs: ["foo/bar/MyClass.java"],
7602 sdk_version: "none",
7603 system_modules: "none",
7604 apex_available: [
7605 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007606 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007607 "//apex_available:platform",
7608 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007609 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007610 }
7611 `
7612
7613 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7614 for _, f := range files {
7615 if f.path == file {
7616 if f.isLink {
7617 t.Errorf("%q is not a real file", file)
7618 }
7619 return
7620 }
7621 }
7622 t.Errorf("%q is not found", file)
7623 }
7624
Jiyong Parkce243632023-02-17 18:22:25 +09007625 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007626 for _, f := range files {
7627 if f.path == file {
7628 if !f.isLink {
7629 t.Errorf("%q is not a symlink", file)
7630 }
Jiyong Parkce243632023-02-17 18:22:25 +09007631 if f.src != target {
7632 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7633 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007634 return
7635 }
7636 }
7637 t.Errorf("%q is not found", file)
7638 }
7639
Jiyong Park9d677202020-02-19 16:29:35 +09007640 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7641 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007642 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007643 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007644 ensureRealfileExists(t, files, "javalib/myjar.jar")
7645 ensureRealfileExists(t, files, "lib64/mylib.so")
7646 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007647 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007648
Jiyong Park9d677202020-02-19 16:29:35 +09007649 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7650 ensureRealfileExists(t, files, "javalib/myjar.jar")
7651 ensureRealfileExists(t, files, "lib64/mylib.so")
7652 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007653 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007654
7655 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007656 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007657 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007658 ensureRealfileExists(t, files, "javalib/myjar.jar")
7659 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007660 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7661 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007662
7663 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7664 ensureRealfileExists(t, files, "javalib/myjar.jar")
7665 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007666 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7667 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007668}
7669
Yo Chiange8128052020-07-23 20:09:18 +08007670func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007671 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007672 apex {
7673 name: "myapex",
7674 key: "myapex.key",
7675 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007676 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007677 }
7678
7679 apex_key {
7680 name: "myapex.key",
7681 public_key: "testkey.avbpubkey",
7682 private_key: "testkey.pem",
7683 }
7684
7685 cc_library_shared {
7686 name: "mylib",
7687 srcs: ["mylib.cpp"],
7688 shared_libs: ["myotherlib"],
7689 system_shared_libs: [],
7690 stl: "none",
7691 apex_available: [
7692 "myapex",
7693 "//apex_available:platform",
7694 ],
7695 }
7696
7697 cc_prebuilt_library_shared {
7698 name: "myotherlib",
7699 srcs: ["prebuilt.so"],
7700 system_shared_libs: [],
7701 stl: "none",
7702 apex_available: [
7703 "myapex",
7704 "//apex_available:platform",
7705 ],
7706 }
7707 `)
7708
Prerana Patilb1896c82022-11-09 18:14:34 +00007709 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007710 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007711 var builder strings.Builder
7712 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7713 androidMk := builder.String()
7714 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007715 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007716 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7717 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7718 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007719 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 +08007720}
7721
Jooyung Han643adc42020-02-27 13:50:06 +09007722func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007723 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007724 apex {
7725 name: "myapex",
7726 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007727 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007728 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007729 }
7730
7731 apex_key {
7732 name: "myapex.key",
7733 public_key: "testkey.avbpubkey",
7734 private_key: "testkey.pem",
7735 }
7736
7737 cc_library {
7738 name: "mylib",
7739 srcs: ["mylib.cpp"],
7740 shared_libs: ["mylib2"],
7741 system_shared_libs: [],
7742 stl: "none",
7743 apex_available: [ "myapex" ],
7744 }
7745
7746 cc_library {
7747 name: "mylib2",
7748 srcs: ["mylib.cpp"],
7749 system_shared_libs: [],
7750 stl: "none",
7751 apex_available: [ "myapex" ],
7752 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007753
7754 rust_ffi_shared {
7755 name: "libfoo.rust",
7756 crate_name: "foo",
7757 srcs: ["foo.rs"],
7758 shared_libs: ["libfoo.shared_from_rust"],
7759 prefer_rlib: true,
7760 apex_available: ["myapex"],
7761 }
7762
7763 cc_library_shared {
7764 name: "libfoo.shared_from_rust",
7765 srcs: ["mylib.cpp"],
7766 system_shared_libs: [],
7767 stl: "none",
7768 stubs: {
7769 versions: ["10", "11", "12"],
7770 },
7771 }
7772
Jooyung Han643adc42020-02-27 13:50:06 +09007773 `)
7774
7775 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7776 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007777 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007778 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7779 "lib64/mylib.so",
7780 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007781 "lib64/libfoo.rust.so",
7782 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7783 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007784 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007785
7786 // b/220397949
7787 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007788}
7789
Jooyung Han49f67012020-04-17 13:43:10 +09007790func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007791 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007792 apex {
7793 name: "myapex",
7794 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007795 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007796 }
7797 apex_key {
7798 name: "myapex.key",
7799 public_key: "testkey.avbpubkey",
7800 private_key: "testkey.pem",
7801 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007802 `,
7803 android.FixtureModifyConfig(func(config android.Config) {
7804 delete(config.Targets, android.Android)
7805 config.AndroidCommonTarget = android.Target{}
7806 }),
7807 )
Jooyung Han49f67012020-04-17 13:43:10 +09007808
7809 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7810 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7811 }
7812}
7813
Jiyong Parkbd159612020-02-28 15:22:21 +09007814func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007815 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007816 apex {
7817 name: "myapex",
7818 key: "myapex.key",
7819 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007820 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007821 }
7822
7823 apex_key {
7824 name: "myapex.key",
7825 public_key: "testkey.avbpubkey",
7826 private_key: "testkey.pem",
7827 }
7828
7829 android_app {
7830 name: "AppFoo",
7831 srcs: ["foo/bar/MyClass.java"],
7832 sdk_version: "none",
7833 system_modules: "none",
7834 apex_available: [ "myapex" ],
7835 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007836 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007837
Colin Crosscf371cc2020-11-13 11:48:42 -08007838 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007839 content := bundleConfigRule.Args["content"]
7840
7841 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007842 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 +09007843}
7844
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007845func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007846 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007847 apex {
7848 name: "myapex",
7849 key: "myapex.key",
7850 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007851 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007852 }
7853
7854 apex_key {
7855 name: "myapex.key",
7856 public_key: "testkey.avbpubkey",
7857 private_key: "testkey.pem",
7858 }
7859
7860 android_app_set {
7861 name: "AppSet",
7862 set: "AppSet.apks",
7863 }`)
7864 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007865 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007866 content := bundleConfigRule.Args["content"]
7867 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7868 s := mod.Rule("apexRule").Args["copy_commands"]
7869 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007870 if len(copyCmds) != 4 {
7871 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007872 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007873 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7874 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007875 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7876 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007877
7878 // Ensure that canned_fs_config has an entry for the app set zip file
7879 generateFsRule := mod.Rule("generateFsConfig")
7880 cmd := generateFsRule.RuleParams.Command
7881 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007882}
7883
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007884func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007885 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007886 apex_set {
7887 name: "myapex",
7888 filename: "foo_v2.apex",
7889 sanitized: {
7890 none: { set: "myapex.apks", },
7891 hwaddress: { set: "myapex.hwasan.apks", },
7892 },
Paul Duffin24704672021-04-06 16:09:30 +01007893 }
7894 `
7895 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007896
Paul Duffin24704672021-04-06 16:09:30 +01007897 // Check that the extractor produces the correct output file from the correct input file.
7898 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007899
Paul Duffin24704672021-04-06 16:09:30 +01007900 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7901 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007902
Paul Duffin24704672021-04-06 16:09:30 +01007903 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7904
7905 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007906 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7907 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007908
7909 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007910}
7911
Pranav Guptaeba03b02022-09-27 00:27:08 +00007912func TestApexSetApksModuleAssignment(t *testing.T) {
7913 ctx := testApex(t, `
7914 apex_set {
7915 name: "myapex",
7916 set: ":myapex_apks_file",
7917 }
7918
7919 filegroup {
7920 name: "myapex_apks_file",
7921 srcs: ["myapex.apks"],
7922 }
7923 `)
7924
7925 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7926
7927 // Check that the extractor produces the correct apks file from the input module
7928 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7929 extractedApex := m.Output(extractorOutput)
7930
7931 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7932}
7933
Paul Duffin89f570a2021-06-16 01:42:33 +01007934func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007935 t.Helper()
7936
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007937 bp := `
7938 java_library {
7939 name: "some-updatable-apex-lib",
7940 srcs: ["a.java"],
7941 sdk_version: "current",
7942 apex_available: [
7943 "some-updatable-apex",
7944 ],
satayevabcd5972021-08-06 17:49:46 +01007945 permitted_packages: ["some.updatable.apex.lib"],
Spandan Dascc9d9422023-04-06 18:07:43 +00007946 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007947 }
7948
7949 java_library {
7950 name: "some-non-updatable-apex-lib",
7951 srcs: ["a.java"],
7952 apex_available: [
7953 "some-non-updatable-apex",
7954 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007955 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007956 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007957 }
7958
7959 bootclasspath_fragment {
7960 name: "some-non-updatable-fragment",
7961 contents: ["some-non-updatable-apex-lib"],
7962 apex_available: [
7963 "some-non-updatable-apex",
7964 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007965 hidden_api: {
7966 split_packages: ["*"],
7967 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007968 }
7969
7970 java_library {
7971 name: "some-platform-lib",
7972 srcs: ["a.java"],
7973 sdk_version: "current",
7974 installable: true,
7975 }
7976
7977 java_library {
7978 name: "some-art-lib",
7979 srcs: ["a.java"],
7980 sdk_version: "current",
7981 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007982 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007983 ],
7984 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007985 compile_dex: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007986 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007987 }
7988
7989 apex {
7990 name: "some-updatable-apex",
7991 key: "some-updatable-apex.key",
7992 java_libs: ["some-updatable-apex-lib"],
7993 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007994 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007995 }
7996
7997 apex {
7998 name: "some-non-updatable-apex",
7999 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01008000 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008001 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008002 }
8003
8004 apex_key {
8005 name: "some-updatable-apex.key",
8006 }
8007
8008 apex_key {
8009 name: "some-non-updatable-apex.key",
8010 }
8011
8012 apex {
Paul Duffind376f792021-01-26 11:59:35 +00008013 name: "com.android.art.debug",
8014 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01008015 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008016 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00008017 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008018 }
8019
Paul Duffinf23bc472021-04-27 12:42:20 +01008020 bootclasspath_fragment {
8021 name: "art-bootclasspath-fragment",
8022 image_name: "art",
8023 contents: ["some-art-lib"],
8024 apex_available: [
8025 "com.android.art.debug",
8026 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01008027 hidden_api: {
8028 split_packages: ["*"],
8029 },
Paul Duffinf23bc472021-04-27 12:42:20 +01008030 }
8031
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008032 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00008033 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008034 }
8035
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008036 filegroup {
8037 name: "some-updatable-apex-file_contexts",
8038 srcs: [
8039 "system/sepolicy/apex/some-updatable-apex-file_contexts",
8040 ],
8041 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008042
8043 filegroup {
8044 name: "some-non-updatable-apex-file_contexts",
8045 srcs: [
8046 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
8047 ],
8048 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008049 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00008050
Paul Duffin89f570a2021-06-16 01:42:33 +01008051 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00008052}
8053
Paul Duffin89f570a2021-06-16 01:42:33 +01008054func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008055 t.Helper()
8056
Paul Duffin55607122021-03-30 23:32:51 +01008057 fs := android.MockFS{
8058 "a.java": nil,
8059 "a.jar": nil,
8060 "apex_manifest.json": nil,
8061 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008062 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008063 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8064 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8065 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008066 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008067 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008068
Paul Duffin55607122021-03-30 23:32:51 +01008069 errorHandler := android.FixtureExpectsNoErrors
8070 if errmsg != "" {
8071 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008072 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008073
Paul Duffin55607122021-03-30 23:32:51 +01008074 result := android.GroupFixturePreparers(
8075 cc.PrepareForTestWithCcDefaultModules,
8076 java.PrepareForTestWithHiddenApiBuildComponents,
8077 java.PrepareForTestWithJavaDefaultModules,
8078 java.PrepareForTestWithJavaSdkLibraryFiles,
8079 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008080 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008081 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008082 android.FixtureModifyMockFS(func(fs android.MockFS) {
8083 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8084 insert := ""
8085 for _, fragment := range fragments {
8086 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8087 }
8088 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8089 platform_bootclasspath {
8090 name: "platform-bootclasspath",
8091 fragments: [
8092 %s
8093 ],
8094 }
8095 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008096 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008097 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008098 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008099 ).
8100 ExtendWithErrorHandler(errorHandler).
8101 RunTestWithBp(t, bp)
8102
8103 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008104}
8105
Paul Duffin5556c5f2022-06-09 17:32:21 +00008106func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008107 preparers := android.GroupFixturePreparers(
8108 java.PrepareForTestWithJavaDefaultModules,
8109 PrepareForTestWithApexBuildComponents,
8110 ).
8111 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
8112 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
8113
8114 bpBase := `
8115 apex_set {
8116 name: "com.android.myapex",
8117 installable: true,
8118 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8119 set: "myapex.apks",
8120 }
8121
8122 apex_set {
8123 name: "com.mycompany.android.myapex",
8124 apex_name: "com.android.myapex",
8125 installable: true,
8126 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8127 set: "company-myapex.apks",
8128 }
8129
8130 prebuilt_bootclasspath_fragment {
8131 name: "my-bootclasspath-fragment",
8132 apex_available: ["com.android.myapex"],
8133 %s
8134 }
8135 `
8136
8137 t.Run("java_import", func(t *testing.T) {
8138 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8139 java_import {
8140 name: "libfoo",
8141 jars: ["libfoo.jar"],
8142 apex_available: ["com.android.myapex"],
8143 }
8144 `)
8145 })
8146
8147 t.Run("java_sdk_library_import", func(t *testing.T) {
8148 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8149 java_sdk_library_import {
8150 name: "libfoo",
8151 public: {
8152 jars: ["libbar.jar"],
8153 },
8154 apex_available: ["com.android.myapex"],
8155 }
8156 `)
8157 })
8158
8159 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8160 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8161 image_name: "art",
8162 contents: ["libfoo"],
8163 `)+`
8164 java_sdk_library_import {
8165 name: "libfoo",
8166 public: {
8167 jars: ["libbar.jar"],
8168 },
8169 apex_available: ["com.android.myapex"],
8170 }
8171 `)
8172 })
8173}
8174
Paul Duffin5556c5f2022-06-09 17:32:21 +00008175func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8176 preparers := android.GroupFixturePreparers(
8177 java.PrepareForTestWithJavaDefaultModules,
8178 PrepareForTestWithApexBuildComponents,
8179 )
8180
8181 bpBase := `
8182 apex_set {
8183 name: "com.android.myapex",
8184 installable: true,
8185 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8186 set: "myapex.apks",
8187 }
8188
8189 apex_set {
8190 name: "com.android.myapex_compressed",
8191 apex_name: "com.android.myapex",
8192 installable: true,
8193 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8194 set: "myapex_compressed.apks",
8195 }
8196
8197 prebuilt_bootclasspath_fragment {
8198 name: "my-bootclasspath-fragment",
8199 apex_available: [
8200 "com.android.myapex",
8201 "com.android.myapex_compressed",
8202 ],
8203 hidden_api: {
8204 annotation_flags: "annotation-flags.csv",
8205 metadata: "metadata.csv",
8206 index: "index.csv",
8207 signature_patterns: "signature_patterns.csv",
8208 },
8209 %s
8210 }
8211 `
8212
8213 t.Run("java_import", func(t *testing.T) {
8214 result := preparers.RunTestWithBp(t,
8215 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8216 java_import {
8217 name: "libfoo",
8218 jars: ["libfoo.jar"],
8219 apex_available: [
8220 "com.android.myapex",
8221 "com.android.myapex_compressed",
8222 ],
8223 }
8224 `)
8225
8226 module := result.Module("libfoo", "android_common_com.android.myapex")
8227 usesLibraryDep := module.(java.UsesLibraryDependency)
8228 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8229 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8230 usesLibraryDep.DexJarBuildPath().Path())
8231 })
8232
8233 t.Run("java_sdk_library_import", func(t *testing.T) {
8234 result := preparers.RunTestWithBp(t,
8235 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8236 java_sdk_library_import {
8237 name: "libfoo",
8238 public: {
8239 jars: ["libbar.jar"],
8240 },
8241 apex_available: [
8242 "com.android.myapex",
8243 "com.android.myapex_compressed",
8244 ],
8245 compile_dex: true,
8246 }
8247 `)
8248
8249 module := result.Module("libfoo", "android_common_com.android.myapex")
8250 usesLibraryDep := module.(java.UsesLibraryDependency)
8251 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8252 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8253 usesLibraryDep.DexJarBuildPath().Path())
8254 })
8255
8256 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8257 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8258 image_name: "art",
8259 contents: ["libfoo"],
8260 `)+`
8261 java_sdk_library_import {
8262 name: "libfoo",
8263 public: {
8264 jars: ["libbar.jar"],
8265 },
8266 apex_available: [
8267 "com.android.myapex",
8268 "com.android.myapex_compressed",
8269 ],
8270 compile_dex: true,
8271 }
8272 `)
8273 })
8274}
8275
Jooyung Han548640b2020-04-27 12:10:30 +09008276func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8277 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8278 apex {
8279 name: "myapex",
8280 key: "myapex.key",
8281 updatable: true,
8282 }
8283
8284 apex_key {
8285 name: "myapex.key",
8286 public_key: "testkey.avbpubkey",
8287 private_key: "testkey.pem",
8288 }
8289 `)
8290}
8291
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008292func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8293 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8294 apex {
8295 name: "myapex",
8296 key: "myapex.key",
8297 }
8298
8299 apex_key {
8300 name: "myapex.key",
8301 public_key: "testkey.avbpubkey",
8302 private_key: "testkey.pem",
8303 }
8304 `)
8305}
8306
Jooyung Handfc864c2023-03-20 18:19:07 +09008307func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8308 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008309 apex {
8310 name: "myapex",
8311 key: "myapex.key",
8312 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008313 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008314 soc_specific: true,
8315 }
8316
8317 apex_key {
8318 name: "myapex.key",
8319 public_key: "testkey.avbpubkey",
8320 private_key: "testkey.pem",
8321 }
8322 `)
8323}
8324
Jooyung Han02873da2023-03-22 17:41:03 +09008325func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8326 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8327 apex {
8328 name: "myapex",
8329 key: "myapex.key",
8330 updatable: false,
8331 min_sdk_version: "29",
8332 use_vndk_as_stable: true,
8333 vendor: true,
8334 }
8335
8336 apex_key {
8337 name: "myapex.key",
8338 public_key: "testkey.avbpubkey",
8339 private_key: "testkey.pem",
8340 }
8341 `)
8342}
8343
Jooyung Handfc864c2023-03-20 18:19:07 +09008344func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8345 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8346 apex {
8347 name: "myapex",
8348 key: "myapex.key",
8349 updatable: false,
8350 use_vndk_as_stable: true,
8351 }
8352
8353 apex_key {
8354 name: "myapex.key",
8355 public_key: "testkey.avbpubkey",
8356 private_key: "testkey.pem",
8357 }
8358 `)
8359}
8360
satayevb98371c2021-06-15 16:49:50 +01008361func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8362 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8363 apex {
8364 name: "myapex",
8365 key: "myapex.key",
8366 systemserverclasspath_fragments: [
8367 "mysystemserverclasspathfragment",
8368 ],
8369 min_sdk_version: "29",
8370 updatable: true,
8371 }
8372
8373 apex_key {
8374 name: "myapex.key",
8375 public_key: "testkey.avbpubkey",
8376 private_key: "testkey.pem",
8377 }
8378
8379 java_library {
8380 name: "foo",
8381 srcs: ["b.java"],
8382 min_sdk_version: "29",
8383 installable: true,
8384 apex_available: [
8385 "myapex",
8386 ],
8387 }
8388
8389 systemserverclasspath_fragment {
8390 name: "mysystemserverclasspathfragment",
8391 generate_classpaths_proto: false,
8392 contents: [
8393 "foo",
8394 ],
8395 apex_available: [
8396 "myapex",
8397 ],
8398 }
satayevabcd5972021-08-06 17:49:46 +01008399 `,
8400 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8401 )
satayevb98371c2021-06-15 16:49:50 +01008402}
8403
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008404func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008405 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
8406 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
8407 // modules to be included in the BootJars.
8408 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
8409 return android.GroupFixturePreparers(
8410 dexpreopt.FixtureSetBootJars(bootJars...),
8411 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8412 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8413 }),
8414 )
8415 }
8416
8417 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
8418 // same value. This can result in an invalid configuration as it allows non art apex jars to be
8419 // specified in the ArtApexJars configuration.
8420 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
8421 return android.GroupFixturePreparers(
8422 dexpreopt.FixtureSetArtBootJars(bootJars...),
8423 dexpreopt.FixtureSetBootJars(bootJars...),
8424 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8425 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8426 }),
8427 )
8428 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008429
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008430 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008431 preparer := android.GroupFixturePreparers(
8432 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
8433 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8434 )
8435 fragments := []java.ApexVariantReference{
8436 {
8437 Apex: proptools.StringPtr("com.android.art.debug"),
8438 Module: proptools.StringPtr("art-bootclasspath-fragment"),
8439 },
8440 {
8441 Apex: proptools.StringPtr("some-non-updatable-apex"),
8442 Module: proptools.StringPtr("some-non-updatable-fragment"),
8443 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008444 }
satayevabcd5972021-08-06 17:49:46 +01008445 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008446 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008447
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008448 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008449 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
8450 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01008451 preparer := android.GroupFixturePreparers(
8452 prepareSetBootJars("com.android.art.debug:some-art-lib"),
8453 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8454 )
Paul Duffin60264a02021-04-12 20:02:36 +01008455 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008456 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008457
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008458 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 +01008459 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 +01008460 // Update the dexpreopt ArtApexJars directly.
8461 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
8462 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008463 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008464
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008465 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 +01008466 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 +01008467 // Update the dexpreopt ArtApexJars directly.
8468 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
8469 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008470 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008471
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008472 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 +01008473 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 +01008474 preparer := android.GroupFixturePreparers(
8475 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
8476 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8477 )
Paul Duffin60264a02021-04-12 20:02:36 +01008478 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008479 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008480
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008481 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 +01008482 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01008483 fragment := java.ApexVariantReference{
8484 Apex: proptools.StringPtr("some-non-updatable-apex"),
8485 Module: proptools.StringPtr("some-non-updatable-fragment"),
8486 }
8487 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008488 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008489
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008490 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008491 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008492 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8493 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008494 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008495
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008496 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008497 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008498 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8499 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008500 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008501
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008502 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008503 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01008504 // Update the dexpreopt ArtApexJars directly.
8505 preparer := prepareSetArtJars("platform:some-platform-lib")
8506 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008507 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008508
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008509 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008510 preparer := android.GroupFixturePreparers(
8511 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8512 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8513 )
8514 fragments := []java.ApexVariantReference{
8515 {
8516 Apex: proptools.StringPtr("some-non-updatable-apex"),
8517 Module: proptools.StringPtr("some-non-updatable-fragment"),
8518 },
8519 }
8520 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008521 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008522}
8523
8524func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008525 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008526 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008527 fragment := java.ApexVariantReference{
8528 Apex: proptools.StringPtr("myapex"),
8529 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8530 }
8531
Paul Duffin064b70c2020-11-02 17:32:38 +00008532 testDexpreoptWithApexes(t, `
8533 prebuilt_apex {
8534 name: "myapex" ,
8535 arch: {
8536 arm64: {
8537 src: "myapex-arm64.apex",
8538 },
8539 arm: {
8540 src: "myapex-arm.apex",
8541 },
8542 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008543 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8544 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008545
Paul Duffin89f570a2021-06-16 01:42:33 +01008546 prebuilt_bootclasspath_fragment {
8547 name: "my-bootclasspath-fragment",
8548 contents: ["libfoo"],
8549 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008550 hidden_api: {
8551 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8552 metadata: "my-bootclasspath-fragment/metadata.csv",
8553 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008554 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8555 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8556 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008557 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008558 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008559
Paul Duffin89f570a2021-06-16 01:42:33 +01008560 java_import {
8561 name: "libfoo",
8562 jars: ["libfoo.jar"],
8563 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008564 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008565 }
8566 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008567 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008568}
8569
Spandan Dasf14e2542021-11-12 00:01:37 +00008570func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008571 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008572 bp += `
8573 apex_key {
8574 name: "myapex.key",
8575 public_key: "testkey.avbpubkey",
8576 private_key: "testkey.pem",
8577 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008578 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008579 "lib1/src/A.java": nil,
8580 "lib2/src/B.java": nil,
8581 "system/sepolicy/apex/myapex-file_contexts": nil,
8582 }
8583
Paul Duffin45338f02021-03-30 23:07:52 +01008584 errorHandler := android.FixtureExpectsNoErrors
8585 if errmsg != "" {
8586 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008587 }
Colin Crossae8600b2020-10-29 17:09:13 -07008588
Paul Duffin45338f02021-03-30 23:07:52 +01008589 android.GroupFixturePreparers(
8590 android.PrepareForTestWithAndroidBuildComponents,
8591 java.PrepareForTestWithJavaBuildComponents,
8592 PrepareForTestWithApexBuildComponents,
8593 android.PrepareForTestWithNeverallowRules(rules),
8594 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008595 apexBootJars := make([]string, 0, len(bootJars))
8596 for _, apexBootJar := range bootJars {
8597 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008598 }
satayevd604b212021-07-21 14:23:52 +01008599 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008600 }),
8601 fs.AddToFixture(),
8602 ).
8603 ExtendWithErrorHandler(errorHandler).
8604 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008605}
8606
8607func TestApexPermittedPackagesRules(t *testing.T) {
8608 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008609 name string
8610 expectedError string
8611 bp string
8612 bootJars []string
8613 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008614 }{
8615
8616 {
8617 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8618 expectedError: "",
8619 bp: `
8620 java_library {
8621 name: "bcp_lib1",
8622 srcs: ["lib1/src/*.java"],
8623 permitted_packages: ["foo.bar"],
8624 apex_available: ["myapex"],
8625 sdk_version: "none",
8626 system_modules: "none",
8627 }
8628 java_library {
8629 name: "nonbcp_lib2",
8630 srcs: ["lib2/src/*.java"],
8631 apex_available: ["myapex"],
8632 permitted_packages: ["a.b"],
8633 sdk_version: "none",
8634 system_modules: "none",
8635 }
8636 apex {
8637 name: "myapex",
8638 key: "myapex.key",
8639 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008640 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008641 }`,
8642 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008643 bcpPermittedPackages: map[string][]string{
8644 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008645 "foo.bar",
8646 },
8647 },
8648 },
8649 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008650 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008651 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 +01008652 bp: `
8653 java_library {
8654 name: "bcp_lib1",
8655 srcs: ["lib1/src/*.java"],
8656 apex_available: ["myapex"],
8657 permitted_packages: ["foo.bar"],
8658 sdk_version: "none",
8659 system_modules: "none",
8660 }
8661 java_library {
8662 name: "bcp_lib2",
8663 srcs: ["lib2/src/*.java"],
8664 apex_available: ["myapex"],
8665 permitted_packages: ["foo.bar", "bar.baz"],
8666 sdk_version: "none",
8667 system_modules: "none",
8668 }
8669 apex {
8670 name: "myapex",
8671 key: "myapex.key",
8672 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008673 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008674 }
8675 `,
8676 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008677 bcpPermittedPackages: map[string][]string{
8678 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008679 "foo.bar",
8680 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008681 "bcp_lib2": []string{
8682 "foo.bar",
8683 },
8684 },
8685 },
8686 {
8687 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8688 expectedError: "",
8689 bp: `
8690 java_library {
8691 name: "bcp_lib_restricted",
8692 srcs: ["lib1/src/*.java"],
8693 apex_available: ["myapex"],
8694 permitted_packages: ["foo.bar"],
8695 sdk_version: "none",
8696 min_sdk_version: "29",
8697 system_modules: "none",
8698 }
8699 java_library {
8700 name: "bcp_lib_unrestricted",
8701 srcs: ["lib2/src/*.java"],
8702 apex_available: ["myapex"],
8703 permitted_packages: ["foo.bar", "bar.baz"],
8704 sdk_version: "none",
8705 min_sdk_version: "29",
8706 system_modules: "none",
8707 }
8708 apex {
8709 name: "myapex",
8710 key: "myapex.key",
8711 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8712 updatable: true,
8713 min_sdk_version: "29",
8714 }
8715 `,
8716 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8717 bcpPermittedPackages: map[string][]string{
8718 "bcp_lib1_non_updateable": []string{
8719 "foo.bar",
8720 },
8721 // 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 +01008722 },
8723 },
8724 }
8725 for _, tc := range testcases {
8726 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008727 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8728 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008729 })
8730 }
8731}
8732
Jiyong Park62304bb2020-04-13 16:19:48 +09008733func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008734 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008735 apex {
8736 name: "myapex",
8737 key: "myapex.key",
8738 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008739 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008740 }
8741
8742 apex_key {
8743 name: "myapex.key",
8744 public_key: "testkey.avbpubkey",
8745 private_key: "testkey.pem",
8746 }
8747
8748 cc_library {
8749 name: "mylib",
8750 srcs: ["mylib.cpp"],
8751 system_shared_libs: [],
8752 stl: "none",
8753 stubs: {
8754 versions: ["1"],
8755 },
8756 apex_available: ["myapex"],
8757 }
8758
8759 cc_library {
8760 name: "myprivlib",
8761 srcs: ["mylib.cpp"],
8762 system_shared_libs: [],
8763 stl: "none",
8764 apex_available: ["myapex"],
8765 }
8766
8767
8768 cc_test {
8769 name: "mytest",
8770 gtest: false,
8771 srcs: ["mylib.cpp"],
8772 system_shared_libs: [],
8773 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008774 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008775 test_for: ["myapex"]
8776 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008777
8778 cc_library {
8779 name: "mytestlib",
8780 srcs: ["mylib.cpp"],
8781 system_shared_libs: [],
8782 shared_libs: ["mylib", "myprivlib"],
8783 stl: "none",
8784 test_for: ["myapex"],
8785 }
8786
8787 cc_benchmark {
8788 name: "mybench",
8789 srcs: ["mylib.cpp"],
8790 system_shared_libs: [],
8791 shared_libs: ["mylib", "myprivlib"],
8792 stl: "none",
8793 test_for: ["myapex"],
8794 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008795 `)
8796
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008797 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008798 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008799 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8800 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8801 }
8802
8803 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008804 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008805 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8806 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8807 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8808}
Jiyong Park46a512f2020-12-04 18:02:13 +09008809
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008810func TestIndirectTestFor(t *testing.T) {
8811 ctx := testApex(t, `
8812 apex {
8813 name: "myapex",
8814 key: "myapex.key",
8815 native_shared_libs: ["mylib", "myprivlib"],
8816 updatable: false,
8817 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008818
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008819 apex_key {
8820 name: "myapex.key",
8821 public_key: "testkey.avbpubkey",
8822 private_key: "testkey.pem",
8823 }
8824
8825 cc_library {
8826 name: "mylib",
8827 srcs: ["mylib.cpp"],
8828 system_shared_libs: [],
8829 stl: "none",
8830 stubs: {
8831 versions: ["1"],
8832 },
8833 apex_available: ["myapex"],
8834 }
8835
8836 cc_library {
8837 name: "myprivlib",
8838 srcs: ["mylib.cpp"],
8839 system_shared_libs: [],
8840 stl: "none",
8841 shared_libs: ["mylib"],
8842 apex_available: ["myapex"],
8843 }
8844
8845 cc_library {
8846 name: "mytestlib",
8847 srcs: ["mylib.cpp"],
8848 system_shared_libs: [],
8849 shared_libs: ["myprivlib"],
8850 stl: "none",
8851 test_for: ["myapex"],
8852 }
8853 `)
8854
8855 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008856 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008857 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8858 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8859 }
8860
8861 // The platform variant of mytestlib links to the platform variant of the
8862 // internal myprivlib.
8863 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8864
8865 // The platform variant of myprivlib links to the platform variant of mylib
8866 // and bypasses its stubs.
8867 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 +09008868}
8869
Martin Stjernholmec009002021-03-27 15:18:31 +00008870func TestTestForForLibInOtherApex(t *testing.T) {
8871 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8872 _ = testApex(t, `
8873 apex {
8874 name: "com.android.art",
8875 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008876 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008877 updatable: false,
8878 }
8879
8880 apex {
8881 name: "com.android.art.debug",
8882 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008883 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008884 updatable: false,
8885 }
8886
8887 apex_key {
8888 name: "myapex.key",
8889 public_key: "testkey.avbpubkey",
8890 private_key: "testkey.pem",
8891 }
8892
8893 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008894 name: "libnativebridge",
8895 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008896 system_shared_libs: [],
8897 stl: "none",
8898 stubs: {
8899 versions: ["1"],
8900 },
8901 apex_available: ["com.android.art", "com.android.art.debug"],
8902 }
8903
8904 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008905 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008906 srcs: ["mylib.cpp"],
8907 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008908 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008909 stl: "none",
8910 apex_available: ["com.android.art.debug"],
8911 test_for: ["com.android.art"],
8912 }
8913 `,
8914 android.MockFS{
8915 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8916 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8917 }.AddToFixture())
8918}
8919
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008920// TODO(jungjw): Move this to proptools
8921func intPtr(i int) *int {
8922 return &i
8923}
8924
8925func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008926 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008927 apex_set {
8928 name: "myapex",
8929 set: "myapex.apks",
8930 filename: "foo_v2.apex",
8931 overrides: ["foo"],
8932 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008933 `,
8934 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8935 variables.Platform_sdk_version = intPtr(30)
8936 }),
8937 android.FixtureModifyConfig(func(config android.Config) {
8938 config.Targets[android.Android] = []android.Target{
8939 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8940 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8941 }
8942 }),
8943 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008944
Paul Duffin24704672021-04-06 16:09:30 +01008945 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008946
8947 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008948 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008949 actual := extractedApex.Args["abis"]
8950 expected := "ARMEABI_V7A,ARM64_V8A"
8951 if actual != expected {
8952 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8953 }
8954 actual = extractedApex.Args["sdk-version"]
8955 expected = "30"
8956 if actual != expected {
8957 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8958 }
8959
Paul Duffin6717d882021-06-15 19:09:41 +01008960 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008961 a := m.Module().(*ApexSet)
8962 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008963 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008964 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8965 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8966 }
8967}
8968
Anton Hansson805e0a52022-11-25 14:06:46 +00008969func TestApexSet_NativeBridge(t *testing.T) {
8970 ctx := testApex(t, `
8971 apex_set {
8972 name: "myapex",
8973 set: "myapex.apks",
8974 filename: "foo_v2.apex",
8975 overrides: ["foo"],
8976 }
8977 `,
8978 android.FixtureModifyConfig(func(config android.Config) {
8979 config.Targets[android.Android] = []android.Target{
8980 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8981 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8982 }
8983 }),
8984 )
8985
8986 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8987
8988 // Check extract_apks tool parameters. No native bridge arch expected
8989 extractedApex := m.Output("extracted/myapex.apks")
8990 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8991}
8992
Jiyong Park7d95a512020-05-10 15:16:24 +09008993func TestNoStaticLinkingToStubsLib(t *testing.T) {
8994 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8995 apex {
8996 name: "myapex",
8997 key: "myapex.key",
8998 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008999 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009000 }
9001
9002 apex_key {
9003 name: "myapex.key",
9004 public_key: "testkey.avbpubkey",
9005 private_key: "testkey.pem",
9006 }
9007
9008 cc_library {
9009 name: "mylib",
9010 srcs: ["mylib.cpp"],
9011 static_libs: ["otherlib"],
9012 system_shared_libs: [],
9013 stl: "none",
9014 apex_available: [ "myapex" ],
9015 }
9016
9017 cc_library {
9018 name: "otherlib",
9019 srcs: ["mylib.cpp"],
9020 system_shared_libs: [],
9021 stl: "none",
9022 stubs: {
9023 versions: ["1", "2", "3"],
9024 },
9025 apex_available: [ "myapex" ],
9026 }
9027 `)
9028}
9029
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009030func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009031 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009032 apex {
9033 name: "myapex",
9034 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009035 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009036 custom_sign_tool: "sign_myapex",
9037 }
9038
9039 apex_key {
9040 name: "myapex.key",
9041 public_key: "testkey.avbpubkey",
9042 private_key: "testkey.pem",
9043 }
9044 `)
9045
9046 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9047 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
9048 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"`)
9049}
9050
9051func TestApexKeysTxtOverrides(t *testing.T) {
9052 ctx := testApex(t, `
9053 apex {
9054 name: "myapex",
9055 key: "myapex.key",
9056 updatable: false,
9057 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009058 }
9059
9060 apex_key {
9061 name: "myapex.key",
9062 public_key: "testkey.avbpubkey",
9063 private_key: "testkey.pem",
9064 }
9065
9066 prebuilt_apex {
9067 name: "myapex",
9068 prefer: true,
9069 arch: {
9070 arm64: {
9071 src: "myapex-arm64.apex",
9072 },
9073 arm: {
9074 src: "myapex-arm.apex",
9075 },
9076 },
9077 }
9078
9079 apex_set {
9080 name: "myapex_set",
9081 set: "myapex.apks",
9082 filename: "myapex_set.apex",
9083 overrides: ["myapex"],
9084 }
9085 `)
9086
9087 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9088 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
9089 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 +09009090 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 +09009091}
9092
Jooyung Han938b5932020-06-20 12:47:47 +09009093func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009094 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009095 apex {
9096 name: "myapex",
9097 key: "myapex.key",
9098 apps: ["app"],
9099 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009100 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009101 }
9102
9103 apex_key {
9104 name: "myapex.key",
9105 public_key: "testkey.avbpubkey",
9106 private_key: "testkey.pem",
9107 }
9108
9109 android_app {
9110 name: "app",
9111 srcs: ["foo/bar/MyClass.java"],
9112 package_name: "foo",
9113 sdk_version: "none",
9114 system_modules: "none",
9115 apex_available: [ "myapex" ],
9116 }
9117 `, withFiles(map[string][]byte{
9118 "sub/Android.bp": []byte(`
9119 override_apex {
9120 name: "override_myapex",
9121 base: "myapex",
9122 apps: ["override_app"],
9123 allowed_files: ":allowed",
9124 }
9125 // Overridable "path" property should be referenced indirectly
9126 filegroup {
9127 name: "allowed",
9128 srcs: ["allowed.txt"],
9129 }
9130 override_android_app {
9131 name: "override_app",
9132 base: "app",
9133 package_name: "bar",
9134 }
9135 `),
9136 }))
9137
9138 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
9139 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9140 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9141 }
9142
9143 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
9144 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9145 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9146 }
9147}
9148
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009149func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009150 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009151 apex {
9152 name: "myapex",
9153 key: "myapex.key",
9154 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009155 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009156 }
9157
9158 apex_key {
9159 name: "myapex.key",
9160 public_key: "testkey.avbpubkey",
9161 private_key: "testkey.pem",
9162 }
9163
9164 cc_library {
9165 name: "mylib",
9166 srcs: ["mylib.cpp"],
9167 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009168 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009169 },
9170 apex_available: ["myapex"],
9171 }
9172
9173 cc_prebuilt_library_shared {
9174 name: "mylib",
9175 prefer: false,
9176 srcs: ["prebuilt.so"],
9177 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009178 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009179 },
9180 apex_available: ["myapex"],
9181 }
9182 `)
9183}
9184
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009185func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009186 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009187 apex {
9188 name: "myapex",
9189 key: "myapex.key",
9190 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009191 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009192 }
9193 apex_key {
9194 name: "myapex.key",
9195 public_key: "testkey.avbpubkey",
9196 private_key: "testkey.pem",
9197 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009198 `,
9199 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9200 variables.CompressedApex = proptools.BoolPtr(true)
9201 }),
9202 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009203
9204 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
9205 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9206
9207 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
9208 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9209
9210 // Make sure output of bundle is .capex
9211 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9212 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9213
9214 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009215 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009216 var builder strings.Builder
9217 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9218 androidMk := builder.String()
9219 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9220}
9221
Martin Stjernholm2856c662020-12-02 15:03:42 +00009222func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009223 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009224 apex {
9225 name: "myapex",
9226 key: "myapex.key",
9227 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009228 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009229 }
9230
9231 apex_key {
9232 name: "myapex.key",
9233 public_key: "testkey.avbpubkey",
9234 private_key: "testkey.pem",
9235 }
9236
9237 cc_library {
9238 name: "mylib",
9239 srcs: ["mylib.cpp"],
9240 apex_available: ["myapex"],
9241 shared_libs: ["otherlib"],
9242 system_shared_libs: [],
9243 }
9244
9245 cc_library {
9246 name: "otherlib",
9247 srcs: ["mylib.cpp"],
9248 stubs: {
9249 versions: ["current"],
9250 },
9251 }
9252
9253 cc_prebuilt_library_shared {
9254 name: "otherlib",
9255 prefer: true,
9256 srcs: ["prebuilt.so"],
9257 stubs: {
9258 versions: ["current"],
9259 },
9260 }
9261 `)
9262
9263 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009264 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009265 var builder strings.Builder
9266 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9267 androidMk := builder.String()
9268
9269 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9270 // a thing there.
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009271 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 +00009272}
9273
Jiyong Parke3867542020-12-03 17:28:25 +09009274func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009275 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009276 apex {
9277 name: "myapex",
9278 key: "myapex.key",
9279 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009280 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009281 }
9282
9283 apex_key {
9284 name: "myapex.key",
9285 public_key: "testkey.avbpubkey",
9286 private_key: "testkey.pem",
9287 }
9288
9289 cc_library {
9290 name: "mylib",
9291 srcs: ["mylib.cpp"],
9292 system_shared_libs: [],
9293 stl: "none",
9294 apex_available: ["myapex"],
9295 shared_libs: ["mylib2"],
9296 target: {
9297 apex: {
9298 exclude_shared_libs: ["mylib2"],
9299 },
9300 },
9301 }
9302
9303 cc_library {
9304 name: "mylib2",
9305 srcs: ["mylib.cpp"],
9306 system_shared_libs: [],
9307 stl: "none",
9308 }
9309 `)
9310
9311 // Check if mylib is linked to mylib2 for the non-apex target
9312 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9313 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9314
9315 // Make sure that the link doesn't occur for the apex target
9316 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9317 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9318
9319 // It shouldn't appear in the copy cmd as well.
9320 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
9321 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9322}
9323
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009324func TestPrebuiltStubLibDep(t *testing.T) {
9325 bpBase := `
9326 apex {
9327 name: "myapex",
9328 key: "myapex.key",
9329 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009330 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009331 }
9332 apex_key {
9333 name: "myapex.key",
9334 public_key: "testkey.avbpubkey",
9335 private_key: "testkey.pem",
9336 }
9337 cc_library {
9338 name: "mylib",
9339 srcs: ["mylib.cpp"],
9340 apex_available: ["myapex"],
9341 shared_libs: ["stublib"],
9342 system_shared_libs: [],
9343 }
9344 apex {
9345 name: "otherapex",
9346 enabled: %s,
9347 key: "myapex.key",
9348 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009349 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009350 }
9351 `
9352
9353 stublibSourceBp := `
9354 cc_library {
9355 name: "stublib",
9356 srcs: ["mylib.cpp"],
9357 apex_available: ["otherapex"],
9358 system_shared_libs: [],
9359 stl: "none",
9360 stubs: {
9361 versions: ["1"],
9362 },
9363 }
9364 `
9365
9366 stublibPrebuiltBp := `
9367 cc_prebuilt_library_shared {
9368 name: "stublib",
9369 srcs: ["prebuilt.so"],
9370 apex_available: ["otherapex"],
9371 stubs: {
9372 versions: ["1"],
9373 },
9374 %s
9375 }
9376 `
9377
9378 tests := []struct {
9379 name string
9380 stublibBp string
9381 usePrebuilt bool
9382 modNames []string // Modules to collect AndroidMkEntries for
9383 otherApexEnabled []string
9384 }{
9385 {
9386 name: "only_source",
9387 stublibBp: stublibSourceBp,
9388 usePrebuilt: false,
9389 modNames: []string{"stublib"},
9390 otherApexEnabled: []string{"true", "false"},
9391 },
9392 {
9393 name: "source_preferred",
9394 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9395 usePrebuilt: false,
9396 modNames: []string{"stublib", "prebuilt_stublib"},
9397 otherApexEnabled: []string{"true", "false"},
9398 },
9399 {
9400 name: "prebuilt_preferred",
9401 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9402 usePrebuilt: true,
9403 modNames: []string{"stublib", "prebuilt_stublib"},
9404 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9405 },
9406 {
9407 name: "only_prebuilt",
9408 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9409 usePrebuilt: true,
9410 modNames: []string{"stublib"},
9411 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9412 },
9413 }
9414
9415 for _, test := range tests {
9416 t.Run(test.name, func(t *testing.T) {
9417 for _, otherApexEnabled := range test.otherApexEnabled {
9418 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009419 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009420
9421 type modAndMkEntries struct {
9422 mod *cc.Module
9423 mkEntries android.AndroidMkEntries
9424 }
9425 entries := []*modAndMkEntries{}
9426
9427 // Gather shared lib modules that are installable
9428 for _, modName := range test.modNames {
9429 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9430 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9431 continue
9432 }
9433 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009434 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009435 continue
9436 }
Colin Crossaa255532020-07-03 13:18:24 -07009437 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009438 if ent.Disabled {
9439 continue
9440 }
9441 entries = append(entries, &modAndMkEntries{
9442 mod: mod,
9443 mkEntries: ent,
9444 })
9445 }
9446 }
9447 }
9448
9449 var entry *modAndMkEntries = nil
9450 for _, ent := range entries {
9451 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9452 if entry != nil {
9453 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9454 } else {
9455 entry = ent
9456 }
9457 }
9458 }
9459
9460 if entry == nil {
9461 t.Errorf("AndroidMk entry for \"stublib\" missing")
9462 } else {
9463 isPrebuilt := entry.mod.Prebuilt() != nil
9464 if isPrebuilt != test.usePrebuilt {
9465 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9466 }
9467 if !entry.mod.IsStubs() {
9468 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9469 }
9470 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9471 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9472 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009473 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009474 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009475 if !android.InList(expected, cflags) {
9476 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9477 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009478 }
9479 })
9480 }
9481 })
9482 }
9483}
9484
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009485func TestHostApexInHostOnlyBuild(t *testing.T) {
9486 testApex(t, `
9487 apex {
9488 name: "myapex",
9489 host_supported: true,
9490 key: "myapex.key",
9491 updatable: false,
9492 payload_type: "zip",
9493 }
9494 apex_key {
9495 name: "myapex.key",
9496 public_key: "testkey.avbpubkey",
9497 private_key: "testkey.pem",
9498 }
9499 `,
9500 android.FixtureModifyConfig(func(config android.Config) {
9501 // We may not have device targets in all builds, e.g. in
9502 // prebuilts/build-tools/build-prebuilts.sh
9503 config.Targets[android.Android] = []android.Target{}
9504 }))
9505}
9506
Colin Crossc33e5212021-05-25 18:16:02 -07009507func TestApexJavaCoverage(t *testing.T) {
9508 bp := `
9509 apex {
9510 name: "myapex",
9511 key: "myapex.key",
9512 java_libs: ["mylib"],
9513 bootclasspath_fragments: ["mybootclasspathfragment"],
9514 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9515 updatable: false,
9516 }
9517
9518 apex_key {
9519 name: "myapex.key",
9520 public_key: "testkey.avbpubkey",
9521 private_key: "testkey.pem",
9522 }
9523
9524 java_library {
9525 name: "mylib",
9526 srcs: ["mylib.java"],
9527 apex_available: ["myapex"],
9528 compile_dex: true,
9529 }
9530
9531 bootclasspath_fragment {
9532 name: "mybootclasspathfragment",
9533 contents: ["mybootclasspathlib"],
9534 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009535 hidden_api: {
9536 split_packages: ["*"],
9537 },
Colin Crossc33e5212021-05-25 18:16:02 -07009538 }
9539
9540 java_library {
9541 name: "mybootclasspathlib",
9542 srcs: ["mybootclasspathlib.java"],
9543 apex_available: ["myapex"],
9544 compile_dex: true,
9545 }
9546
9547 systemserverclasspath_fragment {
9548 name: "mysystemserverclasspathfragment",
9549 contents: ["mysystemserverclasspathlib"],
9550 apex_available: ["myapex"],
9551 }
9552
9553 java_library {
9554 name: "mysystemserverclasspathlib",
9555 srcs: ["mysystemserverclasspathlib.java"],
9556 apex_available: ["myapex"],
9557 compile_dex: true,
9558 }
9559 `
9560
9561 result := android.GroupFixturePreparers(
9562 PrepareForTestWithApexBuildComponents,
9563 prepareForTestWithMyapex,
9564 java.PrepareForTestWithJavaDefaultModules,
9565 android.PrepareForTestWithAndroidBuildComponents,
9566 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009567 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9568 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009569 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009570 ).RunTest(t)
9571
9572 // Make sure jacoco ran on both mylib and mybootclasspathlib
9573 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9574 t.Errorf("Failed to find jacoco rule for mylib")
9575 }
9576 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9577 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9578 }
9579 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9580 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9581 }
9582}
9583
Jiyong Park192600a2021-08-03 07:52:17 +00009584func TestProhibitStaticExecutable(t *testing.T) {
9585 testApexError(t, `executable mybin is static`, `
9586 apex {
9587 name: "myapex",
9588 key: "myapex.key",
9589 binaries: ["mybin"],
9590 min_sdk_version: "29",
9591 }
9592
9593 apex_key {
9594 name: "myapex.key",
9595 public_key: "testkey.avbpubkey",
9596 private_key: "testkey.pem",
9597 }
9598
9599 cc_binary {
9600 name: "mybin",
9601 srcs: ["mylib.cpp"],
9602 relative_install_path: "foo/bar",
9603 static_executable: true,
9604 system_shared_libs: [],
9605 stl: "none",
9606 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009607 min_sdk_version: "29",
9608 }
9609 `)
9610
9611 testApexError(t, `executable mybin.rust is static`, `
9612 apex {
9613 name: "myapex",
9614 key: "myapex.key",
9615 binaries: ["mybin.rust"],
9616 min_sdk_version: "29",
9617 }
9618
9619 apex_key {
9620 name: "myapex.key",
9621 public_key: "testkey.avbpubkey",
9622 private_key: "testkey.pem",
9623 }
9624
9625 rust_binary {
9626 name: "mybin.rust",
9627 srcs: ["foo.rs"],
9628 static_executable: true,
9629 apex_available: ["myapex"],
9630 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009631 }
9632 `)
9633}
9634
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009635func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9636 ctx := testApex(t, `
9637 apex {
9638 name: "myapex",
9639 key: "myapex.key",
9640 updatable: false,
9641 java_libs: ["foo"],
9642 }
9643
9644 apex_key {
9645 name: "myapex.key",
9646 public_key: "testkey.avbpubkey",
9647 private_key: "testkey.pem",
9648 }
9649
9650 java_library {
9651 name: "foo",
9652 srcs: ["foo.java"],
9653 apex_available: ["myapex"],
9654 installable: true,
9655 }
9656 `,
9657 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9658 )
9659
9660 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9661 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9662 var builder strings.Builder
9663 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9664 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009665 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 +00009666}
9667
9668func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9669 ctx := testApex(t, `
9670 prebuilt_apex {
9671 name: "myapex",
9672 arch: {
9673 arm64: {
9674 src: "myapex-arm64.apex",
9675 },
9676 arm: {
9677 src: "myapex-arm.apex",
9678 },
9679 },
9680 exported_java_libs: ["foo"],
9681 }
9682
9683 java_import {
9684 name: "foo",
9685 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009686 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009687 }
9688 `,
9689 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9690 )
9691
9692 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9693 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9694 mainModuleEntries := entriesList[0]
9695 android.AssertArrayString(t,
9696 "LOCAL_REQUIRED_MODULES",
9697 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9698 []string{
9699 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9700 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9701 })
9702}
9703
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009704func TestAndroidMk_RequiredModules(t *testing.T) {
9705 ctx := testApex(t, `
9706 apex {
9707 name: "myapex",
9708 key: "myapex.key",
9709 updatable: false,
9710 java_libs: ["foo"],
9711 required: ["otherapex"],
9712 }
9713
9714 apex {
9715 name: "otherapex",
9716 key: "myapex.key",
9717 updatable: false,
9718 java_libs: ["foo"],
9719 required: ["otherapex"],
9720 }
9721
9722 apex_key {
9723 name: "myapex.key",
9724 public_key: "testkey.avbpubkey",
9725 private_key: "testkey.pem",
9726 }
9727
9728 java_library {
9729 name: "foo",
9730 srcs: ["foo.java"],
9731 apex_available: ["myapex", "otherapex"],
9732 installable: true,
9733 }
9734 `)
9735
9736 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9737 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9738 var builder strings.Builder
9739 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9740 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009741 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009742}
9743
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009744func TestAndroidMk_RequiredDeps(t *testing.T) {
9745 ctx := testApex(t, `
9746 apex {
9747 name: "myapex",
9748 key: "myapex.key",
9749 updatable: false,
9750 }
9751
9752 apex_key {
9753 name: "myapex.key",
9754 public_key: "testkey.avbpubkey",
9755 private_key: "testkey.pem",
9756 }
9757 `)
9758
9759 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009760 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009761 data := android.AndroidMkDataForTest(t, ctx, bundle)
9762 var builder strings.Builder
9763 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9764 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009765 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009766
9767 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009768 flattenedBundle.makeModulesToInstall = append(flattenedBundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009769 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9770 var flattenedBuilder strings.Builder
9771 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9772 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009773 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009774}
9775
Jooyung Hana6d36672022-02-24 13:58:07 +09009776func TestApexOutputFileProducer(t *testing.T) {
9777 for _, tc := range []struct {
9778 name string
9779 ref string
9780 expected_data []string
9781 }{
9782 {
9783 name: "test_using_output",
9784 ref: ":myapex",
9785 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9786 },
9787 {
9788 name: "test_using_apex",
9789 ref: ":myapex{.apex}",
9790 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9791 },
9792 } {
9793 t.Run(tc.name, func(t *testing.T) {
9794 ctx := testApex(t, `
9795 apex {
9796 name: "myapex",
9797 key: "myapex.key",
9798 compressible: true,
9799 updatable: false,
9800 }
9801
9802 apex_key {
9803 name: "myapex.key",
9804 public_key: "testkey.avbpubkey",
9805 private_key: "testkey.pem",
9806 }
9807
9808 java_test {
9809 name: "`+tc.name+`",
9810 srcs: ["a.java"],
9811 data: ["`+tc.ref+`"],
9812 }
9813 `,
9814 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9815 variables.CompressedApex = proptools.BoolPtr(true)
9816 }))
9817 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9818 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9819 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9820 })
9821 }
9822}
9823
satayev758968a2021-12-06 11:42:40 +00009824func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9825 preparer := android.GroupFixturePreparers(
9826 PrepareForTestWithApexBuildComponents,
9827 prepareForTestWithMyapex,
9828 java.PrepareForTestWithJavaSdkLibraryFiles,
9829 java.PrepareForTestWithJavaDefaultModules,
9830 android.PrepareForTestWithAndroidBuildComponents,
9831 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9832 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9833 )
9834
9835 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9836 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9837 preparer.RunTestWithBp(t, `
9838 apex {
9839 name: "myapex",
9840 key: "myapex.key",
9841 bootclasspath_fragments: ["mybootclasspathfragment"],
9842 min_sdk_version: "30",
9843 updatable: false,
9844 }
9845
9846 apex_key {
9847 name: "myapex.key",
9848 public_key: "testkey.avbpubkey",
9849 private_key: "testkey.pem",
9850 }
9851
9852 bootclasspath_fragment {
9853 name: "mybootclasspathfragment",
9854 contents: ["mybootclasspathlib"],
9855 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009856 hidden_api: {
9857 split_packages: ["*"],
9858 },
satayev758968a2021-12-06 11:42:40 +00009859 }
9860
9861 java_sdk_library {
9862 name: "mybootclasspathlib",
9863 srcs: ["mybootclasspathlib.java"],
9864 apex_available: ["myapex"],
9865 compile_dex: true,
9866 unsafe_ignore_missing_latest_api: true,
9867 min_sdk_version: "31",
9868 static_libs: ["util"],
9869 }
9870
9871 java_library {
9872 name: "util",
9873 srcs: ["a.java"],
9874 apex_available: ["myapex"],
9875 min_sdk_version: "31",
9876 static_libs: ["another_util"],
9877 }
9878
9879 java_library {
9880 name: "another_util",
9881 srcs: ["a.java"],
9882 min_sdk_version: "31",
9883 apex_available: ["myapex"],
9884 }
9885 `)
9886 })
9887
9888 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9889 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9890 preparer.RunTestWithBp(t, `
9891 apex {
9892 name: "myapex",
9893 key: "myapex.key",
9894 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9895 min_sdk_version: "30",
9896 updatable: false,
9897 }
9898
9899 apex_key {
9900 name: "myapex.key",
9901 public_key: "testkey.avbpubkey",
9902 private_key: "testkey.pem",
9903 }
9904
9905 systemserverclasspath_fragment {
9906 name: "mysystemserverclasspathfragment",
9907 contents: ["mysystemserverclasspathlib"],
9908 apex_available: ["myapex"],
9909 }
9910
9911 java_sdk_library {
9912 name: "mysystemserverclasspathlib",
9913 srcs: ["mysystemserverclasspathlib.java"],
9914 apex_available: ["myapex"],
9915 compile_dex: true,
9916 min_sdk_version: "32",
9917 unsafe_ignore_missing_latest_api: true,
9918 static_libs: ["util"],
9919 }
9920
9921 java_library {
9922 name: "util",
9923 srcs: ["a.java"],
9924 apex_available: ["myapex"],
9925 min_sdk_version: "31",
9926 static_libs: ["another_util"],
9927 }
9928
9929 java_library {
9930 name: "another_util",
9931 srcs: ["a.java"],
9932 min_sdk_version: "31",
9933 apex_available: ["myapex"],
9934 }
9935 `)
9936 })
9937
9938 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9939 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9940 RunTestWithBp(t, `
9941 apex {
9942 name: "myapex",
9943 key: "myapex.key",
9944 bootclasspath_fragments: ["mybootclasspathfragment"],
9945 min_sdk_version: "30",
9946 updatable: false,
9947 }
9948
9949 apex_key {
9950 name: "myapex.key",
9951 public_key: "testkey.avbpubkey",
9952 private_key: "testkey.pem",
9953 }
9954
9955 bootclasspath_fragment {
9956 name: "mybootclasspathfragment",
9957 contents: ["mybootclasspathlib"],
9958 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009959 hidden_api: {
9960 split_packages: ["*"],
9961 },
satayev758968a2021-12-06 11:42:40 +00009962 }
9963
9964 java_sdk_library {
9965 name: "mybootclasspathlib",
9966 srcs: ["mybootclasspathlib.java"],
9967 apex_available: ["myapex"],
9968 compile_dex: true,
9969 unsafe_ignore_missing_latest_api: true,
9970 }
9971 `)
9972 })
9973
9974 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9975 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9976 RunTestWithBp(t, `
9977 apex {
9978 name: "myapex",
9979 key: "myapex.key",
9980 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9981 min_sdk_version: "30",
9982 updatable: false,
9983 }
9984
9985 apex_key {
9986 name: "myapex.key",
9987 public_key: "testkey.avbpubkey",
9988 private_key: "testkey.pem",
9989 }
9990
9991 systemserverclasspath_fragment {
9992 name: "mysystemserverclasspathfragment",
9993 contents: ["mysystemserverclasspathlib"],
9994 apex_available: ["myapex"],
9995 }
9996
9997 java_sdk_library {
9998 name: "mysystemserverclasspathlib",
9999 srcs: ["mysystemserverclasspathlib.java"],
10000 apex_available: ["myapex"],
10001 compile_dex: true,
10002 unsafe_ignore_missing_latest_api: true,
10003 }
10004 `)
10005 })
10006}
10007
Jiakai Zhang6decef92022-01-12 17:56:19 +000010008// Verifies that the APEX depends on all the Make modules in the list.
10009func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10010 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10011 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010012 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010013 }
10014}
10015
10016// Verifies that the APEX does not depend on any of the Make modules in the list.
10017func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10018 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10019 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010020 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010021 }
10022}
10023
Cole Faust1021ccd2023-02-26 21:15:25 -080010024// TODO(b/193460475): Re-enable this test
10025//func TestApexStrictUpdtabilityLint(t *testing.T) {
10026// bpTemplate := `
10027// apex {
10028// name: "myapex",
10029// key: "myapex.key",
10030// java_libs: ["myjavalib"],
10031// updatable: %v,
10032// min_sdk_version: "29",
10033// }
10034// apex_key {
10035// name: "myapex.key",
10036// }
10037// java_library {
10038// name: "myjavalib",
10039// srcs: ["MyClass.java"],
10040// apex_available: [ "myapex" ],
10041// lint: {
10042// strict_updatability_linting: %v,
10043// },
10044// sdk_version: "current",
10045// min_sdk_version: "29",
10046// }
10047// `
10048// fs := android.MockFS{
10049// "lint-baseline.xml": nil,
10050// }
10051//
10052// testCases := []struct {
10053// testCaseName string
10054// apexUpdatable bool
10055// javaStrictUpdtabilityLint bool
10056// lintFileExists bool
10057// disallowedFlagExpected bool
10058// }{
10059// {
10060// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10061// apexUpdatable: true,
10062// javaStrictUpdtabilityLint: true,
10063// lintFileExists: false,
10064// disallowedFlagExpected: false,
10065// },
10066// {
10067// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10068// apexUpdatable: false,
10069// javaStrictUpdtabilityLint: false,
10070// lintFileExists: true,
10071// disallowedFlagExpected: false,
10072// },
10073// {
10074// testCaseName: "non-updatable apex respects strict updatability of javalib",
10075// apexUpdatable: false,
10076// javaStrictUpdtabilityLint: true,
10077// lintFileExists: true,
10078// disallowedFlagExpected: true,
10079// },
10080// {
10081// testCaseName: "updatable apex sets strict updatability of javalib to true",
10082// apexUpdatable: true,
10083// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10084// lintFileExists: true,
10085// disallowedFlagExpected: true,
10086// },
10087// }
10088//
10089// for _, testCase := range testCases {
10090// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10091// fixtures := []android.FixturePreparer{}
10092// if testCase.lintFileExists {
10093// fixtures = append(fixtures, fs.AddToFixture())
10094// }
10095//
10096// result := testApex(t, bp, fixtures...)
10097// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10098// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10099// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10100//
10101// if disallowedFlagActual != testCase.disallowedFlagExpected {
10102// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10103// }
10104// }
10105//}
10106//
10107//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10108// bp := `
10109// apex {
10110// name: "myapex",
10111// key: "myapex.key",
10112// java_libs: ["myjavalib"],
10113// updatable: true,
10114// min_sdk_version: "29",
10115// }
10116// apex_key {
10117// name: "myapex.key",
10118// }
10119// java_library {
10120// name: "myjavalib",
10121// srcs: ["MyClass.java"],
10122// apex_available: [ "myapex" ],
10123// sdk_version: "current",
10124// min_sdk_version: "29",
10125// }
10126// `
10127//
10128// testCases := []struct {
10129// testCaseName string
10130// moduleDirectory string
10131// disallowedFlagExpected bool
10132// }{
10133// {
10134// testCaseName: "lintable module defined outside libcore",
10135// moduleDirectory: "",
10136// disallowedFlagExpected: true,
10137// },
10138// {
10139// testCaseName: "lintable module defined in libcore root directory",
10140// moduleDirectory: "libcore/",
10141// disallowedFlagExpected: false,
10142// },
10143// {
10144// testCaseName: "lintable module defined in libcore child directory",
10145// moduleDirectory: "libcore/childdir/",
10146// disallowedFlagExpected: true,
10147// },
10148// }
10149//
10150// for _, testCase := range testCases {
10151// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10152// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10153// result := testApex(t, "", lintFileCreator, bpFileCreator)
10154// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10155// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10156// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10157// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10158//
10159// if disallowedFlagActual != testCase.disallowedFlagExpected {
10160// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10161// }
10162// }
10163//}
10164//
10165//// checks transtive deps of an apex coming from bootclasspath_fragment
10166//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10167// bp := `
10168// apex {
10169// name: "myapex",
10170// key: "myapex.key",
10171// bootclasspath_fragments: ["mybootclasspathfragment"],
10172// updatable: true,
10173// min_sdk_version: "29",
10174// }
10175// apex_key {
10176// name: "myapex.key",
10177// }
10178// bootclasspath_fragment {
10179// name: "mybootclasspathfragment",
10180// contents: ["myjavalib"],
10181// apex_available: ["myapex"],
10182// hidden_api: {
10183// split_packages: ["*"],
10184// },
10185// }
10186// java_library {
10187// name: "myjavalib",
10188// srcs: ["MyClass.java"],
10189// apex_available: [ "myapex" ],
10190// sdk_version: "current",
10191// min_sdk_version: "29",
10192// compile_dex: true,
10193// }
10194// `
10195// fs := android.MockFS{
10196// "lint-baseline.xml": nil,
10197// }
10198//
10199// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10200// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10201// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10202// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10203// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10204// }
10205//}
Spandan Das66773252022-01-15 00:23:18 +000010206
Spandan Das42e89502022-05-06 22:12:55 +000010207// updatable apexes should propagate updatable=true to its apps
10208func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10209 bp := `
10210 apex {
10211 name: "myapex",
10212 key: "myapex.key",
10213 updatable: %v,
10214 apps: [
10215 "myapp",
10216 ],
10217 min_sdk_version: "30",
10218 }
10219 apex_key {
10220 name: "myapex.key",
10221 }
10222 android_app {
10223 name: "myapp",
10224 updatable: %v,
10225 apex_available: [
10226 "myapex",
10227 ],
10228 sdk_version: "current",
10229 min_sdk_version: "30",
10230 }
10231 `
10232 testCases := []struct {
10233 name string
10234 apex_is_updatable_bp bool
10235 app_is_updatable_bp bool
10236 app_is_updatable_expected bool
10237 }{
10238 {
10239 name: "Non-updatable apex respects updatable property of non-updatable app",
10240 apex_is_updatable_bp: false,
10241 app_is_updatable_bp: false,
10242 app_is_updatable_expected: false,
10243 },
10244 {
10245 name: "Non-updatable apex respects updatable property of updatable app",
10246 apex_is_updatable_bp: false,
10247 app_is_updatable_bp: true,
10248 app_is_updatable_expected: true,
10249 },
10250 {
10251 name: "Updatable apex respects updatable property of updatable app",
10252 apex_is_updatable_bp: true,
10253 app_is_updatable_bp: true,
10254 app_is_updatable_expected: true,
10255 },
10256 {
10257 name: "Updatable apex sets updatable=true on non-updatable app",
10258 apex_is_updatable_bp: true,
10259 app_is_updatable_bp: false,
10260 app_is_updatable_expected: true,
10261 },
10262 }
10263 for _, testCase := range testCases {
10264 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10265 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10266 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10267 }
10268}
10269
Kiyoung Kim487689e2022-07-26 09:48:22 +090010270func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10271 bp := `
10272 apex {
10273 name: "myapex",
10274 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010275 native_shared_libs: ["libbaz"],
10276 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010277 min_sdk_version: "29",
10278 }
10279 apex_key {
10280 name: "myapex.key",
10281 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010282 cc_binary {
10283 name: "binfoo",
10284 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010285 apex_available: ["myapex"],
10286 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010287 recovery_available: false,
10288 }
10289 cc_library {
10290 name: "libbar",
10291 srcs: ["libbar.cc"],
10292 stubs: {
10293 symbol_file: "libbar.map.txt",
10294 versions: [
10295 "29",
10296 ],
10297 },
10298 }
10299 cc_library {
10300 name: "libbaz",
10301 srcs: ["libbaz.cc"],
10302 apex_available: ["myapex"],
10303 min_sdk_version: "29",
10304 stubs: {
10305 symbol_file: "libbaz.map.txt",
10306 versions: [
10307 "29",
10308 ],
10309 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010310 }
10311 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010312 name: "libbar",
10313 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010314 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010315 variants: ["apex.29"],
10316 }
10317 cc_api_variant {
10318 name: "libbar",
10319 variant: "apex",
10320 version: "29",
10321 src: "libbar_apex_29.so",
10322 }
10323 cc_api_library {
10324 name: "libbaz",
10325 src: "libbaz_stub.so",
10326 min_sdk_version: "29",
10327 variants: ["apex.29"],
10328 }
10329 cc_api_variant {
10330 name: "libbaz",
10331 variant: "apex",
10332 version: "29",
10333 src: "libbaz_apex_29.so",
10334 }
10335 cc_api_library {
10336 name: "libqux",
10337 src: "libqux_stub.so",
10338 min_sdk_version: "29",
10339 variants: ["apex.29"],
10340 }
10341 cc_api_variant {
10342 name: "libqux",
10343 variant: "apex",
10344 version: "29",
10345 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010346 }
10347 api_imports {
10348 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010349 apex_shared_libs: [
10350 "libbar",
10351 "libbaz",
10352 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010353 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010354 }
10355 `
10356 result := testApex(t, bp)
10357
10358 hasDep := func(m android.Module, wantDep android.Module) bool {
10359 t.Helper()
10360 var found bool
10361 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10362 if dep == wantDep {
10363 found = true
10364 }
10365 })
10366 return found
10367 }
10368
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010369 // Library defines stubs and cc_api_library should be used with cc_api_library
10370 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10371 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10372 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010373
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010374 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10375 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010376
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010377 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10378 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10379 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10380 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10381
10382 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10383 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10384 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10385 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10386 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10387
10388 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10389 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10390 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10391
10392 // cc_api_library defined without original library should be linked with cc_api_library
10393 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10394 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10395 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10396}
10397
10398func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10399 bp := `
10400 apex {
10401 name: "myapex",
10402 key: "myapex.key",
10403 native_shared_libs: ["libbar"],
10404 min_sdk_version: "29",
10405 }
10406 apex_key {
10407 name: "myapex.key",
10408 }
10409 cc_binary {
10410 name: "binfoo",
10411 shared_libs: ["libbar"],
10412 recovery_available: false,
10413 }
10414 cc_library {
10415 name: "libbar",
10416 srcs: ["libbar.cc"],
10417 apex_available: ["myapex"],
10418 min_sdk_version: "29",
10419 stubs: {
10420 symbol_file: "libbar.map.txt",
10421 versions: [
10422 "29",
10423 ],
10424 },
10425 }
10426 cc_api_library {
10427 name: "libbar",
10428 src: "libbar_stub.so",
10429 variants: ["apex.29"],
10430 }
10431 cc_api_variant {
10432 name: "libbar",
10433 variant: "apex",
10434 version: "29",
10435 src: "libbar_apex_29.so",
10436 }
10437 api_imports {
10438 name: "api_imports",
10439 apex_shared_libs: [
10440 "libbar",
10441 ],
10442 }
10443 `
10444
10445 result := testApex(t, bp)
10446
10447 hasDep := func(m android.Module, wantDep android.Module) bool {
10448 t.Helper()
10449 var found bool
10450 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10451 if dep == wantDep {
10452 found = true
10453 }
10454 })
10455 return found
10456 }
10457
10458 // Library defines stubs and cc_api_library should be used with cc_api_library
10459 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10460 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10461 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10462
10463 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10464 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10465
10466 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10467 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10468 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10469 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010470}
Dennis Shend4f5d932023-01-31 20:27:21 +000010471
10472func TestTrimmedApex(t *testing.T) {
10473 bp := `
10474 apex {
10475 name: "myapex",
10476 key: "myapex.key",
10477 native_shared_libs: ["libfoo","libbaz"],
10478 min_sdk_version: "29",
10479 trim_against: "mydcla",
10480 }
10481 apex {
10482 name: "mydcla",
10483 key: "myapex.key",
10484 native_shared_libs: ["libfoo","libbar"],
10485 min_sdk_version: "29",
10486 file_contexts: ":myapex-file_contexts",
10487 dynamic_common_lib_apex: true,
10488 }
10489 apex_key {
10490 name: "myapex.key",
10491 }
10492 cc_library {
10493 name: "libfoo",
10494 shared_libs: ["libc"],
10495 apex_available: ["myapex","mydcla"],
10496 min_sdk_version: "29",
10497 }
10498 cc_library {
10499 name: "libbar",
10500 shared_libs: ["libc"],
10501 apex_available: ["myapex","mydcla"],
10502 min_sdk_version: "29",
10503 }
10504 cc_library {
10505 name: "libbaz",
10506 shared_libs: ["libc"],
10507 apex_available: ["myapex","mydcla"],
10508 min_sdk_version: "29",
10509 }
10510 cc_api_library {
10511 name: "libc",
10512 src: "libc.so",
10513 min_sdk_version: "29",
10514 recovery_available: true,
10515 }
10516 api_imports {
10517 name: "api_imports",
10518 shared_libs: [
10519 "libc",
10520 ],
10521 header_libs: [],
10522 }
10523 `
10524 ctx := testApex(t, bp)
10525 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10526 apexRule := module.MaybeRule("apexRule")
10527 if apexRule.Rule == nil {
10528 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10529 }
10530
10531 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
10532 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
10533 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10534 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10535 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10536 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10537}
Jingwen Chendea7a642023-03-28 11:30:50 +000010538
10539func TestCannedFsConfig(t *testing.T) {
10540 ctx := testApex(t, `
10541 apex {
10542 name: "myapex",
10543 key: "myapex.key",
10544 updatable: false,
10545 }
10546
10547 apex_key {
10548 name: "myapex.key",
10549 public_key: "testkey.avbpubkey",
10550 private_key: "testkey.pem",
10551 }`)
10552 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10553 generateFsRule := mod.Rule("generateFsConfig")
10554 cmd := generateFsRule.RuleParams.Command
10555
10556 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10557}
10558
10559func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10560 ctx := testApex(t, `
10561 apex {
10562 name: "myapex",
10563 key: "myapex.key",
10564 canned_fs_config: "my_config",
10565 updatable: false,
10566 }
10567
10568 apex_key {
10569 name: "myapex.key",
10570 public_key: "testkey.avbpubkey",
10571 private_key: "testkey.pem",
10572 }`)
10573 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10574 generateFsRule := mod.Rule("generateFsConfig")
10575 cmd := generateFsRule.RuleParams.Command
10576
10577 // Ensure that canned_fs_config has "cat my_config" at the end
10578 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10579}
Spandan Das20fce2d2023-04-12 17:21:39 +000010580
10581func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10582 testCases := []struct {
10583 desc string
10584 hasStubs bool
10585 apexAvailable string
10586 expectedError string
10587 }{
10588 {
10589 desc: "non-stub library can have multiple apex_available",
10590 hasStubs: false,
10591 apexAvailable: `["myapex", "otherapex"]`,
10592 },
10593 {
10594 desc: "stub library should not be available to anyapex",
10595 hasStubs: true,
10596 apexAvailable: `["//apex_available:anyapex"]`,
10597 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10598 },
10599 {
10600 desc: "stub library should not be available to multiple apexes",
10601 hasStubs: true,
10602 apexAvailable: `["myapex", "otherapex"]`,
10603 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10604 },
10605 {
10606 desc: "stub library can be available to a core apex and a test apex",
10607 hasStubs: true,
10608 apexAvailable: `["myapex", "test_myapex"]`,
10609 },
10610 }
10611 bpTemplate := `
10612 cc_library {
10613 name: "libfoo",
10614 %v
10615 apex_available: %v,
10616 }
10617 apex {
10618 name: "myapex",
10619 key: "apex.key",
10620 updatable: false,
10621 native_shared_libs: ["libfoo"],
10622 }
10623 apex {
10624 name: "otherapex",
10625 key: "apex.key",
10626 updatable: false,
10627 }
10628 apex_test {
10629 name: "test_myapex",
10630 key: "apex.key",
10631 updatable: false,
10632 native_shared_libs: ["libfoo"],
10633 }
10634 apex_key {
10635 name: "apex.key",
10636 }
10637 `
10638 for _, tc := range testCases {
10639 stubs := ""
10640 if tc.hasStubs {
10641 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10642 }
10643 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10644 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10645 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10646 })
10647 if tc.expectedError == "" {
10648 testApex(t, bp, mockFsFixturePreparer)
10649 } else {
10650 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10651 }
10652 }
10653}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010654
10655func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10656 context := android.GroupFixturePreparers(
10657 android.PrepareForIntegrationTestWithAndroid,
10658 cc.PrepareForIntegrationTestWithCc,
10659 PrepareForTestWithApexBuildComponents,
10660 prepareForTestWithMyapex,
10661 filesystem.PrepareForTestWithFilesystemBuildComponents,
10662 )
10663 result := context.RunTestWithBp(t, `
10664 android_system_image {
10665 name: "myfilesystem",
10666 deps: [
10667 "libfoo",
10668 ],
10669 linker_config_src: "linker.config.json",
10670 }
10671
10672 cc_library {
10673 name: "libfoo",
10674 shared_libs: [
10675 "libbar",
10676 ],
10677 stl: "none",
10678 }
10679
10680 cc_library {
10681 name: "libbar",
10682 stl: "none",
10683 apex_available: ["myapex"],
10684 }
10685
10686 apex {
10687 name: "myapex",
10688 native_shared_libs: ["libbar"],
10689 key: "myapex.key",
10690 updatable: false,
10691 }
10692
10693 apex_key {
10694 name: "myapex.key",
10695 public_key: "testkey.avbpubkey",
10696 private_key: "testkey.pem",
10697 }
10698 `)
10699
10700 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10701 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10702 inputs.Strings(),
10703 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10704}