blob: c1d80a39f229a13e756875a9854ce486b0bd19a9 [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,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100150 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000151 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 },
Spandan Das4de7b492023-05-05 21:13:01 +00001502 apex_available: [
1503 "//apex_available:anyapex",
1504 "//apex_available:platform",
1505 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001506 } `)
1507 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001508
1509 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1510 "lib64/bionic/libc.so",
1511 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1512 })
1513
Colin Cross4c4c1be2022-02-10 11:41:18 -08001514 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001515
1516 installed := hwasan.Description("install libclang_rt.hwasan")
1517 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1518
1519 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1520 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1521 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1522}
1523
1524func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001525 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001526 prepareForTestOfRuntimeApexWithHwasan,
1527 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1528 variables.SanitizeDevice = []string{"hwaddress"}
1529 }),
1530 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001531 cc_library {
1532 name: "libc",
1533 no_libcrt: true,
1534 nocrt: true,
1535 stl: "none",
1536 system_shared_libs: [],
1537 stubs: { versions: ["1"] },
1538 apex_available: ["com.android.runtime"],
1539 }
1540
1541 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001542 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001543 no_libcrt: true,
1544 nocrt: true,
1545 stl: "none",
1546 system_shared_libs: [],
1547 srcs: [""],
1548 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001549 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001550
1551 sanitize: {
1552 never: true,
1553 },
Spandan Das4de7b492023-05-05 21:13:01 +00001554 apex_available: [
1555 "//apex_available:anyapex",
1556 "//apex_available:platform",
1557 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001558 }
Paul Duffina02cae32021-03-09 01:44:06 +00001559 `)
1560 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001561
1562 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1563 "lib64/bionic/libc.so",
1564 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1565 })
1566
Colin Cross4c4c1be2022-02-10 11:41:18 -08001567 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001568
1569 installed := hwasan.Description("install libclang_rt.hwasan")
1570 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1571
1572 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1573 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1574 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1575}
1576
Jooyung Han61b66e92020-03-21 14:21:46 +00001577func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1578 testcases := []struct {
1579 name string
1580 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001581 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001582 shouldLink string
1583 shouldNotLink []string
1584 }{
1585 {
Jiyong Park55549df2021-02-26 23:57:23 +09001586 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001587 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001588 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001589 shouldLink: "current",
1590 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001591 },
1592 {
Jiyong Park55549df2021-02-26 23:57:23 +09001593 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001594 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001595 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001596 shouldLink: "current",
1597 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001598 },
1599 }
1600 for _, tc := range testcases {
1601 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001602 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001603 apex {
1604 name: "myapex",
1605 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001606 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001607 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001608 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001609 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001610
Jooyung Han61b66e92020-03-21 14:21:46 +00001611 apex_key {
1612 name: "myapex.key",
1613 public_key: "testkey.avbpubkey",
1614 private_key: "testkey.pem",
1615 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001616
Jooyung Han61b66e92020-03-21 14:21:46 +00001617 cc_library {
1618 name: "mylib",
1619 srcs: ["mylib.cpp"],
1620 vendor_available: true,
1621 shared_libs: ["libbar"],
1622 system_shared_libs: [],
1623 stl: "none",
1624 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001625 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001626 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001627
Jooyung Han61b66e92020-03-21 14:21:46 +00001628 cc_library {
1629 name: "libbar",
1630 srcs: ["mylib.cpp"],
1631 system_shared_libs: [],
1632 stl: "none",
1633 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001634 llndk: {
1635 symbol_file: "libbar.map.txt",
1636 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001637 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001638 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001639 withUnbundledBuild,
1640 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001641
Jooyung Han61b66e92020-03-21 14:21:46 +00001642 // Ensure that LLNDK dep is not included
1643 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1644 "lib64/mylib.so",
1645 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001646
Jooyung Han61b66e92020-03-21 14:21:46 +00001647 // Ensure that LLNDK dep is required
1648 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1649 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1650 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001651
Steven Moreland2c4000c2021-04-27 02:08:49 +00001652 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1653 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001654 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001655 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001656 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001657
Steven Moreland2c4000c2021-04-27 02:08:49 +00001658 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001659 ver := tc.shouldLink
1660 if tc.shouldLink == "current" {
1661 ver = strconv.Itoa(android.FutureApiLevelInt)
1662 }
1663 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001664 })
1665 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001666}
1667
Jiyong Park25fc6a92018-11-18 18:02:45 +09001668func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001669 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001670 apex {
1671 name: "myapex",
1672 key: "myapex.key",
1673 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001674 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001675 }
1676
1677 apex_key {
1678 name: "myapex.key",
1679 public_key: "testkey.avbpubkey",
1680 private_key: "testkey.pem",
1681 }
1682
1683 cc_library {
1684 name: "mylib",
1685 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001686 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001687 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_shared {
1693 name: "mylib_shared",
1694 srcs: ["mylib.cpp"],
1695 shared_libs: ["libdl#27"],
1696 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001697 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001698 }
1699
1700 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001701 name: "libBootstrap",
1702 srcs: ["mylib.cpp"],
1703 stl: "none",
1704 bootstrap: true,
1705 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001706 `)
1707
Sundong Ahnabb64432019-10-22 13:58:29 +09001708 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001709 copyCmds := apexRule.Args["copy_commands"]
1710
1711 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001712 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001713 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1714 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001715
1716 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001717 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001718
Colin Crossaede88c2020-08-11 12:17:01 -07001719 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1720 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1721 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001722
1723 // For dependency to libc
1724 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001725 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001726 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001727 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001728 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001729 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1730 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001731
1732 // For dependency to libm
1733 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001734 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001735 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001736 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001737 // ... and is not compiling with the stub
1738 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1739 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1740
1741 // For dependency to libdl
1742 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001743 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001744 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001745 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1746 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001747 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001748 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001749 // ... Cflags from stub is correctly exported to mylib
1750 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1751 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001752
1753 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001754 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1755 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1756 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1757 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001758}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001759
Jooyung Han749dc692020-04-15 11:03:39 +09001760func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001761 // there are three links between liba --> libz.
1762 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001763 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001764 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001765 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001766 apex {
1767 name: "myapex",
1768 key: "myapex.key",
1769 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001770 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001771 }
1772
1773 apex {
1774 name: "otherapex",
1775 key: "myapex.key",
1776 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001777 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001778 }
1779
1780 apex_key {
1781 name: "myapex.key",
1782 public_key: "testkey.avbpubkey",
1783 private_key: "testkey.pem",
1784 }
1785
1786 cc_library {
1787 name: "libx",
1788 shared_libs: ["liba"],
1789 system_shared_libs: [],
1790 stl: "none",
1791 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001792 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001793 }
1794
1795 cc_library {
1796 name: "liby",
1797 shared_libs: ["liba"],
1798 system_shared_libs: [],
1799 stl: "none",
1800 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001801 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001802 }
1803
1804 cc_library {
1805 name: "liba",
1806 shared_libs: ["libz"],
1807 system_shared_libs: [],
1808 stl: "none",
1809 apex_available: [
1810 "//apex_available:anyapex",
1811 "//apex_available:platform",
1812 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001813 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001814 }
1815
1816 cc_library {
1817 name: "libz",
1818 system_shared_libs: [],
1819 stl: "none",
1820 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001821 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001822 },
1823 }
Jooyung Han749dc692020-04-15 11:03:39 +09001824 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001825
1826 expectLink := func(from, from_variant, to, to_variant string) {
1827 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1828 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1829 }
1830 expectNoLink := func(from, from_variant, to, to_variant string) {
1831 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1832 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1833 }
1834 // platform liba is linked to non-stub version
1835 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001836 // liba in myapex is linked to current
1837 expectLink("liba", "shared_apex29", "libz", "shared_current")
1838 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001839 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001840 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001841 // liba in otherapex is linked to current
1842 expectLink("liba", "shared_apex30", "libz", "shared_current")
1843 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001844 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1845 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001846}
1847
Jooyung Hanaed150d2020-04-02 01:41:41 +09001848func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001849 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001850 apex {
1851 name: "myapex",
1852 key: "myapex.key",
1853 native_shared_libs: ["libx"],
1854 min_sdk_version: "R",
1855 }
1856
1857 apex_key {
1858 name: "myapex.key",
1859 public_key: "testkey.avbpubkey",
1860 private_key: "testkey.pem",
1861 }
1862
1863 cc_library {
1864 name: "libx",
1865 shared_libs: ["libz"],
1866 system_shared_libs: [],
1867 stl: "none",
1868 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001869 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001870 }
1871
1872 cc_library {
1873 name: "libz",
1874 system_shared_libs: [],
1875 stl: "none",
1876 stubs: {
1877 versions: ["29", "R"],
1878 },
1879 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001880 `,
1881 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1882 variables.Platform_version_active_codenames = []string{"R"}
1883 }),
1884 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001885
1886 expectLink := func(from, from_variant, to, to_variant string) {
1887 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1888 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1889 }
1890 expectNoLink := func(from, from_variant, to, to_variant string) {
1891 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1892 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1893 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001894 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1895 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001896 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1897 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001898}
1899
Jooyung Han4c4da062021-06-23 10:23:16 +09001900func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1901 testApex(t, `
1902 apex {
1903 name: "myapex",
1904 key: "myapex.key",
1905 java_libs: ["libx"],
1906 min_sdk_version: "S",
1907 }
1908
1909 apex_key {
1910 name: "myapex.key",
1911 public_key: "testkey.avbpubkey",
1912 private_key: "testkey.pem",
1913 }
1914
1915 java_library {
1916 name: "libx",
1917 srcs: ["a.java"],
1918 apex_available: [ "myapex" ],
1919 sdk_version: "current",
1920 min_sdk_version: "S", // should be okay
1921 }
1922 `,
1923 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1924 variables.Platform_version_active_codenames = []string{"S"}
1925 variables.Platform_sdk_codename = proptools.StringPtr("S")
1926 }),
1927 )
1928}
1929
Jooyung Han749dc692020-04-15 11:03:39 +09001930func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001931 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001932 apex {
1933 name: "myapex",
1934 key: "myapex.key",
1935 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001936 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001937 }
1938
1939 apex_key {
1940 name: "myapex.key",
1941 public_key: "testkey.avbpubkey",
1942 private_key: "testkey.pem",
1943 }
1944
1945 cc_library {
1946 name: "libx",
1947 shared_libs: ["libz"],
1948 system_shared_libs: [],
1949 stl: "none",
1950 apex_available: [ "myapex" ],
1951 }
1952
1953 cc_library {
1954 name: "libz",
1955 system_shared_libs: [],
1956 stl: "none",
1957 stubs: {
1958 versions: ["1", "2"],
1959 },
1960 }
1961 `)
1962
1963 expectLink := func(from, from_variant, to, to_variant string) {
1964 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1965 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1966 }
1967 expectNoLink := func(from, from_variant, to, to_variant string) {
1968 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1969 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1970 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001971 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001972 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001973 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001974 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001975}
1976
Jooyung Handfc864c2023-03-20 18:19:07 +09001977func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001978 ctx := testApex(t, `
1979 apex {
1980 name: "myapex",
1981 key: "myapex.key",
1982 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001983 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001984 vendor: true,
1985 min_sdk_version: "29",
1986 }
1987
1988 apex_key {
1989 name: "myapex.key",
1990 public_key: "testkey.avbpubkey",
1991 private_key: "testkey.pem",
1992 }
1993
1994 cc_library {
1995 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001996 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001997 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001998 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001999 shared_libs: ["libbar"],
2000 }
2001
2002 cc_library {
2003 name: "libbar",
2004 stubs: { versions: ["29", "30"] },
2005 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002006 }
2007 `)
2008
2009 vendorVariant := "android_vendor.29_arm64_armv8-a"
2010
Jooyung Handfc864c2023-03-20 18:19:07 +09002011 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
2012
2013 // Ensure that mylib links with "current" LLNDK
2014 libFlags := names(mylib.Rule("ld").Args["libFlags"])
2015 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
2016
2017 // Ensure that mylib is targeting 29
2018 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2019 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2020
2021 // Ensure that the correct variant of crtbegin_so is used.
2022 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2023 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002024
2025 // Ensure that the crtbegin_so used by the APEX is targeting 29
2026 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2027 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2028}
2029
Jooyung Han4495f842023-04-25 16:39:59 +09002030func TestTrackAllowedDeps(t *testing.T) {
2031 ctx := testApex(t, `
2032 apex {
2033 name: "myapex",
2034 key: "myapex.key",
2035 updatable: true,
2036 native_shared_libs: [
2037 "mylib",
2038 "yourlib",
2039 ],
2040 min_sdk_version: "29",
2041 }
2042
2043 apex {
2044 name: "myapex2",
2045 key: "myapex.key",
2046 updatable: false,
2047 native_shared_libs: ["yourlib"],
2048 }
2049
2050 apex_key {
2051 name: "myapex.key",
2052 public_key: "testkey.avbpubkey",
2053 private_key: "testkey.pem",
2054 }
2055
2056 cc_library {
2057 name: "mylib",
2058 srcs: ["mylib.cpp"],
2059 shared_libs: ["libbar"],
2060 min_sdk_version: "29",
2061 apex_available: ["myapex"],
2062 }
2063
2064 cc_library {
2065 name: "libbar",
2066 stubs: { versions: ["29", "30"] },
2067 }
2068
2069 cc_library {
2070 name: "yourlib",
2071 srcs: ["mylib.cpp"],
2072 min_sdk_version: "29",
2073 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2074 }
2075 `, withFiles(android.MockFS{
2076 "packages/modules/common/build/allowed_deps.txt": nil,
2077 }))
2078
2079 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2080 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2081 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2082 "out/soong/.intermediates/myapex/android_common_myapex_image/depsinfo/flatlist.txt")
2083 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2084 "out/soong/.intermediates/myapex2/android_common_myapex2_image/depsinfo/flatlist.txt")
2085
2086 myapex := ctx.ModuleForTests("myapex", "android_common_myapex_image")
2087 flatlist := strings.Split(myapex.Output("depsinfo/flatlist.txt").BuildParams.Args["content"], "\\n")
2088 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2089 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2090 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2091 flatlist, "mylib:(minSdkVersion:29)")
2092 android.AssertStringListContains(t, "track platform-available lib",
2093 flatlist, "yourlib(minSdkVersion:29)")
2094}
2095
2096func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2097 ctx := testApex(t, `
2098 apex {
2099 name: "myapex",
2100 key: "myapex.key",
2101 updatable: true,
2102 min_sdk_version: "29",
2103 }
2104
2105 apex_key {
2106 name: "myapex.key",
2107 public_key: "testkey.avbpubkey",
2108 private_key: "testkey.pem",
2109 }
2110 `)
2111 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2112 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2113 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2114 }
2115}
2116
Jooyung Han03b51852020-02-26 22:45:42 +09002117func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002118 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002119 apex {
2120 name: "myapex",
2121 key: "myapex.key",
2122 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002123 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002124 }
2125
2126 apex_key {
2127 name: "myapex.key",
2128 public_key: "testkey.avbpubkey",
2129 private_key: "testkey.pem",
2130 }
2131
2132 cc_library {
2133 name: "libx",
2134 system_shared_libs: [],
2135 stl: "none",
2136 apex_available: [ "myapex" ],
2137 stubs: {
2138 versions: ["1", "2"],
2139 },
2140 }
2141
2142 cc_library {
2143 name: "libz",
2144 shared_libs: ["libx"],
2145 system_shared_libs: [],
2146 stl: "none",
2147 }
2148 `)
2149
2150 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002151 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002152 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2153 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2154 }
2155 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002156 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002157 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2158 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2159 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002160 expectLink("libz", "shared", "libx", "shared_current")
2161 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002162 expectNoLink("libz", "shared", "libz", "shared_1")
2163 expectNoLink("libz", "shared", "libz", "shared")
2164}
2165
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002166var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2167 func(variables android.FixtureProductVariables) {
2168 variables.SanitizeDevice = []string{"hwaddress"}
2169 },
2170)
2171
Jooyung Han75568392020-03-20 04:29:24 +09002172func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002173 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002174 apex {
2175 name: "myapex",
2176 key: "myapex.key",
2177 native_shared_libs: ["libx"],
2178 min_sdk_version: "29",
2179 }
2180
2181 apex_key {
2182 name: "myapex.key",
2183 public_key: "testkey.avbpubkey",
2184 private_key: "testkey.pem",
2185 }
2186
2187 cc_library {
2188 name: "libx",
2189 shared_libs: ["libbar"],
2190 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002191 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002192 }
2193
2194 cc_library {
2195 name: "libbar",
2196 stubs: {
2197 versions: ["29", "30"],
2198 },
2199 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002200 `,
2201 prepareForTestWithSantitizeHwaddress,
2202 )
Jooyung Han03b51852020-02-26 22:45:42 +09002203 expectLink := func(from, from_variant, to, to_variant string) {
2204 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2205 libFlags := ld.Args["libFlags"]
2206 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2207 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002208 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002209}
2210
Jooyung Han75568392020-03-20 04:29:24 +09002211func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002212 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002213 apex {
2214 name: "myapex",
2215 key: "myapex.key",
2216 native_shared_libs: ["libx"],
2217 min_sdk_version: "29",
2218 }
2219
2220 apex_key {
2221 name: "myapex.key",
2222 public_key: "testkey.avbpubkey",
2223 private_key: "testkey.pem",
2224 }
2225
2226 cc_library {
2227 name: "libx",
2228 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002229 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002230 }
Jooyung Han75568392020-03-20 04:29:24 +09002231 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002232
2233 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002234 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002235 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002236 // note that platform variant is not.
2237 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002238 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002239}
2240
Jooyung Han749dc692020-04-15 11:03:39 +09002241func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2242 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002243 apex {
2244 name: "myapex",
2245 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002246 native_shared_libs: ["mylib"],
2247 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002248 }
2249
2250 apex_key {
2251 name: "myapex.key",
2252 public_key: "testkey.avbpubkey",
2253 private_key: "testkey.pem",
2254 }
Jooyung Han749dc692020-04-15 11:03:39 +09002255
2256 cc_library {
2257 name: "mylib",
2258 srcs: ["mylib.cpp"],
2259 system_shared_libs: [],
2260 stl: "none",
2261 apex_available: [
2262 "myapex",
2263 ],
2264 min_sdk_version: "30",
2265 }
2266 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002267
2268 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2269 apex {
2270 name: "myapex",
2271 key: "myapex.key",
2272 native_shared_libs: ["libfoo.ffi"],
2273 min_sdk_version: "29",
2274 }
2275
2276 apex_key {
2277 name: "myapex.key",
2278 public_key: "testkey.avbpubkey",
2279 private_key: "testkey.pem",
2280 }
2281
2282 rust_ffi_shared {
2283 name: "libfoo.ffi",
2284 srcs: ["foo.rs"],
2285 crate_name: "foo",
2286 apex_available: [
2287 "myapex",
2288 ],
2289 min_sdk_version: "30",
2290 }
2291 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002292
2293 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2294 apex {
2295 name: "myapex",
2296 key: "myapex.key",
2297 java_libs: ["libfoo"],
2298 min_sdk_version: "29",
2299 }
2300
2301 apex_key {
2302 name: "myapex.key",
2303 public_key: "testkey.avbpubkey",
2304 private_key: "testkey.pem",
2305 }
2306
2307 java_import {
2308 name: "libfoo",
2309 jars: ["libfoo.jar"],
2310 apex_available: [
2311 "myapex",
2312 ],
2313 min_sdk_version: "30",
2314 }
2315 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002316
2317 // Skip check for modules compiling against core API surface
2318 testApex(t, `
2319 apex {
2320 name: "myapex",
2321 key: "myapex.key",
2322 java_libs: ["libfoo"],
2323 min_sdk_version: "29",
2324 }
2325
2326 apex_key {
2327 name: "myapex.key",
2328 public_key: "testkey.avbpubkey",
2329 private_key: "testkey.pem",
2330 }
2331
2332 java_library {
2333 name: "libfoo",
2334 srcs: ["Foo.java"],
2335 apex_available: [
2336 "myapex",
2337 ],
2338 // Compile against core API surface
2339 sdk_version: "core_current",
2340 min_sdk_version: "30",
2341 }
2342 `)
2343
Jooyung Han749dc692020-04-15 11:03:39 +09002344}
2345
2346func TestApexMinSdkVersion_Okay(t *testing.T) {
2347 testApex(t, `
2348 apex {
2349 name: "myapex",
2350 key: "myapex.key",
2351 native_shared_libs: ["libfoo"],
2352 java_libs: ["libbar"],
2353 min_sdk_version: "29",
2354 }
2355
2356 apex_key {
2357 name: "myapex.key",
2358 public_key: "testkey.avbpubkey",
2359 private_key: "testkey.pem",
2360 }
2361
2362 cc_library {
2363 name: "libfoo",
2364 srcs: ["mylib.cpp"],
2365 shared_libs: ["libfoo_dep"],
2366 apex_available: ["myapex"],
2367 min_sdk_version: "29",
2368 }
2369
2370 cc_library {
2371 name: "libfoo_dep",
2372 srcs: ["mylib.cpp"],
2373 apex_available: ["myapex"],
2374 min_sdk_version: "29",
2375 }
2376
2377 java_library {
2378 name: "libbar",
2379 sdk_version: "current",
2380 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002381 static_libs: [
2382 "libbar_dep",
2383 "libbar_import_dep",
2384 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002385 apex_available: ["myapex"],
2386 min_sdk_version: "29",
2387 }
2388
2389 java_library {
2390 name: "libbar_dep",
2391 sdk_version: "current",
2392 srcs: ["a.java"],
2393 apex_available: ["myapex"],
2394 min_sdk_version: "29",
2395 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002396
2397 java_import {
2398 name: "libbar_import_dep",
2399 jars: ["libbar.jar"],
2400 apex_available: ["myapex"],
2401 min_sdk_version: "29",
2402 }
Jooyung Han03b51852020-02-26 22:45:42 +09002403 `)
2404}
2405
Colin Cross8ca61c12022-10-06 21:00:14 -07002406func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2407 // Tests that an apex dependency with min_sdk_version higher than the
2408 // min_sdk_version of the apex is allowed as long as the dependency's
2409 // min_sdk_version is less than or equal to the api level that the
2410 // architecture was introduced in. In this case, arm64 didn't exist
2411 // until api level 21, so the arm64 code will never need to run on
2412 // an api level 20 device, even if other architectures of the apex
2413 // will.
2414 testApex(t, `
2415 apex {
2416 name: "myapex",
2417 key: "myapex.key",
2418 native_shared_libs: ["libfoo"],
2419 min_sdk_version: "20",
2420 }
2421
2422 apex_key {
2423 name: "myapex.key",
2424 public_key: "testkey.avbpubkey",
2425 private_key: "testkey.pem",
2426 }
2427
2428 cc_library {
2429 name: "libfoo",
2430 srcs: ["mylib.cpp"],
2431 apex_available: ["myapex"],
2432 min_sdk_version: "21",
2433 stl: "none",
2434 }
2435 `)
2436}
2437
Artur Satayev8cf899a2020-04-15 17:29:42 +01002438func TestJavaStableSdkVersion(t *testing.T) {
2439 testCases := []struct {
2440 name string
2441 expectedError string
2442 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002443 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002444 }{
2445 {
2446 name: "Non-updatable apex with non-stable dep",
2447 bp: `
2448 apex {
2449 name: "myapex",
2450 java_libs: ["myjar"],
2451 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002452 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002453 }
2454 apex_key {
2455 name: "myapex.key",
2456 public_key: "testkey.avbpubkey",
2457 private_key: "testkey.pem",
2458 }
2459 java_library {
2460 name: "myjar",
2461 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002462 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002463 apex_available: ["myapex"],
2464 }
2465 `,
2466 },
2467 {
2468 name: "Updatable apex with stable dep",
2469 bp: `
2470 apex {
2471 name: "myapex",
2472 java_libs: ["myjar"],
2473 key: "myapex.key",
2474 updatable: true,
2475 min_sdk_version: "29",
2476 }
2477 apex_key {
2478 name: "myapex.key",
2479 public_key: "testkey.avbpubkey",
2480 private_key: "testkey.pem",
2481 }
2482 java_library {
2483 name: "myjar",
2484 srcs: ["foo/bar/MyClass.java"],
2485 sdk_version: "current",
2486 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002487 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002488 }
2489 `,
2490 },
2491 {
2492 name: "Updatable apex with non-stable dep",
2493 expectedError: "cannot depend on \"myjar\"",
2494 bp: `
2495 apex {
2496 name: "myapex",
2497 java_libs: ["myjar"],
2498 key: "myapex.key",
2499 updatable: true,
2500 }
2501 apex_key {
2502 name: "myapex.key",
2503 public_key: "testkey.avbpubkey",
2504 private_key: "testkey.pem",
2505 }
2506 java_library {
2507 name: "myjar",
2508 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002509 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002510 apex_available: ["myapex"],
2511 }
2512 `,
2513 },
2514 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002515 name: "Updatable apex with non-stable legacy core platform dep",
2516 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2517 bp: `
2518 apex {
2519 name: "myapex",
2520 java_libs: ["myjar-uses-legacy"],
2521 key: "myapex.key",
2522 updatable: true,
2523 }
2524 apex_key {
2525 name: "myapex.key",
2526 public_key: "testkey.avbpubkey",
2527 private_key: "testkey.pem",
2528 }
2529 java_library {
2530 name: "myjar-uses-legacy",
2531 srcs: ["foo/bar/MyClass.java"],
2532 sdk_version: "core_platform",
2533 apex_available: ["myapex"],
2534 }
2535 `,
2536 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2537 },
2538 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002539 name: "Updatable apex with non-stable transitive dep",
2540 // This is not actually detecting that the transitive dependency is unstable, rather it is
2541 // detecting that the transitive dependency is building against a wider API surface than the
2542 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002543 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002544 bp: `
2545 apex {
2546 name: "myapex",
2547 java_libs: ["myjar"],
2548 key: "myapex.key",
2549 updatable: true,
2550 }
2551 apex_key {
2552 name: "myapex.key",
2553 public_key: "testkey.avbpubkey",
2554 private_key: "testkey.pem",
2555 }
2556 java_library {
2557 name: "myjar",
2558 srcs: ["foo/bar/MyClass.java"],
2559 sdk_version: "current",
2560 apex_available: ["myapex"],
2561 static_libs: ["transitive-jar"],
2562 }
2563 java_library {
2564 name: "transitive-jar",
2565 srcs: ["foo/bar/MyClass.java"],
2566 sdk_version: "core_platform",
2567 apex_available: ["myapex"],
2568 }
2569 `,
2570 },
2571 }
2572
2573 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002574 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2575 continue
2576 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002577 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002578 errorHandler := android.FixtureExpectsNoErrors
2579 if test.expectedError != "" {
2580 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002581 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002582 android.GroupFixturePreparers(
2583 java.PrepareForTestWithJavaDefaultModules,
2584 PrepareForTestWithApexBuildComponents,
2585 prepareForTestWithMyapex,
2586 android.OptionalFixturePreparer(test.preparer),
2587 ).
2588 ExtendWithErrorHandler(errorHandler).
2589 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002590 })
2591 }
2592}
2593
Jooyung Han749dc692020-04-15 11:03:39 +09002594func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2595 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2596 apex {
2597 name: "myapex",
2598 key: "myapex.key",
2599 native_shared_libs: ["mylib"],
2600 min_sdk_version: "29",
2601 }
2602
2603 apex_key {
2604 name: "myapex.key",
2605 public_key: "testkey.avbpubkey",
2606 private_key: "testkey.pem",
2607 }
2608
2609 cc_library {
2610 name: "mylib",
2611 srcs: ["mylib.cpp"],
2612 shared_libs: ["mylib2"],
2613 system_shared_libs: [],
2614 stl: "none",
2615 apex_available: [
2616 "myapex",
2617 ],
2618 min_sdk_version: "29",
2619 }
2620
2621 // indirect part of the apex
2622 cc_library {
2623 name: "mylib2",
2624 srcs: ["mylib.cpp"],
2625 system_shared_libs: [],
2626 stl: "none",
2627 apex_available: [
2628 "myapex",
2629 ],
2630 min_sdk_version: "30",
2631 }
2632 `)
2633}
2634
2635func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2636 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2637 apex {
2638 name: "myapex",
2639 key: "myapex.key",
2640 apps: ["AppFoo"],
2641 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002642 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002643 }
2644
2645 apex_key {
2646 name: "myapex.key",
2647 public_key: "testkey.avbpubkey",
2648 private_key: "testkey.pem",
2649 }
2650
2651 android_app {
2652 name: "AppFoo",
2653 srcs: ["foo/bar/MyClass.java"],
2654 sdk_version: "current",
2655 min_sdk_version: "29",
2656 system_modules: "none",
2657 stl: "none",
2658 static_libs: ["bar"],
2659 apex_available: [ "myapex" ],
2660 }
2661
2662 java_library {
2663 name: "bar",
2664 sdk_version: "current",
2665 srcs: ["a.java"],
2666 apex_available: [ "myapex" ],
2667 }
2668 `)
2669}
2670
2671func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002672 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002673 apex {
2674 name: "myapex",
2675 key: "myapex.key",
2676 native_shared_libs: ["mylib"],
2677 min_sdk_version: "29",
2678 }
2679
2680 apex_key {
2681 name: "myapex.key",
2682 public_key: "testkey.avbpubkey",
2683 private_key: "testkey.pem",
2684 }
2685
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002686 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002687 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2688 cc_library {
2689 name: "mylib",
2690 srcs: ["mylib.cpp"],
2691 shared_libs: ["mylib2"],
2692 system_shared_libs: [],
2693 stl: "none",
2694 apex_available: ["myapex", "otherapex"],
2695 min_sdk_version: "29",
2696 }
2697
2698 cc_library {
2699 name: "mylib2",
2700 srcs: ["mylib.cpp"],
2701 system_shared_libs: [],
2702 stl: "none",
2703 apex_available: ["otherapex"],
2704 stubs: { versions: ["29", "30"] },
2705 min_sdk_version: "30",
2706 }
2707
2708 apex {
2709 name: "otherapex",
2710 key: "myapex.key",
2711 native_shared_libs: ["mylib", "mylib2"],
2712 min_sdk_version: "30",
2713 }
2714 `)
2715 expectLink := func(from, from_variant, to, to_variant string) {
2716 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2717 libFlags := ld.Args["libFlags"]
2718 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2719 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002720 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002721 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002722}
2723
Jooyung Haned124c32021-01-26 11:43:46 +09002724func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002725 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2726 func(variables android.FixtureProductVariables) {
2727 variables.Platform_sdk_codename = proptools.StringPtr("S")
2728 variables.Platform_version_active_codenames = []string{"S"}
2729 },
2730 )
Jooyung Haned124c32021-01-26 11:43:46 +09002731 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2732 apex {
2733 name: "myapex",
2734 key: "myapex.key",
2735 native_shared_libs: ["libfoo"],
2736 min_sdk_version: "S",
2737 }
2738 apex_key {
2739 name: "myapex.key",
2740 public_key: "testkey.avbpubkey",
2741 private_key: "testkey.pem",
2742 }
2743 cc_library {
2744 name: "libfoo",
2745 shared_libs: ["libbar"],
2746 apex_available: ["myapex"],
2747 min_sdk_version: "29",
2748 }
2749 cc_library {
2750 name: "libbar",
2751 apex_available: ["myapex"],
2752 }
2753 `, withSAsActiveCodeNames)
2754}
2755
2756func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002757 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2758 variables.Platform_sdk_codename = proptools.StringPtr("S")
2759 variables.Platform_version_active_codenames = []string{"S", "T"}
2760 })
Colin Cross1c460562021-02-16 17:55:47 -08002761 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002762 apex {
2763 name: "myapex",
2764 key: "myapex.key",
2765 native_shared_libs: ["libfoo"],
2766 min_sdk_version: "S",
2767 }
2768 apex_key {
2769 name: "myapex.key",
2770 public_key: "testkey.avbpubkey",
2771 private_key: "testkey.pem",
2772 }
2773 cc_library {
2774 name: "libfoo",
2775 shared_libs: ["libbar"],
2776 apex_available: ["myapex"],
2777 min_sdk_version: "S",
2778 }
2779 cc_library {
2780 name: "libbar",
2781 stubs: {
2782 symbol_file: "libbar.map.txt",
2783 versions: ["30", "S", "T"],
2784 },
2785 }
2786 `, withSAsActiveCodeNames)
2787
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002788 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002789 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2790 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002791 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002792}
2793
Jiyong Park7c2ee712018-12-07 00:42:25 +09002794func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002795 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002796 apex {
2797 name: "myapex",
2798 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002799 native_shared_libs: ["mylib"],
2800 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002801 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002802 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002803 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002804 }
2805
2806 apex_key {
2807 name: "myapex.key",
2808 public_key: "testkey.avbpubkey",
2809 private_key: "testkey.pem",
2810 }
2811
2812 prebuilt_etc {
2813 name: "myetc",
2814 src: "myprebuilt",
2815 sub_dir: "foo/bar",
2816 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002817
2818 cc_library {
2819 name: "mylib",
2820 srcs: ["mylib.cpp"],
2821 relative_install_path: "foo/bar",
2822 system_shared_libs: [],
2823 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002824 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002825 }
2826
2827 cc_binary {
2828 name: "mybin",
2829 srcs: ["mylib.cpp"],
2830 relative_install_path: "foo/bar",
2831 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002832 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002833 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002834 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002835 `)
2836
Sundong Ahnabb64432019-10-22 13:58:29 +09002837 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002838 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002839
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002840 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002841 ensureContains(t, cmd, "/etc ")
2842 ensureContains(t, cmd, "/etc/foo ")
2843 ensureContains(t, cmd, "/etc/foo/bar ")
2844 ensureContains(t, cmd, "/lib64 ")
2845 ensureContains(t, cmd, "/lib64/foo ")
2846 ensureContains(t, cmd, "/lib64/foo/bar ")
2847 ensureContains(t, cmd, "/lib ")
2848 ensureContains(t, cmd, "/lib/foo ")
2849 ensureContains(t, cmd, "/lib/foo/bar ")
2850 ensureContains(t, cmd, "/bin ")
2851 ensureContains(t, cmd, "/bin/foo ")
2852 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002853}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002854
Jooyung Han35155c42020-02-06 17:33:20 +09002855func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002856 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002857 apex {
2858 name: "myapex",
2859 key: "myapex.key",
2860 multilib: {
2861 both: {
2862 native_shared_libs: ["mylib"],
2863 binaries: ["mybin"],
2864 },
2865 },
2866 compile_multilib: "both",
2867 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002868 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002869 }
2870
2871 apex_key {
2872 name: "myapex.key",
2873 public_key: "testkey.avbpubkey",
2874 private_key: "testkey.pem",
2875 }
2876
2877 cc_library {
2878 name: "mylib",
2879 relative_install_path: "foo/bar",
2880 system_shared_libs: [],
2881 stl: "none",
2882 apex_available: [ "myapex" ],
2883 native_bridge_supported: true,
2884 }
2885
2886 cc_binary {
2887 name: "mybin",
2888 relative_install_path: "foo/bar",
2889 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002890 stl: "none",
2891 apex_available: [ "myapex" ],
2892 native_bridge_supported: true,
2893 compile_multilib: "both", // default is "first" for binary
2894 multilib: {
2895 lib64: {
2896 suffix: "64",
2897 },
2898 },
2899 }
2900 `, withNativeBridgeEnabled)
2901 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2902 "bin/foo/bar/mybin",
2903 "bin/foo/bar/mybin64",
2904 "bin/arm/foo/bar/mybin",
2905 "bin/arm64/foo/bar/mybin64",
2906 "lib/foo/bar/mylib.so",
2907 "lib/arm/foo/bar/mylib.so",
2908 "lib64/foo/bar/mylib.so",
2909 "lib64/arm64/foo/bar/mylib.so",
2910 })
2911}
2912
Jooyung Han85d61762020-06-24 23:50:26 +09002913func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002914 result := android.GroupFixturePreparers(
2915 prepareForApexTest,
2916 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2917 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002918 apex {
2919 name: "myapex",
2920 key: "myapex.key",
2921 binaries: ["mybin"],
2922 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002923 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002924 }
2925 apex_key {
2926 name: "myapex.key",
2927 public_key: "testkey.avbpubkey",
2928 private_key: "testkey.pem",
2929 }
2930 cc_binary {
2931 name: "mybin",
2932 vendor: true,
2933 shared_libs: ["libfoo"],
2934 }
2935 cc_library {
2936 name: "libfoo",
2937 proprietary: true,
2938 }
2939 `)
2940
Colin Crossc68db4b2021-11-11 18:59:15 -08002941 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002942 "bin/mybin",
2943 "lib64/libfoo.so",
2944 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2945 "lib64/libc++.so",
2946 })
2947
Colin Crossc68db4b2021-11-11 18:59:15 -08002948 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2949 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002950 name := apexBundle.BaseModuleName()
2951 prefix := "TARGET_"
2952 var builder strings.Builder
2953 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002954 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002955 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002956 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002957
Colin Crossc68db4b2021-11-11 18:59:15 -08002958 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002959 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2960 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002961}
2962
Jooyung Hanc5a96762022-02-04 11:54:50 +09002963func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2964 testApexError(t, `Trying to include a VNDK library`, `
2965 apex {
2966 name: "myapex",
2967 key: "myapex.key",
2968 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2969 vendor: true,
2970 use_vndk_as_stable: true,
2971 updatable: false,
2972 }
2973 apex_key {
2974 name: "myapex.key",
2975 public_key: "testkey.avbpubkey",
2976 private_key: "testkey.pem",
2977 }`)
2978}
2979
Jooyung Handf78e212020-07-22 15:54:47 +09002980func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002981 // myapex myapex2
2982 // | |
2983 // mybin ------. mybin2
2984 // \ \ / |
2985 // (stable) .---\--------` |
2986 // \ / \ |
2987 // \ / \ /
2988 // libvndk libvendor
2989 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002990 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002991 apex {
2992 name: "myapex",
2993 key: "myapex.key",
2994 binaries: ["mybin"],
2995 vendor: true,
2996 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002997 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002998 }
2999 apex_key {
3000 name: "myapex.key",
3001 public_key: "testkey.avbpubkey",
3002 private_key: "testkey.pem",
3003 }
3004 cc_binary {
3005 name: "mybin",
3006 vendor: true,
3007 shared_libs: ["libvndk", "libvendor"],
3008 }
3009 cc_library {
3010 name: "libvndk",
3011 vndk: {
3012 enabled: true,
3013 },
3014 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003015 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09003016 }
3017 cc_library {
3018 name: "libvendor",
3019 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09003020 stl: "none",
3021 }
3022 apex {
3023 name: "myapex2",
3024 key: "myapex.key",
3025 binaries: ["mybin2"],
3026 vendor: true,
3027 use_vndk_as_stable: false,
3028 updatable: false,
3029 }
3030 cc_binary {
3031 name: "mybin2",
3032 vendor: true,
3033 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09003034 }
3035 `)
3036
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003037 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09003038
Jooyung Han91f92032022-02-04 12:36:33 +09003039 for _, tc := range []struct {
3040 name string
3041 apexName string
3042 moduleName string
3043 moduleVariant string
3044 libs []string
3045 contents []string
3046 requireVndkNamespace bool
3047 }{
3048 {
3049 name: "use_vndk_as_stable",
3050 apexName: "myapex",
3051 moduleName: "mybin",
3052 moduleVariant: vendorVariant + "_apex10000",
3053 libs: []string{
3054 // should link with vendor variants of VNDK libs(libvndk/libc++)
3055 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3056 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3057 // unstable Vendor libs as APEX variant
3058 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3059 },
3060 contents: []string{
3061 "bin/mybin",
3062 "lib64/libvendor.so",
3063 // VNDK libs (libvndk/libc++) are not included
3064 },
3065 requireVndkNamespace: true,
3066 },
3067 {
3068 name: "!use_vndk_as_stable",
3069 apexName: "myapex2",
3070 moduleName: "mybin2",
3071 moduleVariant: vendorVariant + "_myapex2",
3072 libs: []string{
3073 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3074 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3075 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3076 // unstable vendor libs have "merged" APEX variants
3077 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3078 },
3079 contents: []string{
3080 "bin/mybin2",
3081 "lib64/libvendor.so",
3082 // VNDK libs are included as well
3083 "lib64/libvndk.so",
3084 "lib64/libc++.so",
3085 },
3086 requireVndkNamespace: false,
3087 },
3088 } {
3089 t.Run(tc.name, func(t *testing.T) {
3090 // Check linked libs
3091 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3092 libs := names(ldRule.Args["libFlags"])
3093 for _, lib := range tc.libs {
3094 ensureListContains(t, libs, lib)
3095 }
3096 // Check apex contents
3097 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003098
Jooyung Han91f92032022-02-04 12:36:33 +09003099 // Check "requireNativeLibs"
3100 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
3101 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3102 if tc.requireVndkNamespace {
3103 ensureListContains(t, requireNativeLibs, ":vndk")
3104 } else {
3105 ensureListNotContains(t, requireNativeLibs, ":vndk")
3106 }
3107 })
3108 }
Jooyung Handf78e212020-07-22 15:54:47 +09003109}
3110
Justin Yun13decfb2021-03-08 19:25:55 +09003111func TestProductVariant(t *testing.T) {
3112 ctx := testApex(t, `
3113 apex {
3114 name: "myapex",
3115 key: "myapex.key",
3116 updatable: false,
3117 product_specific: true,
3118 binaries: ["foo"],
3119 }
3120
3121 apex_key {
3122 name: "myapex.key",
3123 public_key: "testkey.avbpubkey",
3124 private_key: "testkey.pem",
3125 }
3126
3127 cc_binary {
3128 name: "foo",
3129 product_available: true,
3130 apex_available: ["myapex"],
3131 srcs: ["foo.cpp"],
3132 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003133 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3134 variables.ProductVndkVersion = proptools.StringPtr("current")
3135 }),
3136 )
Justin Yun13decfb2021-03-08 19:25:55 +09003137
3138 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003139 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003140 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3141 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3142 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3143 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3144}
3145
Jooyung Han8e5685d2020-09-21 11:02:57 +09003146func TestApex_withPrebuiltFirmware(t *testing.T) {
3147 testCases := []struct {
3148 name string
3149 additionalProp string
3150 }{
3151 {"system apex with prebuilt_firmware", ""},
3152 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3153 }
3154 for _, tc := range testCases {
3155 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003156 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003157 apex {
3158 name: "myapex",
3159 key: "myapex.key",
3160 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003161 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003162 `+tc.additionalProp+`
3163 }
3164 apex_key {
3165 name: "myapex.key",
3166 public_key: "testkey.avbpubkey",
3167 private_key: "testkey.pem",
3168 }
3169 prebuilt_firmware {
3170 name: "myfirmware",
3171 src: "myfirmware.bin",
3172 filename_from_src: true,
3173 `+tc.additionalProp+`
3174 }
3175 `)
3176 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3177 "etc/firmware/myfirmware.bin",
3178 })
3179 })
3180 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003181}
3182
Jooyung Hanefb184e2020-06-25 17:14:25 +09003183func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003184 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003185 apex {
3186 name: "myapex",
3187 key: "myapex.key",
3188 vendor: true,
3189 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003190 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003191 }
3192
3193 apex_key {
3194 name: "myapex.key",
3195 public_key: "testkey.avbpubkey",
3196 private_key: "testkey.pem",
3197 }
3198
3199 cc_library {
3200 name: "mylib",
3201 vendor_available: true,
3202 }
3203 `)
3204
3205 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003206 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003207 name := apexBundle.BaseModuleName()
3208 prefix := "TARGET_"
3209 var builder strings.Builder
3210 data.Custom(&builder, name, prefix, "", data)
3211 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00003212 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 +09003213}
3214
Jooyung Han2ed99d02020-06-24 23:26:26 +09003215func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003216 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003217 apex {
3218 name: "myapex",
3219 key: "myapex.key",
3220 vintf_fragments: ["fragment.xml"],
3221 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003222 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003223 }
3224 apex_key {
3225 name: "myapex.key",
3226 public_key: "testkey.avbpubkey",
3227 private_key: "testkey.pem",
3228 }
3229 cc_binary {
3230 name: "mybin",
3231 }
3232 `)
3233
3234 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003235 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003236 name := apexBundle.BaseModuleName()
3237 prefix := "TARGET_"
3238 var builder strings.Builder
3239 data.Custom(&builder, name, prefix, "", data)
3240 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003241 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003242 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003243}
3244
Jiyong Park16e91a02018-12-20 18:18:08 +09003245func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003246 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003247 apex {
3248 name: "myapex",
3249 key: "myapex.key",
3250 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003251 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003252 }
3253
3254 apex_key {
3255 name: "myapex.key",
3256 public_key: "testkey.avbpubkey",
3257 private_key: "testkey.pem",
3258 }
3259
3260 cc_library {
3261 name: "mylib",
3262 srcs: ["mylib.cpp"],
3263 system_shared_libs: [],
3264 stl: "none",
3265 stubs: {
3266 versions: ["1", "2", "3"],
3267 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003268 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003269 }
3270
3271 cc_binary {
3272 name: "not_in_apex",
3273 srcs: ["mylib.cpp"],
3274 static_libs: ["mylib"],
3275 static_executable: true,
3276 system_shared_libs: [],
3277 stl: "none",
3278 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003279 `)
3280
Colin Cross7113d202019-11-20 16:39:12 -08003281 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003282
3283 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003284 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003285}
Jiyong Park9335a262018-12-24 11:31:58 +09003286
3287func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003288 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003289 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003290 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003291 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003292 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003293 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003294 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003295 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003296 }
3297
3298 cc_library {
3299 name: "mylib",
3300 srcs: ["mylib.cpp"],
3301 system_shared_libs: [],
3302 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003303 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003304 }
3305
3306 apex_key {
3307 name: "myapex.key",
3308 public_key: "testkey.avbpubkey",
3309 private_key: "testkey.pem",
3310 }
3311
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003312 android_app_certificate {
3313 name: "myapex.certificate",
3314 certificate: "testkey",
3315 }
3316
3317 android_app_certificate {
3318 name: "myapex.certificate.override",
3319 certificate: "testkey.override",
3320 }
3321
Jiyong Park9335a262018-12-24 11:31:58 +09003322 `)
3323
3324 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003325 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003326
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003327 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3328 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003329 "vendor/foo/devkeys/testkey.avbpubkey")
3330 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003331 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3332 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003333 "vendor/foo/devkeys/testkey.pem")
3334 }
3335
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003336 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003337 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003338 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003339 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003340 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003341 }
3342}
Jiyong Park58e364a2019-01-19 19:24:06 +09003343
Jooyung Hanf121a652019-12-17 14:30:11 +09003344func TestCertificate(t *testing.T) {
3345 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003346 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003347 apex {
3348 name: "myapex",
3349 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003350 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003351 }
3352 apex_key {
3353 name: "myapex.key",
3354 public_key: "testkey.avbpubkey",
3355 private_key: "testkey.pem",
3356 }`)
3357 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3358 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3359 if actual := rule.Args["certificates"]; actual != expected {
3360 t.Errorf("certificates should be %q, not %q", expected, actual)
3361 }
3362 })
3363 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003364 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003365 apex {
3366 name: "myapex_keytest",
3367 key: "myapex.key",
3368 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003369 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003370 }
3371 apex_key {
3372 name: "myapex.key",
3373 public_key: "testkey.avbpubkey",
3374 private_key: "testkey.pem",
3375 }
3376 android_app_certificate {
3377 name: "myapex.certificate.override",
3378 certificate: "testkey.override",
3379 }`)
3380 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3381 expected := "testkey.override.x509.pem testkey.override.pk8"
3382 if actual := rule.Args["certificates"]; actual != expected {
3383 t.Errorf("certificates should be %q, not %q", expected, actual)
3384 }
3385 })
3386 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003387 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003388 apex {
3389 name: "myapex",
3390 key: "myapex.key",
3391 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003392 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003393 }
3394 apex_key {
3395 name: "myapex.key",
3396 public_key: "testkey.avbpubkey",
3397 private_key: "testkey.pem",
3398 }
3399 android_app_certificate {
3400 name: "myapex.certificate",
3401 certificate: "testkey",
3402 }`)
3403 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3404 expected := "testkey.x509.pem testkey.pk8"
3405 if actual := rule.Args["certificates"]; actual != expected {
3406 t.Errorf("certificates should be %q, not %q", expected, actual)
3407 }
3408 })
3409 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003410 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003411 apex {
3412 name: "myapex_keytest",
3413 key: "myapex.key",
3414 file_contexts: ":myapex-file_contexts",
3415 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003416 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003417 }
3418 apex_key {
3419 name: "myapex.key",
3420 public_key: "testkey.avbpubkey",
3421 private_key: "testkey.pem",
3422 }
3423 android_app_certificate {
3424 name: "myapex.certificate.override",
3425 certificate: "testkey.override",
3426 }`)
3427 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3428 expected := "testkey.override.x509.pem testkey.override.pk8"
3429 if actual := rule.Args["certificates"]; actual != expected {
3430 t.Errorf("certificates should be %q, not %q", expected, actual)
3431 }
3432 })
3433 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003434 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003435 apex {
3436 name: "myapex",
3437 key: "myapex.key",
3438 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003439 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003440 }
3441 apex_key {
3442 name: "myapex.key",
3443 public_key: "testkey.avbpubkey",
3444 private_key: "testkey.pem",
3445 }`)
3446 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3447 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3448 if actual := rule.Args["certificates"]; actual != expected {
3449 t.Errorf("certificates should be %q, not %q", expected, actual)
3450 }
3451 })
3452 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003453 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003454 apex {
3455 name: "myapex_keytest",
3456 key: "myapex.key",
3457 file_contexts: ":myapex-file_contexts",
3458 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003459 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003460 }
3461 apex_key {
3462 name: "myapex.key",
3463 public_key: "testkey.avbpubkey",
3464 private_key: "testkey.pem",
3465 }
3466 android_app_certificate {
3467 name: "myapex.certificate.override",
3468 certificate: "testkey.override",
3469 }`)
3470 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3471 expected := "testkey.override.x509.pem testkey.override.pk8"
3472 if actual := rule.Args["certificates"]; actual != expected {
3473 t.Errorf("certificates should be %q, not %q", expected, actual)
3474 }
3475 })
3476}
3477
Jiyong Park58e364a2019-01-19 19:24:06 +09003478func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003479 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003480 apex {
3481 name: "myapex",
3482 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003483 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003484 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003485 }
3486
3487 apex {
3488 name: "otherapex",
3489 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003490 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003491 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003492 }
3493
3494 apex_key {
3495 name: "myapex.key",
3496 public_key: "testkey.avbpubkey",
3497 private_key: "testkey.pem",
3498 }
3499
3500 cc_library {
3501 name: "mylib",
3502 srcs: ["mylib.cpp"],
3503 system_shared_libs: [],
3504 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003505 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003506 "myapex",
3507 "otherapex",
3508 ],
Jooyung Han24282772020-03-21 23:20:55 +09003509 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003510 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003511 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003512 cc_library {
3513 name: "mylib2",
3514 srcs: ["mylib.cpp"],
3515 system_shared_libs: [],
3516 stl: "none",
3517 apex_available: [
3518 "myapex",
3519 "otherapex",
3520 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003521 static_libs: ["mylib3"],
3522 recovery_available: true,
3523 min_sdk_version: "29",
3524 }
3525 cc_library {
3526 name: "mylib3",
3527 srcs: ["mylib.cpp"],
3528 system_shared_libs: [],
3529 stl: "none",
3530 apex_available: [
3531 "myapex",
3532 "otherapex",
3533 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003534 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003535 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003536 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003537 `)
3538
Jooyung Hanc87a0592020-03-02 17:44:33 +09003539 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003540 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003541 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003542
Vinh Tranf9754732023-01-19 22:41:46 -05003543 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003544 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003545 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003546
Vinh Tranf9754732023-01-19 22:41:46 -05003547 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003548 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003549 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003550
Colin Crossaede88c2020-08-11 12:17:01 -07003551 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3552 // each variant defines additional macros to distinguish which apex variant it is built for
3553
3554 // non-APEX variant does not have __ANDROID_APEX__ defined
3555 mylibCFlags = ctx.ModuleForTests("mylib3", "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("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3560 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003561
Jooyung Hanc87a0592020-03-02 17:44:33 +09003562 // non-APEX variant does not have __ANDROID_APEX__ defined
3563 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3564 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3565
Vinh Tranf9754732023-01-19 22:41:46 -05003566 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003567 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003568 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003569}
Jiyong Park7e636d02019-01-28 16:16:54 +09003570
3571func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003572 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003573 apex {
3574 name: "myapex",
3575 key: "myapex.key",
3576 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003577 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003578 }
3579
3580 apex_key {
3581 name: "myapex.key",
3582 public_key: "testkey.avbpubkey",
3583 private_key: "testkey.pem",
3584 }
3585
3586 cc_library_headers {
3587 name: "mylib_headers",
3588 export_include_dirs: ["my_include"],
3589 system_shared_libs: [],
3590 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003591 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003592 }
3593
3594 cc_library {
3595 name: "mylib",
3596 srcs: ["mylib.cpp"],
3597 system_shared_libs: [],
3598 stl: "none",
3599 header_libs: ["mylib_headers"],
3600 export_header_lib_headers: ["mylib_headers"],
3601 stubs: {
3602 versions: ["1", "2", "3"],
3603 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003604 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003605 }
3606
3607 cc_library {
3608 name: "otherlib",
3609 srcs: ["mylib.cpp"],
3610 system_shared_libs: [],
3611 stl: "none",
3612 shared_libs: ["mylib"],
3613 }
3614 `)
3615
Colin Cross7113d202019-11-20 16:39:12 -08003616 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003617
3618 // Ensure that the include path of the header lib is exported to 'otherlib'
3619 ensureContains(t, cFlags, "-Imy_include")
3620}
Alex Light9670d332019-01-29 18:07:33 -08003621
Jiyong Park7cd10e32020-01-14 09:22:18 +09003622type fileInApex struct {
3623 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003624 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003625 isLink bool
3626}
3627
Jooyung Han1724d582022-12-21 10:17:44 +09003628func (f fileInApex) String() string {
3629 return f.src + ":" + f.path
3630}
3631
3632func (f fileInApex) match(expectation string) bool {
3633 parts := strings.Split(expectation, ":")
3634 if len(parts) == 1 {
3635 match, _ := path.Match(parts[0], f.path)
3636 return match
3637 }
3638 if len(parts) == 2 {
3639 matchSrc, _ := path.Match(parts[0], f.src)
3640 matchDst, _ := path.Match(parts[1], f.path)
3641 return matchSrc && matchDst
3642 }
3643 panic("invalid expected file specification: " + expectation)
3644}
3645
Jooyung Hana57af4a2020-01-23 05:36:59 +00003646func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003647 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003648 module := ctx.ModuleForTests(moduleName, variant)
3649 apexRule := module.MaybeRule("apexRule")
3650 apexDir := "/image.apex/"
3651 if apexRule.Rule == nil {
3652 apexRule = module.Rule("zipApexRule")
3653 apexDir = "/image.zipapex/"
3654 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003655 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003656 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003657 for _, cmd := range strings.Split(copyCmds, "&&") {
3658 cmd = strings.TrimSpace(cmd)
3659 if cmd == "" {
3660 continue
3661 }
3662 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003663 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003664 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003665 switch terms[0] {
3666 case "mkdir":
3667 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003668 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003669 t.Fatal("copyCmds contains invalid cp command", cmd)
3670 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003671 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 = false
3674 case "ln":
3675 if len(terms) != 3 && len(terms) != 4 {
3676 // ln LINK TARGET or ln -s LINK TARGET
3677 t.Fatal("copyCmds contains invalid ln command", cmd)
3678 }
3679 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003680 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003681 isLink = true
3682 default:
3683 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3684 }
3685 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003686 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003687 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003688 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003689 }
Jooyung Han1724d582022-12-21 10:17:44 +09003690 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003691 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003692 }
3693 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003694 return ret
3695}
3696
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003697func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003698 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003699 var failed bool
3700 var surplus []string
3701 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003702 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003703 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003704 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003705 if file.match(expected) {
3706 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003707 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003708 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003709 }
3710 }
Jooyung Han1724d582022-12-21 10:17:44 +09003711 if !matchFound {
3712 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003713 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003714 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003715
Jooyung Han31c470b2019-10-18 16:26:59 +09003716 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003717 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003718 t.Log("surplus files", surplus)
3719 failed = true
3720 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003721
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003722 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003723 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003724 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003725 if !filesMatched[expected] {
3726 missing = append(missing, expected)
3727 }
3728 }
3729 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003730 t.Log("missing files", missing)
3731 failed = true
3732 }
3733 if failed {
3734 t.Fail()
3735 }
3736}
3737
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003738func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3739 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3740}
3741
3742func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3743 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3744 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3745 if deapexer.Output != nil {
3746 outputs = append(outputs, deapexer.Output.String())
3747 }
3748 for _, output := range deapexer.ImplicitOutputs {
3749 outputs = append(outputs, output.String())
3750 }
3751 actualFiles := make([]fileInApex, 0, len(outputs))
3752 for _, output := range outputs {
3753 dir := "/deapexer/"
3754 pos := strings.LastIndex(output, dir)
3755 if pos == -1 {
3756 t.Fatal("Unknown deapexer output ", output)
3757 }
3758 path := output[pos+len(dir):]
3759 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3760 }
3761 assertFileListEquals(t, files, actualFiles)
3762}
3763
Jooyung Han344d5432019-08-23 11:17:39 +09003764func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003765 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003766 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003767 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003768 "etc/llndk.libraries.29.txt",
3769 "etc/vndkcore.libraries.29.txt",
3770 "etc/vndksp.libraries.29.txt",
3771 "etc/vndkprivate.libraries.29.txt",
3772 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003773 }
3774 testCases := []struct {
3775 vndkVersion string
3776 expectedFiles []string
3777 }{
3778 {
3779 vndkVersion: "current",
3780 expectedFiles: append(commonFiles,
3781 "lib/libvndk.so",
3782 "lib/libvndksp.so",
3783 "lib64/libvndk.so",
3784 "lib64/libvndksp.so"),
3785 },
3786 {
3787 vndkVersion: "",
3788 expectedFiles: append(commonFiles,
3789 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3790 "lib/libvndksp.so",
3791 "lib64/libvndksp.so"),
3792 },
3793 }
3794 for _, tc := range testCases {
3795 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3796 ctx := testApex(t, `
3797 apex_vndk {
3798 name: "com.android.vndk.current",
3799 key: "com.android.vndk.current.key",
3800 updatable: false,
3801 }
3802
3803 apex_key {
3804 name: "com.android.vndk.current.key",
3805 public_key: "testkey.avbpubkey",
3806 private_key: "testkey.pem",
3807 }
3808
3809 cc_library {
3810 name: "libvndk",
3811 srcs: ["mylib.cpp"],
3812 vendor_available: true,
3813 product_available: true,
3814 vndk: {
3815 enabled: true,
3816 },
3817 system_shared_libs: [],
3818 stl: "none",
3819 apex_available: [ "com.android.vndk.current" ],
3820 }
3821
3822 cc_library {
3823 name: "libvndksp",
3824 srcs: ["mylib.cpp"],
3825 vendor_available: true,
3826 product_available: true,
3827 vndk: {
3828 enabled: true,
3829 support_system_process: true,
3830 },
3831 system_shared_libs: [],
3832 stl: "none",
3833 apex_available: [ "com.android.vndk.current" ],
3834 }
3835
3836 // VNDK-Ext should not cause any problems
3837
3838 cc_library {
3839 name: "libvndk.ext",
3840 srcs: ["mylib2.cpp"],
3841 vendor: true,
3842 vndk: {
3843 enabled: true,
3844 extends: "libvndk",
3845 },
3846 system_shared_libs: [],
3847 stl: "none",
3848 }
3849
3850 cc_library {
3851 name: "libvndksp.ext",
3852 srcs: ["mylib2.cpp"],
3853 vendor: true,
3854 vndk: {
3855 enabled: true,
3856 support_system_process: true,
3857 extends: "libvndksp",
3858 },
3859 system_shared_libs: [],
3860 stl: "none",
3861 }
3862 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3863 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3864 }))
3865 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3866 })
3867 }
Jooyung Han344d5432019-08-23 11:17:39 +09003868}
3869
3870func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003871 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003872 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003873 name: "com.android.vndk.current",
3874 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003875 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003876 }
3877
3878 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003879 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003880 public_key: "testkey.avbpubkey",
3881 private_key: "testkey.pem",
3882 }
3883
3884 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003885 name: "libvndk",
3886 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003887 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003888 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003889 vndk: {
3890 enabled: true,
3891 },
3892 system_shared_libs: [],
3893 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003894 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003895 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003896
3897 cc_prebuilt_library_shared {
3898 name: "libvndk.arm",
3899 srcs: ["libvndk.arm.so"],
3900 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003901 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003902 vndk: {
3903 enabled: true,
3904 },
3905 enabled: false,
3906 arch: {
3907 arm: {
3908 enabled: true,
3909 },
3910 },
3911 system_shared_libs: [],
3912 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003913 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003914 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003915 `+vndkLibrariesTxtFiles("current"),
3916 withFiles(map[string][]byte{
3917 "libvndk.so": nil,
3918 "libvndk.arm.so": nil,
3919 }))
Colin Cross2807f002021-03-02 10:15:29 -08003920 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003921 "lib/libvndk.so",
3922 "lib/libvndk.arm.so",
3923 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003924 "lib/libc++.so",
3925 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003926 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003927 })
Jooyung Han344d5432019-08-23 11:17:39 +09003928}
3929
Jooyung Han39edb6c2019-11-06 16:53:07 +09003930func vndkLibrariesTxtFiles(vers ...string) (result string) {
3931 for _, v := range vers {
3932 if v == "current" {
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 += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003935 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003936 name: "` + txt + `.libraries.txt",
3937 }
3938 `
3939 }
3940 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003941 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003942 result += `
3943 prebuilt_etc {
3944 name: "` + txt + `.libraries.` + v + `.txt",
3945 src: "dummy.txt",
3946 }
3947 `
3948 }
3949 }
3950 }
3951 return
3952}
3953
Jooyung Han344d5432019-08-23 11:17:39 +09003954func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003955 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003956 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003957 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003958 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003959 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003960 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003961 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003962 }
3963
3964 apex_key {
3965 name: "myapex.key",
3966 public_key: "testkey.avbpubkey",
3967 private_key: "testkey.pem",
3968 }
3969
Jooyung Han31c470b2019-10-18 16:26:59 +09003970 vndk_prebuilt_shared {
3971 name: "libvndk27",
3972 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003973 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003974 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003975 vndk: {
3976 enabled: true,
3977 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003978 target_arch: "arm64",
3979 arch: {
3980 arm: {
3981 srcs: ["libvndk27_arm.so"],
3982 },
3983 arm64: {
3984 srcs: ["libvndk27_arm64.so"],
3985 },
3986 },
Colin Cross2807f002021-03-02 10:15:29 -08003987 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003988 }
3989
3990 vndk_prebuilt_shared {
3991 name: "libvndk27",
3992 version: "27",
3993 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003994 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003995 vndk: {
3996 enabled: true,
3997 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003998 target_arch: "x86_64",
3999 arch: {
4000 x86: {
4001 srcs: ["libvndk27_x86.so"],
4002 },
4003 x86_64: {
4004 srcs: ["libvndk27_x86_64.so"],
4005 },
4006 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09004007 }
4008 `+vndkLibrariesTxtFiles("27"),
4009 withFiles(map[string][]byte{
4010 "libvndk27_arm.so": nil,
4011 "libvndk27_arm64.so": nil,
4012 "libvndk27_x86.so": nil,
4013 "libvndk27_x86_64.so": nil,
4014 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004015
Colin Cross2807f002021-03-02 10:15:29 -08004016 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004017 "lib/libvndk27_arm.so",
4018 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004019 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004020 })
Jooyung Han344d5432019-08-23 11:17:39 +09004021}
4022
Jooyung Han90eee022019-10-01 20:02:42 +09004023func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004024 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004025 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004026 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09004027 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004028 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004029 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004030 }
4031 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004032 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004033 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004034 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004035 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004036 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004037 }
4038 apex_key {
4039 name: "myapex.key",
4040 public_key: "testkey.avbpubkey",
4041 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004042 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004043
4044 assertApexName := func(expected, moduleName string) {
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004045 module := ctx.ModuleForTests(moduleName, "android_common_image")
4046 apexManifestRule := module.Rule("apexManifestRule")
4047 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004048 }
4049
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004050 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004051 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004052}
4053
Jooyung Han344d5432019-08-23 11:17:39 +09004054func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004055 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004056 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004057 name: "com.android.vndk.current",
4058 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004059 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004060 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004061 }
4062
4063 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004064 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004065 public_key: "testkey.avbpubkey",
4066 private_key: "testkey.pem",
4067 }
4068
4069 cc_library {
4070 name: "libvndk",
4071 srcs: ["mylib.cpp"],
4072 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004073 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004074 native_bridge_supported: true,
4075 host_supported: true,
4076 vndk: {
4077 enabled: true,
4078 },
4079 system_shared_libs: [],
4080 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004081 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004082 }
Colin Cross2807f002021-03-02 10:15:29 -08004083 `+vndkLibrariesTxtFiles("current"),
4084 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004085
Colin Cross2807f002021-03-02 10:15:29 -08004086 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004087 "lib/libvndk.so",
4088 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004089 "lib/libc++.so",
4090 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004091 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004092 })
Jooyung Han344d5432019-08-23 11:17:39 +09004093}
4094
4095func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004096 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004097 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004098 name: "com.android.vndk.current",
4099 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004100 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004101 native_bridge_supported: true,
4102 }
4103
4104 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004105 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004106 public_key: "testkey.avbpubkey",
4107 private_key: "testkey.pem",
4108 }
4109
4110 cc_library {
4111 name: "libvndk",
4112 srcs: ["mylib.cpp"],
4113 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004114 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004115 native_bridge_supported: true,
4116 host_supported: true,
4117 vndk: {
4118 enabled: true,
4119 },
4120 system_shared_libs: [],
4121 stl: "none",
4122 }
4123 `)
4124}
4125
Jooyung Han31c470b2019-10-18 16:26:59 +09004126func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004127 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004128 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004129 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004130 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004131 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004132 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004133 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004134 }
4135
4136 apex_key {
4137 name: "myapex.key",
4138 public_key: "testkey.avbpubkey",
4139 private_key: "testkey.pem",
4140 }
4141
4142 vndk_prebuilt_shared {
4143 name: "libvndk27",
4144 version: "27",
4145 target_arch: "arm",
4146 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004147 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004148 vndk: {
4149 enabled: true,
4150 },
4151 arch: {
4152 arm: {
4153 srcs: ["libvndk27.so"],
4154 }
4155 },
4156 }
4157
4158 vndk_prebuilt_shared {
4159 name: "libvndk27",
4160 version: "27",
4161 target_arch: "arm",
4162 binder32bit: true,
4163 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004164 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004165 vndk: {
4166 enabled: true,
4167 },
4168 arch: {
4169 arm: {
4170 srcs: ["libvndk27binder32.so"],
4171 }
4172 },
Colin Cross2807f002021-03-02 10:15:29 -08004173 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004174 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004175 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004176 withFiles(map[string][]byte{
4177 "libvndk27.so": nil,
4178 "libvndk27binder32.so": nil,
4179 }),
4180 withBinder32bit,
4181 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004182 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004183 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4184 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004185 },
4186 }),
4187 )
4188
Colin Cross2807f002021-03-02 10:15:29 -08004189 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004190 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004191 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004192 })
4193}
4194
Jooyung Han45a96772020-06-15 14:59:42 +09004195func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004196 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004197 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004198 name: "com.android.vndk.current",
4199 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004200 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004201 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004202 }
4203
4204 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004205 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004206 public_key: "testkey.avbpubkey",
4207 private_key: "testkey.pem",
4208 }
4209
4210 cc_library {
4211 name: "libz",
4212 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004213 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004214 vndk: {
4215 enabled: true,
4216 },
4217 stubs: {
4218 symbol_file: "libz.map.txt",
4219 versions: ["30"],
4220 }
4221 }
4222 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4223 "libz.map.txt": nil,
4224 }))
4225
Colin Cross2807f002021-03-02 10:15:29 -08004226 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004227 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4228 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09004229 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
4230 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4231 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4232 "*/*",
4233 })
Jooyung Han45a96772020-06-15 14:59:42 +09004234}
4235
Jooyung Hane3f02812023-05-08 13:54:50 +09004236func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4237 ctx := testApex(t, "",
4238 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4239 variables.DeviceVndkVersion = proptools.StringPtr("27")
4240 }),
4241 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4242 cc.RegisterVendorSnapshotModules(ctx)
4243 }),
4244 withFiles(map[string][]byte{
4245 "vendor/foo/Android.bp": []byte(`
4246 apex {
4247 name: "myapex",
4248 binaries: ["foo"],
4249 key: "myapex.key",
4250 min_sdk_version: "27",
4251 vendor: true,
4252 }
4253
4254 cc_binary {
4255 name: "foo",
4256 vendor: true,
4257 srcs: ["abc.cpp"],
4258 shared_libs: [
4259 "libllndk",
4260 "libvndk",
4261 ],
4262 nocrt: true,
4263 system_shared_libs: [],
4264 min_sdk_version: "27",
4265 }
4266
4267 apex_key {
4268 name: "myapex.key",
4269 public_key: "testkey.avbpubkey",
4270 private_key: "testkey.pem",
4271 }
4272 `),
4273 // Simulate VNDK prebuilts with vendor_snapshot
4274 "prebuilts/vndk/Android.bp": []byte(`
4275 vndk_prebuilt_shared {
4276 name: "libllndk",
4277 version: "27",
4278 vendor_available: true,
4279 product_available: true,
4280 target_arch: "arm64",
4281 arch: {
4282 arm64: {
4283 srcs: ["libllndk.so"],
4284 },
4285 },
4286 }
4287
4288 vndk_prebuilt_shared {
4289 name: "libvndk",
4290 version: "27",
4291 vendor_available: true,
4292 product_available: true,
4293 target_arch: "arm64",
4294 arch: {
4295 arm64: {
4296 srcs: ["libvndk.so"],
4297 },
4298 },
4299 vndk: {
4300 enabled: true,
4301 },
4302 min_sdk_version: "27",
4303 }
4304
4305 vndk_prebuilt_shared {
4306 name: "libc++",
4307 version: "27",
4308 target_arch: "arm64",
4309 vendor_available: true,
4310 product_available: true,
4311 vndk: {
4312 enabled: true,
4313 support_system_process: true,
4314 },
4315 arch: {
4316 arm64: {
4317 srcs: ["libc++.so"],
4318 },
4319 },
4320 min_sdk_version: "apex_inherit",
4321 }
4322
4323 vendor_snapshot {
4324 name: "vendor_snapshot",
4325 version: "27",
4326 arch: {
4327 arm64: {
4328 vndk_libs: [
4329 "libc++",
4330 "libllndk",
4331 "libvndk",
4332 ],
4333 static_libs: [
4334 "libc++demangle",
4335 "libclang_rt.builtins",
4336 "libunwind",
4337 ],
4338 },
4339 }
4340 }
4341
4342 vendor_snapshot_static {
4343 name: "libclang_rt.builtins",
4344 version: "27",
4345 target_arch: "arm64",
4346 vendor: true,
4347 arch: {
4348 arm64: {
4349 src: "libclang_rt.builtins-aarch64-android.a",
4350 },
4351 },
4352 }
4353
4354 vendor_snapshot_static {
4355 name: "libc++demangle",
4356 version: "27",
4357 target_arch: "arm64",
4358 compile_multilib: "64",
4359 vendor: true,
4360 arch: {
4361 arm64: {
4362 src: "libc++demangle.a",
4363 },
4364 },
4365 min_sdk_version: "apex_inherit",
4366 }
4367
4368 vendor_snapshot_static {
4369 name: "libunwind",
4370 version: "27",
4371 target_arch: "arm64",
4372 compile_multilib: "64",
4373 vendor: true,
4374 arch: {
4375 arm64: {
4376 src: "libunwind.a",
4377 },
4378 },
4379 min_sdk_version: "apex_inherit",
4380 }
4381 `),
4382 }))
4383
4384 // Should embed the prebuilt VNDK libraries in the apex
4385 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4386 "bin/foo",
4387 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4388 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4389 })
4390
4391 // Should link foo with prebuilt libraries (shared/static)
4392 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4393 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4394 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4395 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4396 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4397
4398 // Should declare the LLNDK library as a "required" external dependency
4399 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4400 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4401 ensureListContains(t, requireNativeLibs, "libllndk.so")
4402}
4403
Jooyung Hane1633032019-08-01 17:41:43 +09004404func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004405 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004406 apex {
4407 name: "myapex_nodep",
4408 key: "myapex.key",
4409 native_shared_libs: ["lib_nodep"],
4410 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004411 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004412 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004413 }
4414
4415 apex {
4416 name: "myapex_dep",
4417 key: "myapex.key",
4418 native_shared_libs: ["lib_dep"],
4419 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004420 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004421 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004422 }
4423
4424 apex {
4425 name: "myapex_provider",
4426 key: "myapex.key",
4427 native_shared_libs: ["libfoo"],
4428 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004429 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004430 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004431 }
4432
4433 apex {
4434 name: "myapex_selfcontained",
4435 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004436 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004437 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004438 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004439 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004440 }
4441
4442 apex_key {
4443 name: "myapex.key",
4444 public_key: "testkey.avbpubkey",
4445 private_key: "testkey.pem",
4446 }
4447
4448 cc_library {
4449 name: "lib_nodep",
4450 srcs: ["mylib.cpp"],
4451 system_shared_libs: [],
4452 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004453 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004454 }
4455
4456 cc_library {
4457 name: "lib_dep",
4458 srcs: ["mylib.cpp"],
4459 shared_libs: ["libfoo"],
4460 system_shared_libs: [],
4461 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004462 apex_available: [
4463 "myapex_dep",
4464 "myapex_provider",
4465 "myapex_selfcontained",
4466 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004467 }
4468
4469 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004470 name: "lib_dep_on_bar",
4471 srcs: ["mylib.cpp"],
4472 shared_libs: ["libbar"],
4473 system_shared_libs: [],
4474 stl: "none",
4475 apex_available: [
4476 "myapex_selfcontained",
4477 ],
4478 }
4479
4480
4481 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004482 name: "libfoo",
4483 srcs: ["mytest.cpp"],
4484 stubs: {
4485 versions: ["1"],
4486 },
4487 system_shared_libs: [],
4488 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004489 apex_available: [
4490 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004491 ],
4492 }
4493
4494 cc_library {
4495 name: "libbar",
4496 srcs: ["mytest.cpp"],
4497 stubs: {
4498 versions: ["1"],
4499 },
4500 system_shared_libs: [],
4501 stl: "none",
4502 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004503 "myapex_selfcontained",
4504 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004505 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004506
Jooyung Hane1633032019-08-01 17:41:43 +09004507 `)
4508
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004509 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004510 var provideNativeLibs, requireNativeLibs []string
4511
Sundong Ahnabb64432019-10-22 13:58:29 +09004512 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004513 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4514 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004515 ensureListEmpty(t, provideNativeLibs)
4516 ensureListEmpty(t, requireNativeLibs)
4517
Sundong Ahnabb64432019-10-22 13:58:29 +09004518 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004519 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4520 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004521 ensureListEmpty(t, provideNativeLibs)
4522 ensureListContains(t, requireNativeLibs, "libfoo.so")
4523
Sundong Ahnabb64432019-10-22 13:58:29 +09004524 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004525 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4526 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004527 ensureListContains(t, provideNativeLibs, "libfoo.so")
4528 ensureListEmpty(t, requireNativeLibs)
4529
Sundong Ahnabb64432019-10-22 13:58:29 +09004530 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004531 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4532 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004533 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004534 ensureListEmpty(t, requireNativeLibs)
4535}
4536
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004537func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4538 ctx := testApex(t, `
4539 apex {
4540 name: "myapex",
4541 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004542 native_shared_libs: ["mylib"],
4543 updatable: false,
4544 }
4545
4546 apex_key {
4547 name: "myapex.key",
4548 public_key: "testkey.avbpubkey",
4549 private_key: "testkey.pem",
4550 }
4551
4552 cc_library {
4553 name: "mylib",
4554 srcs: ["mylib.cpp"],
4555 system_shared_libs: [],
4556 stl: "none",
4557 apex_available: [
4558 "//apex_available:platform",
4559 "myapex",
4560 ],
4561 }
4562 `, android.FixtureMergeEnv(map[string]string{
4563 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4564 }))
4565
Jooyung Han63dff462023-02-09 00:11:27 +00004566 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004567 apexManifestRule := module.Rule("apexManifestRule")
4568 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4569}
4570
Vinh Tran8f5310f2022-10-07 18:16:47 -04004571func TestCompileMultilibProp(t *testing.T) {
4572 testCases := []struct {
4573 compileMultiLibProp string
4574 containedLibs []string
4575 notContainedLibs []string
4576 }{
4577 {
4578 containedLibs: []string{
4579 "image.apex/lib64/mylib.so",
4580 "image.apex/lib/mylib.so",
4581 },
4582 compileMultiLibProp: `compile_multilib: "both",`,
4583 },
4584 {
4585 containedLibs: []string{"image.apex/lib64/mylib.so"},
4586 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4587 compileMultiLibProp: `compile_multilib: "first",`,
4588 },
4589 {
4590 containedLibs: []string{"image.apex/lib64/mylib.so"},
4591 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4592 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4593 },
4594 {
4595 containedLibs: []string{"image.apex/lib64/mylib.so"},
4596 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4597 compileMultiLibProp: `compile_multilib: "64",`,
4598 },
4599 {
4600 containedLibs: []string{"image.apex/lib/mylib.so"},
4601 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4602 compileMultiLibProp: `compile_multilib: "32",`,
4603 },
4604 }
4605 for _, testCase := range testCases {
4606 ctx := testApex(t, fmt.Sprintf(`
4607 apex {
4608 name: "myapex",
4609 key: "myapex.key",
4610 %s
4611 native_shared_libs: ["mylib"],
4612 updatable: false,
4613 }
4614 apex_key {
4615 name: "myapex.key",
4616 public_key: "testkey.avbpubkey",
4617 private_key: "testkey.pem",
4618 }
4619 cc_library {
4620 name: "mylib",
4621 srcs: ["mylib.cpp"],
4622 apex_available: [
4623 "//apex_available:platform",
4624 "myapex",
4625 ],
4626 }
4627 `, testCase.compileMultiLibProp),
4628 )
4629 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4630 apexRule := module.Rule("apexRule")
4631 copyCmds := apexRule.Args["copy_commands"]
4632 for _, containedLib := range testCase.containedLibs {
4633 ensureContains(t, copyCmds, containedLib)
4634 }
4635 for _, notContainedLib := range testCase.notContainedLibs {
4636 ensureNotContains(t, copyCmds, notContainedLib)
4637 }
4638 }
4639}
4640
Alex Light0851b882019-02-07 13:20:53 -08004641func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004642 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004643 apex {
4644 name: "myapex",
4645 key: "myapex.key",
4646 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004647 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004648 }
4649
4650 apex_key {
4651 name: "myapex.key",
4652 public_key: "testkey.avbpubkey",
4653 private_key: "testkey.pem",
4654 }
4655
4656 cc_library {
4657 name: "mylib_common",
4658 srcs: ["mylib.cpp"],
4659 system_shared_libs: [],
4660 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004661 apex_available: [
4662 "//apex_available:platform",
4663 "myapex",
4664 ],
Alex Light0851b882019-02-07 13:20:53 -08004665 }
4666 `)
4667
Sundong Ahnabb64432019-10-22 13:58:29 +09004668 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004669 apexRule := module.Rule("apexRule")
4670 copyCmds := apexRule.Args["copy_commands"]
4671
4672 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4673 t.Log("Apex was a test apex!")
4674 t.Fail()
4675 }
4676 // Ensure that main rule creates an output
4677 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4678
4679 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004680 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004681
4682 // Ensure that both direct and indirect deps are copied into apex
4683 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4684
Colin Cross7113d202019-11-20 16:39:12 -08004685 // Ensure that the platform variant ends with _shared
4686 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004687
Colin Cross56a83212020-09-15 18:30:11 -07004688 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004689 t.Log("Found mylib_common not in any apex!")
4690 t.Fail()
4691 }
4692}
4693
4694func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004695 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004696 apex_test {
4697 name: "myapex",
4698 key: "myapex.key",
4699 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004700 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004701 }
4702
4703 apex_key {
4704 name: "myapex.key",
4705 public_key: "testkey.avbpubkey",
4706 private_key: "testkey.pem",
4707 }
4708
4709 cc_library {
4710 name: "mylib_common_test",
4711 srcs: ["mylib.cpp"],
4712 system_shared_libs: [],
4713 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004714 // TODO: remove //apex_available:platform
4715 apex_available: [
4716 "//apex_available:platform",
4717 "myapex",
4718 ],
Alex Light0851b882019-02-07 13:20:53 -08004719 }
4720 `)
4721
Sundong Ahnabb64432019-10-22 13:58:29 +09004722 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004723 apexRule := module.Rule("apexRule")
4724 copyCmds := apexRule.Args["copy_commands"]
4725
4726 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4727 t.Log("Apex was not a test apex!")
4728 t.Fail()
4729 }
4730 // Ensure that main rule creates an output
4731 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4732
4733 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004734 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004735
4736 // Ensure that both direct and indirect deps are copied into apex
4737 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4738
Colin Cross7113d202019-11-20 16:39:12 -08004739 // Ensure that the platform variant ends with _shared
4740 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004741}
4742
Alex Light9670d332019-01-29 18:07:33 -08004743func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004744 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004745 apex {
4746 name: "myapex",
4747 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004748 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004749 multilib: {
4750 first: {
4751 native_shared_libs: ["mylib_common"],
4752 }
4753 },
4754 target: {
4755 android: {
4756 multilib: {
4757 first: {
4758 native_shared_libs: ["mylib"],
4759 }
4760 }
4761 },
4762 host: {
4763 multilib: {
4764 first: {
4765 native_shared_libs: ["mylib2"],
4766 }
4767 }
4768 }
4769 }
4770 }
4771
4772 apex_key {
4773 name: "myapex.key",
4774 public_key: "testkey.avbpubkey",
4775 private_key: "testkey.pem",
4776 }
4777
4778 cc_library {
4779 name: "mylib",
4780 srcs: ["mylib.cpp"],
4781 system_shared_libs: [],
4782 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004783 // TODO: remove //apex_available:platform
4784 apex_available: [
4785 "//apex_available:platform",
4786 "myapex",
4787 ],
Alex Light9670d332019-01-29 18:07:33 -08004788 }
4789
4790 cc_library {
4791 name: "mylib_common",
4792 srcs: ["mylib.cpp"],
4793 system_shared_libs: [],
4794 stl: "none",
4795 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004796 // TODO: remove //apex_available:platform
4797 apex_available: [
4798 "//apex_available:platform",
4799 "myapex",
4800 ],
Alex Light9670d332019-01-29 18:07:33 -08004801 }
4802
4803 cc_library {
4804 name: "mylib2",
4805 srcs: ["mylib.cpp"],
4806 system_shared_libs: [],
4807 stl: "none",
4808 compile_multilib: "first",
4809 }
4810 `)
4811
Sundong Ahnabb64432019-10-22 13:58:29 +09004812 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004813 copyCmds := apexRule.Args["copy_commands"]
4814
4815 // Ensure that main rule creates an output
4816 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4817
4818 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004819 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4820 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4821 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004822
4823 // Ensure that both direct and indirect deps are copied into apex
4824 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4825 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4826 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4827
Colin Cross7113d202019-11-20 16:39:12 -08004828 // Ensure that the platform variant ends with _shared
4829 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4830 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4831 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004832}
Jiyong Park04480cf2019-02-06 00:16:29 +09004833
Jiyong Park59140302020-12-14 18:44:04 +09004834func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004835 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004836 apex {
4837 name: "myapex",
4838 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004839 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004840 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004841 arch: {
4842 arm64: {
4843 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004844 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004845 },
4846 x86_64: {
4847 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004848 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004849 },
4850 }
4851 }
4852
4853 apex_key {
4854 name: "myapex.key",
4855 public_key: "testkey.avbpubkey",
4856 private_key: "testkey.pem",
4857 }
4858
4859 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004860 name: "mylib.generic",
4861 srcs: ["mylib.cpp"],
4862 system_shared_libs: [],
4863 stl: "none",
4864 // TODO: remove //apex_available:platform
4865 apex_available: [
4866 "//apex_available:platform",
4867 "myapex",
4868 ],
4869 }
4870
4871 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004872 name: "mylib.arm64",
4873 srcs: ["mylib.cpp"],
4874 system_shared_libs: [],
4875 stl: "none",
4876 // TODO: remove //apex_available:platform
4877 apex_available: [
4878 "//apex_available:platform",
4879 "myapex",
4880 ],
4881 }
4882
4883 cc_library {
4884 name: "mylib.x64",
4885 srcs: ["mylib.cpp"],
4886 system_shared_libs: [],
4887 stl: "none",
4888 // TODO: remove //apex_available:platform
4889 apex_available: [
4890 "//apex_available:platform",
4891 "myapex",
4892 ],
4893 }
4894 `)
4895
4896 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4897 copyCmds := apexRule.Args["copy_commands"]
4898
4899 // Ensure that apex variant is created for the direct dep
4900 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004901 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004902 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4903
4904 // Ensure that both direct and indirect deps are copied into apex
4905 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4906 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4907}
4908
Jiyong Park04480cf2019-02-06 00:16:29 +09004909func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004910 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004911 apex {
4912 name: "myapex",
4913 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004914 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004915 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004916 }
4917
4918 apex_key {
4919 name: "myapex.key",
4920 public_key: "testkey.avbpubkey",
4921 private_key: "testkey.pem",
4922 }
4923
4924 sh_binary {
4925 name: "myscript",
4926 src: "mylib.cpp",
4927 filename: "myscript.sh",
4928 sub_dir: "script",
4929 }
4930 `)
4931
Sundong Ahnabb64432019-10-22 13:58:29 +09004932 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004933 copyCmds := apexRule.Args["copy_commands"]
4934
4935 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4936}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004937
Jooyung Han91df2082019-11-20 01:49:42 +09004938func TestApexInVariousPartition(t *testing.T) {
4939 testcases := []struct {
4940 propName, parition, flattenedPartition string
4941 }{
4942 {"", "system", "system_ext"},
4943 {"product_specific: true", "product", "product"},
4944 {"soc_specific: true", "vendor", "vendor"},
4945 {"proprietary: true", "vendor", "vendor"},
4946 {"vendor: true", "vendor", "vendor"},
4947 {"system_ext_specific: true", "system_ext", "system_ext"},
4948 }
4949 for _, tc := range testcases {
4950 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004951 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004952 apex {
4953 name: "myapex",
4954 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004955 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004956 `+tc.propName+`
4957 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004958
Jooyung Han91df2082019-11-20 01:49:42 +09004959 apex_key {
4960 name: "myapex.key",
4961 public_key: "testkey.avbpubkey",
4962 private_key: "testkey.pem",
4963 }
4964 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004965
Jooyung Han91df2082019-11-20 01:49:42 +09004966 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004967 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4968 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004969 if actual != expected {
4970 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4971 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004972
Jooyung Han91df2082019-11-20 01:49:42 +09004973 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004974 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4975 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004976 if actual != expected {
4977 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4978 }
4979 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004980 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004981}
Jiyong Park67882562019-03-21 01:11:21 +09004982
Jooyung Han580eb4f2020-06-24 19:33:06 +09004983func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004984 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004985 apex {
4986 name: "myapex",
4987 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004988 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004989 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004990
Jooyung Han580eb4f2020-06-24 19:33:06 +09004991 apex_key {
4992 name: "myapex.key",
4993 public_key: "testkey.avbpubkey",
4994 private_key: "testkey.pem",
4995 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004996 `)
4997 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004998 rule := module.Output("file_contexts")
4999 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
5000}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005001
Jooyung Han580eb4f2020-06-24 19:33:06 +09005002func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005003 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005004 apex {
5005 name: "myapex",
5006 key: "myapex.key",
5007 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005008 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005009 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005010
Jooyung Han580eb4f2020-06-24 19:33:06 +09005011 apex_key {
5012 name: "myapex.key",
5013 public_key: "testkey.avbpubkey",
5014 private_key: "testkey.pem",
5015 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005016 `, withFiles(map[string][]byte{
5017 "my_own_file_contexts": nil,
5018 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005019}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005020
Jooyung Han580eb4f2020-06-24 19:33:06 +09005021func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005022 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005023 apex {
5024 name: "myapex",
5025 key: "myapex.key",
5026 product_specific: true,
5027 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005028 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005029 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005030
Jooyung Han580eb4f2020-06-24 19:33:06 +09005031 apex_key {
5032 name: "myapex.key",
5033 public_key: "testkey.avbpubkey",
5034 private_key: "testkey.pem",
5035 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005036 `)
5037
Colin Cross1c460562021-02-16 17:55:47 -08005038 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005039 apex {
5040 name: "myapex",
5041 key: "myapex.key",
5042 product_specific: true,
5043 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005044 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005045 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005046
Jooyung Han580eb4f2020-06-24 19:33:06 +09005047 apex_key {
5048 name: "myapex.key",
5049 public_key: "testkey.avbpubkey",
5050 private_key: "testkey.pem",
5051 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005052 `, withFiles(map[string][]byte{
5053 "product_specific_file_contexts": nil,
5054 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005055 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5056 rule := module.Output("file_contexts")
5057 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5058}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005059
Jooyung Han580eb4f2020-06-24 19:33:06 +09005060func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005061 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005062 apex {
5063 name: "myapex",
5064 key: "myapex.key",
5065 product_specific: true,
5066 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005067 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005068 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005069
Jooyung Han580eb4f2020-06-24 19:33:06 +09005070 apex_key {
5071 name: "myapex.key",
5072 public_key: "testkey.avbpubkey",
5073 private_key: "testkey.pem",
5074 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005075
Jooyung Han580eb4f2020-06-24 19:33:06 +09005076 filegroup {
5077 name: "my-file-contexts",
5078 srcs: ["product_specific_file_contexts"],
5079 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005080 `, withFiles(map[string][]byte{
5081 "product_specific_file_contexts": nil,
5082 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005083 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5084 rule := module.Output("file_contexts")
5085 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005086}
5087
Jiyong Park67882562019-03-21 01:11:21 +09005088func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005089 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005090 apex_key {
5091 name: "myapex.key",
5092 public_key: ":my.avbpubkey",
5093 private_key: ":my.pem",
5094 product_specific: true,
5095 }
5096
5097 filegroup {
5098 name: "my.avbpubkey",
5099 srcs: ["testkey2.avbpubkey"],
5100 }
5101
5102 filegroup {
5103 name: "my.pem",
5104 srcs: ["testkey2.pem"],
5105 }
5106 `)
5107
5108 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5109 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005110 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005111 if actual_pubkey != expected_pubkey {
5112 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5113 }
5114 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005115 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005116 if actual_privkey != expected_privkey {
5117 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5118 }
5119}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005120
5121func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005122 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005123 prebuilt_apex {
5124 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005125 arch: {
5126 arm64: {
5127 src: "myapex-arm64.apex",
5128 },
5129 arm: {
5130 src: "myapex-arm.apex",
5131 },
5132 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005133 }
5134 `)
5135
Wei Li340ee8e2022-03-18 17:33:24 -07005136 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5137 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005138
Jiyong Parkc95714e2019-03-29 14:23:10 +09005139 expectedInput := "myapex-arm64.apex"
5140 if prebuilt.inputApex.String() != expectedInput {
5141 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5142 }
Wei Li340ee8e2022-03-18 17:33:24 -07005143 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5144 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5145 rule := testingModule.Rule("genProvenanceMetaData")
5146 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5147 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5148 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5149 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005150
5151 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5152 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005153}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005154
Paul Duffinc0609c62021-03-01 17:27:16 +00005155func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005156 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005157 prebuilt_apex {
5158 name: "myapex",
5159 }
5160 `)
5161}
5162
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005163func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005164 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005165 prebuilt_apex {
5166 name: "myapex",
5167 src: "myapex-arm.apex",
5168 filename: "notmyapex.apex",
5169 }
5170 `)
5171
Wei Li340ee8e2022-03-18 17:33:24 -07005172 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5173 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005174
5175 expected := "notmyapex.apex"
5176 if p.installFilename != expected {
5177 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5178 }
Wei Li340ee8e2022-03-18 17:33:24 -07005179 rule := testingModule.Rule("genProvenanceMetaData")
5180 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5181 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5182 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5183 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005184}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005185
Samiul Islam7c02e262021-09-08 17:48:28 +01005186func TestApexSetFilenameOverride(t *testing.T) {
5187 testApex(t, `
5188 apex_set {
5189 name: "com.company.android.myapex",
5190 apex_name: "com.android.myapex",
5191 set: "company-myapex.apks",
5192 filename: "com.company.android.myapex.apex"
5193 }
5194 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5195
5196 testApex(t, `
5197 apex_set {
5198 name: "com.company.android.myapex",
5199 apex_name: "com.android.myapex",
5200 set: "company-myapex.apks",
5201 filename: "com.company.android.myapex.capex"
5202 }
5203 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5204
5205 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5206 apex_set {
5207 name: "com.company.android.myapex",
5208 apex_name: "com.android.myapex",
5209 set: "company-myapex.apks",
5210 filename: "some-random-suffix"
5211 }
5212 `)
5213}
5214
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005215func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005216 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005217 prebuilt_apex {
5218 name: "myapex.prebuilt",
5219 src: "myapex-arm.apex",
5220 overrides: [
5221 "myapex",
5222 ],
5223 }
5224 `)
5225
Wei Li340ee8e2022-03-18 17:33:24 -07005226 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5227 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005228
5229 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005230 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005231 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005232 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005233 }
Wei Li340ee8e2022-03-18 17:33:24 -07005234 rule := testingModule.Rule("genProvenanceMetaData")
5235 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5236 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5237 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5238 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005239}
5240
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005241func TestPrebuiltApexName(t *testing.T) {
5242 testApex(t, `
5243 prebuilt_apex {
5244 name: "com.company.android.myapex",
5245 apex_name: "com.android.myapex",
5246 src: "company-myapex-arm.apex",
5247 }
5248 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5249
5250 testApex(t, `
5251 apex_set {
5252 name: "com.company.android.myapex",
5253 apex_name: "com.android.myapex",
5254 set: "company-myapex.apks",
5255 }
5256 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5257}
5258
5259func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5260 _ = android.GroupFixturePreparers(
5261 java.PrepareForTestWithJavaDefaultModules,
5262 PrepareForTestWithApexBuildComponents,
5263 android.FixtureWithRootAndroidBp(`
5264 platform_bootclasspath {
5265 name: "platform-bootclasspath",
5266 fragments: [
5267 {
5268 apex: "com.android.art",
5269 module: "art-bootclasspath-fragment",
5270 },
5271 ],
5272 }
5273
5274 prebuilt_apex {
5275 name: "com.company.android.art",
5276 apex_name: "com.android.art",
5277 src: "com.company.android.art-arm.apex",
5278 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5279 }
5280
5281 prebuilt_bootclasspath_fragment {
5282 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005283 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005284 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005285 hidden_api: {
5286 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5287 metadata: "my-bootclasspath-fragment/metadata.csv",
5288 index: "my-bootclasspath-fragment/index.csv",
5289 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5290 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5291 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005292 }
5293
5294 java_import {
5295 name: "core-oj",
5296 jars: ["prebuilt.jar"],
5297 }
5298 `),
5299 ).RunTest(t)
5300}
5301
Paul Duffin092153d2021-01-26 11:42:39 +00005302// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5303// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005304func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005305 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005306
Paul Duffin89886cb2021-02-05 16:44:03 +00005307 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005308 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005309 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005310 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005311 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005312 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005313 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5314 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5315 android.NormalizePathForTesting(dexJarBuildPath))
5316 }
5317
5318 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005319 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005320 // Make sure the import has been given the correct path to the dex jar.
5321 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5322 dexJarBuildPath := p.DexJarInstallPath()
5323 stem := android.RemoveOptionalPrebuiltPrefix(name)
5324 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5325 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5326 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005327 }
5328
Paul Duffin39853512021-02-26 11:09:39 +00005329 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005330 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005331 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005332 android.AssertArrayString(t, "Check if there is no source variant",
5333 []string{"android_common"},
5334 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005335 }
5336
5337 t.Run("prebuilt only", func(t *testing.T) {
5338 bp := `
5339 prebuilt_apex {
5340 name: "myapex",
5341 arch: {
5342 arm64: {
5343 src: "myapex-arm64.apex",
5344 },
5345 arm: {
5346 src: "myapex-arm.apex",
5347 },
5348 },
Paul Duffin39853512021-02-26 11:09:39 +00005349 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005350 }
5351
5352 java_import {
5353 name: "libfoo",
5354 jars: ["libfoo.jar"],
5355 }
Paul Duffin39853512021-02-26 11:09:39 +00005356
5357 java_sdk_library_import {
5358 name: "libbar",
5359 public: {
5360 jars: ["libbar.jar"],
5361 },
5362 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005363 `
5364
5365 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5366 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5367
Martin Stjernholm44825602021-09-17 01:44:12 +01005368 deapexerName := deapexerModuleName("myapex")
5369 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5370
Paul Duffinf6932af2021-02-26 18:21:56 +00005371 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005372 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005373 rule := deapexer.Rule("deapexer")
5374 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5375 t.Errorf("expected: %q, found: %q", expected, actual)
5376 }
5377
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005378 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005379 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005380 rule = prebuiltApex.Rule("android/soong/android.Cp")
5381 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5382 t.Errorf("expected: %q, found: %q", expected, actual)
5383 }
5384
Paul Duffin89886cb2021-02-05 16:44:03 +00005385 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005386 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005387
5388 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005389 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005390 })
5391
5392 t.Run("prebuilt with source preferred", func(t *testing.T) {
5393
5394 bp := `
5395 prebuilt_apex {
5396 name: "myapex",
5397 arch: {
5398 arm64: {
5399 src: "myapex-arm64.apex",
5400 },
5401 arm: {
5402 src: "myapex-arm.apex",
5403 },
5404 },
Paul Duffin39853512021-02-26 11:09:39 +00005405 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005406 }
5407
5408 java_import {
5409 name: "libfoo",
5410 jars: ["libfoo.jar"],
5411 }
5412
5413 java_library {
5414 name: "libfoo",
5415 }
Paul Duffin39853512021-02-26 11:09:39 +00005416
5417 java_sdk_library_import {
5418 name: "libbar",
5419 public: {
5420 jars: ["libbar.jar"],
5421 },
5422 }
5423
5424 java_sdk_library {
5425 name: "libbar",
5426 srcs: ["foo/bar/MyClass.java"],
5427 unsafe_ignore_missing_latest_api: true,
5428 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005429 `
5430
5431 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5432 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5433
Paul Duffin89886cb2021-02-05 16:44:03 +00005434 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005435 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005436 ensureNoSourceVariant(t, ctx, "libfoo")
5437
5438 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005439 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005440 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005441 })
5442
5443 t.Run("prebuilt preferred with source", func(t *testing.T) {
5444 bp := `
5445 prebuilt_apex {
5446 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005447 arch: {
5448 arm64: {
5449 src: "myapex-arm64.apex",
5450 },
5451 arm: {
5452 src: "myapex-arm.apex",
5453 },
5454 },
Paul Duffin39853512021-02-26 11:09:39 +00005455 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005456 }
5457
5458 java_import {
5459 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005460 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005461 jars: ["libfoo.jar"],
5462 }
5463
5464 java_library {
5465 name: "libfoo",
5466 }
Paul Duffin39853512021-02-26 11:09:39 +00005467
5468 java_sdk_library_import {
5469 name: "libbar",
5470 prefer: true,
5471 public: {
5472 jars: ["libbar.jar"],
5473 },
5474 }
5475
5476 java_sdk_library {
5477 name: "libbar",
5478 srcs: ["foo/bar/MyClass.java"],
5479 unsafe_ignore_missing_latest_api: true,
5480 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005481 `
5482
5483 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5484 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5485
Paul Duffin89886cb2021-02-05 16:44:03 +00005486 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005487 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005488 ensureNoSourceVariant(t, ctx, "libfoo")
5489
5490 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005491 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005492 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005493 })
5494}
5495
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005496func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005497 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005498 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005499 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5500 // is disabled.
5501 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5502 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005503
Paul Duffin37856732021-02-26 14:24:15 +00005504 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5505 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005506 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005507 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005508 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005509 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005510 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005511 foundLibfooJar = true
5512 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005513 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005514 }
5515 }
5516 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005517 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 +00005518 }
5519 }
5520
Paul Duffin40a3f652021-07-19 13:11:24 +01005521 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005522 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005523 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005524 var rule android.TestingBuildParams
5525
5526 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5527 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005528 }
5529
Paul Duffin40a3f652021-07-19 13:11:24 +01005530 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5531 t.Helper()
5532 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5533 var rule android.TestingBuildParams
5534
5535 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5536 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5537 }
5538
Paul Duffin89f570a2021-06-16 01:42:33 +01005539 fragment := java.ApexVariantReference{
5540 Apex: proptools.StringPtr("myapex"),
5541 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5542 }
5543
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005544 t.Run("prebuilt only", func(t *testing.T) {
5545 bp := `
5546 prebuilt_apex {
5547 name: "myapex",
5548 arch: {
5549 arm64: {
5550 src: "myapex-arm64.apex",
5551 },
5552 arm: {
5553 src: "myapex-arm.apex",
5554 },
5555 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005556 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5557 }
5558
5559 prebuilt_bootclasspath_fragment {
5560 name: "my-bootclasspath-fragment",
5561 contents: ["libfoo", "libbar"],
5562 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005563 hidden_api: {
5564 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5565 metadata: "my-bootclasspath-fragment/metadata.csv",
5566 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005567 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5568 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5569 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005570 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005571 }
5572
5573 java_import {
5574 name: "libfoo",
5575 jars: ["libfoo.jar"],
5576 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005577 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005578 }
Paul Duffin37856732021-02-26 14:24:15 +00005579
5580 java_sdk_library_import {
5581 name: "libbar",
5582 public: {
5583 jars: ["libbar.jar"],
5584 },
5585 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005586 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005587 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005588 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005589 `
5590
Paul Duffin89f570a2021-06-16 01:42:33 +01005591 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005592 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5593 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005594
Paul Duffin537ea3d2021-05-14 10:38:00 +01005595 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005596 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005597 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005598 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005599 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5600 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005601 })
5602
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005603 t.Run("apex_set only", func(t *testing.T) {
5604 bp := `
5605 apex_set {
5606 name: "myapex",
5607 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005608 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005609 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005610 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5611 }
5612
5613 java_import {
5614 name: "myjavalib",
5615 jars: ["myjavalib.jar"],
5616 apex_available: ["myapex"],
5617 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005618 }
5619
5620 prebuilt_bootclasspath_fragment {
5621 name: "my-bootclasspath-fragment",
5622 contents: ["libfoo", "libbar"],
5623 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005624 hidden_api: {
5625 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5626 metadata: "my-bootclasspath-fragment/metadata.csv",
5627 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005628 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5629 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5630 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005631 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005632 }
5633
Liz Kammer2dc72442023-04-20 10:10:48 -04005634 prebuilt_systemserverclasspath_fragment {
5635 name: "my-systemserverclasspath-fragment",
5636 contents: ["libbaz"],
5637 apex_available: ["myapex"],
5638 }
5639
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005640 java_import {
5641 name: "libfoo",
5642 jars: ["libfoo.jar"],
5643 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005644 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005645 }
5646
5647 java_sdk_library_import {
5648 name: "libbar",
5649 public: {
5650 jars: ["libbar.jar"],
5651 },
5652 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005653 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005654 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005655 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005656
5657 java_sdk_library_import {
5658 name: "libbaz",
5659 public: {
5660 jars: ["libbaz.jar"],
5661 },
5662 apex_available: ["myapex"],
5663 shared_library: false,
5664 permitted_packages: ["baz"],
5665 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005666 `
5667
Paul Duffin89f570a2021-06-16 01:42:33 +01005668 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005669 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5670 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5671
Paul Duffin537ea3d2021-05-14 10:38:00 +01005672 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005673 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005674 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005675 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005676 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5677 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005678
5679 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5680
5681 overrideNames := []string{
5682 "",
5683 "myjavalib.myapex",
5684 "libfoo.myapex",
5685 "libbar.myapex",
5686 "libbaz.myapex",
5687 }
5688 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5689 for i, e := range mkEntries {
5690 g := e.OverrideName
5691 if w := overrideNames[i]; w != g {
5692 t.Errorf("Expected override name %q, got %q", w, g)
5693 }
5694 }
5695
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005696 })
5697
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005698 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5699 bp := `
5700 prebuilt_apex {
5701 name: "myapex",
5702 arch: {
5703 arm64: {
5704 src: "myapex-arm64.apex",
5705 },
5706 arm: {
5707 src: "myapex-arm.apex",
5708 },
5709 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005710 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5711 }
5712
5713 prebuilt_bootclasspath_fragment {
5714 name: "my-bootclasspath-fragment",
5715 contents: ["libfoo", "libbar"],
5716 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005717 hidden_api: {
5718 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5719 metadata: "my-bootclasspath-fragment/metadata.csv",
5720 index: "my-bootclasspath-fragment/index.csv",
5721 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5722 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5723 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005724 }
5725
5726 java_import {
5727 name: "libfoo",
5728 jars: ["libfoo.jar"],
5729 apex_available: ["myapex"],
5730 }
5731
5732 java_library {
5733 name: "libfoo",
5734 srcs: ["foo/bar/MyClass.java"],
5735 apex_available: ["myapex"],
5736 }
Paul Duffin37856732021-02-26 14:24:15 +00005737
5738 java_sdk_library_import {
5739 name: "libbar",
5740 public: {
5741 jars: ["libbar.jar"],
5742 },
5743 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005744 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005745 }
5746
5747 java_sdk_library {
5748 name: "libbar",
5749 srcs: ["foo/bar/MyClass.java"],
5750 unsafe_ignore_missing_latest_api: true,
5751 apex_available: ["myapex"],
5752 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005753 `
5754
5755 // In this test the source (java_library) libfoo is active since the
5756 // prebuilt (java_import) defaults to prefer:false. However the
5757 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5758 // find the dex boot jar in it. We either need to disable the source libfoo
5759 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005760 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005761 // dexbootjar check is skipped if AllowMissingDependencies is true
5762 preparerAllowMissingDeps := android.GroupFixturePreparers(
5763 preparer,
5764 android.PrepareForTestWithAllowMissingDependencies,
5765 )
5766 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005767 })
5768
5769 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5770 bp := `
5771 prebuilt_apex {
5772 name: "myapex",
5773 arch: {
5774 arm64: {
5775 src: "myapex-arm64.apex",
5776 },
5777 arm: {
5778 src: "myapex-arm.apex",
5779 },
5780 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005781 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5782 }
5783
5784 prebuilt_bootclasspath_fragment {
5785 name: "my-bootclasspath-fragment",
5786 contents: ["libfoo", "libbar"],
5787 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005788 hidden_api: {
5789 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5790 metadata: "my-bootclasspath-fragment/metadata.csv",
5791 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005792 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5793 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5794 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005795 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005796 }
5797
5798 java_import {
5799 name: "libfoo",
5800 prefer: true,
5801 jars: ["libfoo.jar"],
5802 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005803 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005804 }
5805
5806 java_library {
5807 name: "libfoo",
5808 srcs: ["foo/bar/MyClass.java"],
5809 apex_available: ["myapex"],
5810 }
Paul Duffin37856732021-02-26 14:24:15 +00005811
5812 java_sdk_library_import {
5813 name: "libbar",
5814 prefer: true,
5815 public: {
5816 jars: ["libbar.jar"],
5817 },
5818 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005819 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005820 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005821 }
5822
5823 java_sdk_library {
5824 name: "libbar",
5825 srcs: ["foo/bar/MyClass.java"],
5826 unsafe_ignore_missing_latest_api: true,
5827 apex_available: ["myapex"],
5828 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005829 `
5830
Paul Duffin89f570a2021-06-16 01:42:33 +01005831 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005832 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5833 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005834
Paul Duffin537ea3d2021-05-14 10:38:00 +01005835 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005836 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005837 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005838 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005839 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5840 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005841 })
5842
5843 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5844 bp := `
5845 apex {
5846 name: "myapex",
5847 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005848 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005849 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005850 }
5851
5852 apex_key {
5853 name: "myapex.key",
5854 public_key: "testkey.avbpubkey",
5855 private_key: "testkey.pem",
5856 }
5857
5858 prebuilt_apex {
5859 name: "myapex",
5860 arch: {
5861 arm64: {
5862 src: "myapex-arm64.apex",
5863 },
5864 arm: {
5865 src: "myapex-arm.apex",
5866 },
5867 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005868 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5869 }
5870
5871 prebuilt_bootclasspath_fragment {
5872 name: "my-bootclasspath-fragment",
5873 contents: ["libfoo", "libbar"],
5874 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005875 hidden_api: {
5876 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5877 metadata: "my-bootclasspath-fragment/metadata.csv",
5878 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005879 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5880 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5881 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005882 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005883 }
5884
5885 java_import {
5886 name: "libfoo",
5887 jars: ["libfoo.jar"],
5888 apex_available: ["myapex"],
5889 }
5890
5891 java_library {
5892 name: "libfoo",
5893 srcs: ["foo/bar/MyClass.java"],
5894 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005895 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005896 }
Paul Duffin37856732021-02-26 14:24:15 +00005897
5898 java_sdk_library_import {
5899 name: "libbar",
5900 public: {
5901 jars: ["libbar.jar"],
5902 },
5903 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005904 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005905 }
5906
5907 java_sdk_library {
5908 name: "libbar",
5909 srcs: ["foo/bar/MyClass.java"],
5910 unsafe_ignore_missing_latest_api: true,
5911 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005912 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005913 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005914 `
5915
Paul Duffin89f570a2021-06-16 01:42:33 +01005916 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005917 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5918 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005919
Paul Duffin537ea3d2021-05-14 10:38:00 +01005920 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005921 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005922 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005923 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005924 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5925 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005926 })
5927
5928 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5929 bp := `
5930 apex {
5931 name: "myapex",
5932 enabled: false,
5933 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005934 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005935 }
5936
5937 apex_key {
5938 name: "myapex.key",
5939 public_key: "testkey.avbpubkey",
5940 private_key: "testkey.pem",
5941 }
5942
5943 prebuilt_apex {
5944 name: "myapex",
5945 arch: {
5946 arm64: {
5947 src: "myapex-arm64.apex",
5948 },
5949 arm: {
5950 src: "myapex-arm.apex",
5951 },
5952 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005953 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5954 }
5955
5956 prebuilt_bootclasspath_fragment {
5957 name: "my-bootclasspath-fragment",
5958 contents: ["libfoo", "libbar"],
5959 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005960 hidden_api: {
5961 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5962 metadata: "my-bootclasspath-fragment/metadata.csv",
5963 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005964 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5965 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5966 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005967 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005968 }
5969
5970 java_import {
5971 name: "libfoo",
5972 prefer: true,
5973 jars: ["libfoo.jar"],
5974 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005975 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005976 }
5977
5978 java_library {
5979 name: "libfoo",
5980 srcs: ["foo/bar/MyClass.java"],
5981 apex_available: ["myapex"],
5982 }
Paul Duffin37856732021-02-26 14:24:15 +00005983
5984 java_sdk_library_import {
5985 name: "libbar",
5986 prefer: true,
5987 public: {
5988 jars: ["libbar.jar"],
5989 },
5990 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005991 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005992 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005993 }
5994
5995 java_sdk_library {
5996 name: "libbar",
5997 srcs: ["foo/bar/MyClass.java"],
5998 unsafe_ignore_missing_latest_api: true,
5999 apex_available: ["myapex"],
6000 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006001 `
6002
Paul Duffin89f570a2021-06-16 01:42:33 +01006003 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01006004 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6005 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006006
Paul Duffin537ea3d2021-05-14 10:38:00 +01006007 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006008 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006009 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006010 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006011 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
6012 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006013 })
6014}
6015
Roland Levillain630846d2019-06-26 12:48:34 +01006016func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006017 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006018 apex_test {
6019 name: "myapex",
6020 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006021 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006022 tests: [
6023 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006024 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006025 ],
6026 }
6027
6028 apex_key {
6029 name: "myapex.key",
6030 public_key: "testkey.avbpubkey",
6031 private_key: "testkey.pem",
6032 }
6033
Liz Kammer1c14a212020-05-12 15:26:55 -07006034 filegroup {
6035 name: "fg",
6036 srcs: [
6037 "baz",
6038 "bar/baz"
6039 ],
6040 }
6041
Roland Levillain630846d2019-06-26 12:48:34 +01006042 cc_test {
6043 name: "mytest",
6044 gtest: false,
6045 srcs: ["mytest.cpp"],
6046 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006047 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006048 system_shared_libs: [],
6049 static_executable: true,
6050 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006051 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006052 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006053
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006054 cc_library {
6055 name: "mylib",
6056 srcs: ["mylib.cpp"],
6057 system_shared_libs: [],
6058 stl: "none",
6059 }
6060
Liz Kammer5bd365f2020-05-27 15:15:11 -07006061 filegroup {
6062 name: "fg2",
6063 srcs: [
6064 "testdata/baz"
6065 ],
6066 }
6067
Roland Levillain9b5fde92019-06-28 15:41:19 +01006068 cc_test {
6069 name: "mytests",
6070 gtest: false,
6071 srcs: [
6072 "mytest1.cpp",
6073 "mytest2.cpp",
6074 "mytest3.cpp",
6075 ],
6076 test_per_src: true,
6077 relative_install_path: "test",
6078 system_shared_libs: [],
6079 static_executable: true,
6080 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006081 data: [
6082 ":fg",
6083 ":fg2",
6084 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006085 }
Roland Levillain630846d2019-06-26 12:48:34 +01006086 `)
6087
Sundong Ahnabb64432019-10-22 13:58:29 +09006088 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006089 copyCmds := apexRule.Args["copy_commands"]
6090
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006091 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006092 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006093 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006094
Liz Kammer1c14a212020-05-12 15:26:55 -07006095 //Ensure that test data are copied into apex.
6096 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6097 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6098
Roland Levillain9b5fde92019-06-28 15:41:19 +01006099 // Ensure that test deps built with `test_per_src` are copied into apex.
6100 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6101 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6102 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006103
6104 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07006105 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006106 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006107 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006108 prefix := "TARGET_"
6109 var builder strings.Builder
6110 data.Custom(&builder, name, prefix, "", data)
6111 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006112 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6113 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6114 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6115 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
6116 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
6117 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006118 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07006119
6120 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006121 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006122 data.Custom(&builder, name, prefix, "", data)
6123 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07006124 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
6125 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006126}
6127
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006128func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006129 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006130 apex {
6131 name: "myapex",
6132 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006133 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006134 }
6135 apex_key {
6136 name: "myapex.key",
6137 public_key: "testkey.avbpubkey",
6138 private_key: "testkey.pem",
6139 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00006140 `,
6141 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6142 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
6143 }),
6144 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006145 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00006146 ensureListContains(t, ab.makeModulesToInstall, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07006147 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006148 var builder strings.Builder
6149 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
6150 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006151 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex myapex.flattened\n")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006152}
6153
Jooyung Hand48f3c32019-08-23 11:18:57 +09006154func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6155 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6156 apex {
6157 name: "myapex",
6158 key: "myapex.key",
6159 native_shared_libs: ["libfoo"],
6160 }
6161
6162 apex_key {
6163 name: "myapex.key",
6164 public_key: "testkey.avbpubkey",
6165 private_key: "testkey.pem",
6166 }
6167
6168 cc_library {
6169 name: "libfoo",
6170 stl: "none",
6171 system_shared_libs: [],
6172 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006173 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006174 }
6175 `)
6176 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6177 apex {
6178 name: "myapex",
6179 key: "myapex.key",
6180 java_libs: ["myjar"],
6181 }
6182
6183 apex_key {
6184 name: "myapex.key",
6185 public_key: "testkey.avbpubkey",
6186 private_key: "testkey.pem",
6187 }
6188
6189 java_library {
6190 name: "myjar",
6191 srcs: ["foo/bar/MyClass.java"],
6192 sdk_version: "none",
6193 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006194 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006195 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006196 }
6197 `)
6198}
6199
Bill Peckhama41a6962021-01-11 10:58:54 -08006200func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006201 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006202 apex {
6203 name: "myapex",
6204 key: "myapex.key",
6205 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006206 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006207 }
6208
6209 apex_key {
6210 name: "myapex.key",
6211 public_key: "testkey.avbpubkey",
6212 private_key: "testkey.pem",
6213 }
6214
6215 java_import {
6216 name: "myjavaimport",
6217 apex_available: ["myapex"],
6218 jars: ["my.jar"],
6219 compile_dex: true,
6220 }
6221 `)
6222
6223 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6224 apexRule := module.Rule("apexRule")
6225 copyCmds := apexRule.Args["copy_commands"]
6226 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6227}
6228
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006229func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006230 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006231 apex {
6232 name: "myapex",
6233 key: "myapex.key",
6234 apps: [
6235 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006236 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006237 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006238 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006239 }
6240
6241 apex_key {
6242 name: "myapex.key",
6243 public_key: "testkey.avbpubkey",
6244 private_key: "testkey.pem",
6245 }
6246
6247 android_app {
6248 name: "AppFoo",
6249 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006250 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006251 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006252 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006253 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006254 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006255 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006256
6257 android_app {
6258 name: "AppFooPriv",
6259 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006260 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006261 system_modules: "none",
6262 privileged: true,
Andrei Onea580636b2022-08-17 16:53:46 +00006263 privapp_allowlist: "perms.xml",
6264 package_name: "com.android.AppFooPriv",
Colin Cross094cde42020-02-15 10:38:00 -08006265 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006266 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006267 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006268
6269 cc_library_shared {
6270 name: "libjni",
6271 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006272 shared_libs: ["libfoo"],
6273 stl: "none",
6274 system_shared_libs: [],
6275 apex_available: [ "myapex" ],
6276 sdk_version: "current",
6277 }
6278
6279 cc_library_shared {
6280 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006281 stl: "none",
6282 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006283 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006284 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006285 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006286 `)
6287
Sundong Ahnabb64432019-10-22 13:58:29 +09006288 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006289 apexRule := module.Rule("apexRule")
6290 copyCmds := apexRule.Args["copy_commands"]
6291
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006292 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6293 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006294 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006295
Colin Crossaede88c2020-08-11 12:17:01 -07006296 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006297 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006298 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006299 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006300 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006301 // JNI libraries including transitive deps are
6302 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006303 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006304 // ... embedded inside APK (jnilibs.zip)
6305 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6306 // ... and not directly inside the APEX
6307 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6308 }
Dario Frenicde2a032019-10-27 00:29:22 +01006309}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006310
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006311func TestApexWithAppImportBuildId(t *testing.T) {
6312 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6313 for _, id := range invalidBuildIds {
6314 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6315 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6316 variables.BuildId = proptools.StringPtr(id)
6317 })
6318 testApexError(t, message, `apex {
6319 name: "myapex",
6320 key: "myapex.key",
6321 apps: ["AppFooPrebuilt"],
6322 updatable: false,
6323 }
6324
6325 apex_key {
6326 name: "myapex.key",
6327 public_key: "testkey.avbpubkey",
6328 private_key: "testkey.pem",
6329 }
6330
6331 android_app_import {
6332 name: "AppFooPrebuilt",
6333 apk: "PrebuiltAppFoo.apk",
6334 presigned: true,
6335 apex_available: ["myapex"],
6336 }
6337 `, fixture)
6338 }
6339}
6340
Dario Frenicde2a032019-10-27 00:29:22 +01006341func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006342 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006343 apex {
6344 name: "myapex",
6345 key: "myapex.key",
6346 apps: [
6347 "AppFooPrebuilt",
6348 "AppFooPrivPrebuilt",
6349 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006350 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006351 }
6352
6353 apex_key {
6354 name: "myapex.key",
6355 public_key: "testkey.avbpubkey",
6356 private_key: "testkey.pem",
6357 }
6358
6359 android_app_import {
6360 name: "AppFooPrebuilt",
6361 apk: "PrebuiltAppFoo.apk",
6362 presigned: true,
6363 dex_preopt: {
6364 enabled: false,
6365 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006366 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006367 }
6368
6369 android_app_import {
6370 name: "AppFooPrivPrebuilt",
6371 apk: "PrebuiltAppFooPriv.apk",
6372 privileged: true,
6373 presigned: true,
6374 dex_preopt: {
6375 enabled: false,
6376 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006377 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006378 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006379 }
6380 `)
6381
Sundong Ahnabb64432019-10-22 13:58:29 +09006382 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01006383 apexRule := module.Rule("apexRule")
6384 copyCmds := apexRule.Args["copy_commands"]
6385
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006386 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6387 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006388}
6389
6390func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006391 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006392 apex {
6393 name: "myapex",
6394 key: "myapex.key",
6395 apps: [
6396 "AppFoo",
6397 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006398 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006399 }
6400
6401 apex_key {
6402 name: "myapex.key",
6403 public_key: "testkey.avbpubkey",
6404 private_key: "testkey.pem",
6405 }
6406
6407 android_app {
6408 name: "AppFoo",
6409 srcs: ["foo/bar/MyClass.java"],
6410 sdk_version: "none",
6411 system_modules: "none",
6412 apex_available: [ "myapex" ],
6413 }
6414
6415 android_app_import {
6416 name: "AppFoo",
6417 apk: "AppFooPrebuilt.apk",
6418 filename: "AppFooPrebuilt.apk",
6419 presigned: true,
6420 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006421 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006422 }
6423 `, withFiles(map[string][]byte{
6424 "AppFooPrebuilt.apk": nil,
6425 }))
6426
6427 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006428 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006429 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006430}
6431
Dario Freni6f3937c2019-12-20 22:58:03 +00006432func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006433 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006434 apex {
6435 name: "myapex",
6436 key: "myapex.key",
6437 apps: [
6438 "TesterHelpAppFoo",
6439 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006440 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006441 }
6442
6443 apex_key {
6444 name: "myapex.key",
6445 public_key: "testkey.avbpubkey",
6446 private_key: "testkey.pem",
6447 }
6448
6449 android_test_helper_app {
6450 name: "TesterHelpAppFoo",
6451 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006452 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006453 }
6454
6455 `)
6456
6457 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6458 apexRule := module.Rule("apexRule")
6459 copyCmds := apexRule.Args["copy_commands"]
6460
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006461 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006462}
6463
Jooyung Han18020ea2019-11-13 10:50:48 +09006464func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6465 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006466 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006467 apex {
6468 name: "myapex",
6469 key: "myapex.key",
6470 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006471 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006472 }
6473
6474 apex_key {
6475 name: "myapex.key",
6476 public_key: "testkey.avbpubkey",
6477 private_key: "testkey.pem",
6478 }
6479
6480 apex {
6481 name: "otherapex",
6482 key: "myapex.key",
6483 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006484 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006485 }
6486
6487 cc_defaults {
6488 name: "libfoo-defaults",
6489 apex_available: ["otherapex"],
6490 }
6491
6492 cc_library {
6493 name: "libfoo",
6494 defaults: ["libfoo-defaults"],
6495 stl: "none",
6496 system_shared_libs: [],
6497 }`)
6498}
6499
Paul Duffine52e66f2020-03-30 17:54:29 +01006500func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006501 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006502 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006503 apex {
6504 name: "myapex",
6505 key: "myapex.key",
6506 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006507 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006508 }
6509
6510 apex_key {
6511 name: "myapex.key",
6512 public_key: "testkey.avbpubkey",
6513 private_key: "testkey.pem",
6514 }
6515
6516 apex {
6517 name: "otherapex",
6518 key: "otherapex.key",
6519 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006520 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006521 }
6522
6523 apex_key {
6524 name: "otherapex.key",
6525 public_key: "testkey.avbpubkey",
6526 private_key: "testkey.pem",
6527 }
6528
6529 cc_library {
6530 name: "libfoo",
6531 stl: "none",
6532 system_shared_libs: [],
6533 apex_available: ["otherapex"],
6534 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006535}
Jiyong Park127b40b2019-09-30 16:04:35 +09006536
Paul Duffine52e66f2020-03-30 17:54:29 +01006537func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006538 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006539 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006540.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006541.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006542.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006543.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006544.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006545.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006546 apex {
6547 name: "myapex",
6548 key: "myapex.key",
6549 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006550 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006551 }
6552
6553 apex_key {
6554 name: "myapex.key",
6555 public_key: "testkey.avbpubkey",
6556 private_key: "testkey.pem",
6557 }
6558
Jiyong Park127b40b2019-09-30 16:04:35 +09006559 cc_library {
6560 name: "libfoo",
6561 stl: "none",
6562 shared_libs: ["libbar"],
6563 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006564 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006565 }
6566
6567 cc_library {
6568 name: "libbar",
6569 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006570 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006571 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006572 apex_available: ["myapex"],
6573 }
6574
6575 cc_library {
6576 name: "libbaz",
6577 stl: "none",
6578 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006579 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006580}
Jiyong Park127b40b2019-09-30 16:04:35 +09006581
Liz Kammer5f108fa2023-05-11 14:33:17 -04006582func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6583 testApex(t, `
6584 apex {
6585 name: "myapex",
6586 key: "myapex.key",
6587 native_shared_libs: ["libfoo"],
6588 updatable: false,
6589 }
6590
6591 apex_key {
6592 name: "myapex.key",
6593 public_key: "testkey.avbpubkey",
6594 private_key: "testkey.pem",
6595 }
6596
6597 cc_library {
6598 name: "libfoo",
6599 stl: "none",
6600 static_libs: ["libbar"],
6601 system_shared_libs: [],
6602 apex_available: ["myapex"],
6603 }
6604
6605 cc_library {
6606 name: "libbar",
6607 stl: "none",
6608 shared_libs: ["libbaz"],
6609 system_shared_libs: [],
6610 apex_available: ["myapex"],
6611 }
6612
6613 cc_library {
6614 name: "libbaz",
6615 stl: "none",
6616 system_shared_libs: [],
6617 }`)
6618
6619 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6620 apex {
6621 name: "myapex",
6622 key: "myapex.key",
6623 native_shared_libs: ["libfoo"],
6624 updatable: false,
6625 }
6626
6627 apex_key {
6628 name: "myapex.key",
6629 public_key: "testkey.avbpubkey",
6630 private_key: "testkey.pem",
6631 }
6632
6633 cc_library {
6634 name: "libfoo",
6635 stl: "none",
6636 static_libs: ["libbar"],
6637 system_shared_libs: [],
6638 apex_available: ["myapex"],
6639 }
6640
6641 cc_library {
6642 name: "libbar",
6643 stl: "none",
6644 system_shared_libs: [],
6645 }`)
6646}
6647
Paul Duffine52e66f2020-03-30 17:54:29 +01006648func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006649 testApexError(t, "\"otherapex\" is not a valid module name", `
6650 apex {
6651 name: "myapex",
6652 key: "myapex.key",
6653 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006654 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006655 }
6656
6657 apex_key {
6658 name: "myapex.key",
6659 public_key: "testkey.avbpubkey",
6660 private_key: "testkey.pem",
6661 }
6662
6663 cc_library {
6664 name: "libfoo",
6665 stl: "none",
6666 system_shared_libs: [],
6667 apex_available: ["otherapex"],
6668 }`)
6669
Paul Duffine52e66f2020-03-30 17:54:29 +01006670 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006671 apex {
6672 name: "myapex",
6673 key: "myapex.key",
6674 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006675 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006676 }
6677
6678 apex_key {
6679 name: "myapex.key",
6680 public_key: "testkey.avbpubkey",
6681 private_key: "testkey.pem",
6682 }
6683
6684 cc_library {
6685 name: "libfoo",
6686 stl: "none",
6687 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006688 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006689 apex_available: ["myapex"],
6690 }
6691
6692 cc_library {
6693 name: "libbar",
6694 stl: "none",
6695 system_shared_libs: [],
6696 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006697 }
6698
6699 cc_library {
6700 name: "libbaz",
6701 stl: "none",
6702 system_shared_libs: [],
6703 stubs: {
6704 versions: ["10", "20", "30"],
6705 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006706 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006707}
Jiyong Park127b40b2019-09-30 16:04:35 +09006708
Jiyong Park89e850a2020-04-07 16:37:39 +09006709func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006710 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006711 apex {
6712 name: "myapex",
6713 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006714 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006715 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006716 }
6717
6718 apex_key {
6719 name: "myapex.key",
6720 public_key: "testkey.avbpubkey",
6721 private_key: "testkey.pem",
6722 }
6723
6724 cc_library {
6725 name: "libfoo",
6726 stl: "none",
6727 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006728 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006729 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006730 }
6731
6732 cc_library {
6733 name: "libfoo2",
6734 stl: "none",
6735 system_shared_libs: [],
6736 shared_libs: ["libbaz"],
6737 apex_available: ["//apex_available:platform"],
6738 }
6739
6740 cc_library {
6741 name: "libbar",
6742 stl: "none",
6743 system_shared_libs: [],
6744 apex_available: ["myapex"],
6745 }
6746
6747 cc_library {
6748 name: "libbaz",
6749 stl: "none",
6750 system_shared_libs: [],
6751 apex_available: ["myapex"],
6752 stubs: {
6753 versions: ["1"],
6754 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006755 }`)
6756
Jiyong Park89e850a2020-04-07 16:37:39 +09006757 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6758 // because it depends on libbar which isn't available to platform
6759 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6760 if libfoo.NotAvailableForPlatform() != true {
6761 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6762 }
6763
6764 // libfoo2 however can be available to platform because it depends on libbaz which provides
6765 // stubs
6766 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6767 if libfoo2.NotAvailableForPlatform() == true {
6768 t.Errorf("%q should be available to platform", libfoo2.String())
6769 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006770}
Jiyong Parka90ca002019-10-07 15:47:24 +09006771
Paul Duffine52e66f2020-03-30 17:54:29 +01006772func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006773 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006774 apex {
6775 name: "myapex",
6776 key: "myapex.key",
6777 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006778 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006779 }
6780
6781 apex_key {
6782 name: "myapex.key",
6783 public_key: "testkey.avbpubkey",
6784 private_key: "testkey.pem",
6785 }
6786
6787 cc_library {
6788 name: "libfoo",
6789 stl: "none",
6790 system_shared_libs: [],
6791 apex_available: ["myapex"],
6792 static: {
6793 apex_available: ["//apex_available:platform"],
6794 },
6795 }`)
6796
Jiyong Park89e850a2020-04-07 16:37:39 +09006797 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6798 if libfooShared.NotAvailableForPlatform() != true {
6799 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6800 }
6801 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6802 if libfooStatic.NotAvailableForPlatform() != false {
6803 t.Errorf("%q should be available to platform", libfooStatic.String())
6804 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006805}
6806
Jiyong Park5d790c32019-11-15 18:40:32 +09006807func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006808 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006809 apex {
6810 name: "myapex",
6811 key: "myapex.key",
6812 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006813 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006814 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006815 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006816 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006817 }
6818
6819 override_apex {
6820 name: "override_myapex",
6821 base: "myapex",
6822 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006823 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006824 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006825 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006826 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006827 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006828 key: "mynewapex.key",
6829 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006830 }
6831
6832 apex_key {
6833 name: "myapex.key",
6834 public_key: "testkey.avbpubkey",
6835 private_key: "testkey.pem",
6836 }
6837
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006838 apex_key {
6839 name: "mynewapex.key",
6840 public_key: "testkey2.avbpubkey",
6841 private_key: "testkey2.pem",
6842 }
6843
6844 android_app_certificate {
6845 name: "myapex.certificate",
6846 certificate: "testkey",
6847 }
6848
Jiyong Park5d790c32019-11-15 18:40:32 +09006849 android_app {
6850 name: "app",
6851 srcs: ["foo/bar/MyClass.java"],
6852 package_name: "foo",
6853 sdk_version: "none",
6854 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006855 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006856 }
6857
6858 override_android_app {
6859 name: "override_app",
6860 base: "app",
6861 package_name: "bar",
6862 }
markchien7c803b82021-08-26 22:10:06 +08006863
6864 bpf {
6865 name: "bpf",
6866 srcs: ["bpf.c"],
6867 }
6868
6869 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006870 name: "overrideBpf",
6871 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006872 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006873
6874 prebuilt_etc {
6875 name: "myetc",
6876 src: "myprebuilt",
6877 }
6878
6879 prebuilt_etc {
6880 name: "override_myetc",
6881 src: "override_myprebuilt",
6882 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006883 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006884
Jiyong Park317645e2019-12-05 13:20:58 +09006885 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6886 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6887 if originalVariant.GetOverriddenBy() != "" {
6888 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6889 }
6890 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6891 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6892 }
6893
Jiyong Park5d790c32019-11-15 18:40:32 +09006894 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6895 apexRule := module.Rule("apexRule")
6896 copyCmds := apexRule.Args["copy_commands"]
6897
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006898 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6899 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006900
markchien7c803b82021-08-26 22:10:06 +08006901 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006902 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006903
Daniel Norman5a3ce132021-08-26 15:44:43 -07006904 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6905 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6906
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006907 apexBundle := module.Module().(*apexBundle)
6908 name := apexBundle.Name()
6909 if name != "override_myapex" {
6910 t.Errorf("name should be \"override_myapex\", but was %q", name)
6911 }
6912
Baligh Uddin004d7172020-02-19 21:29:28 -08006913 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6914 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6915 }
6916
Jiyong Park20bacab2020-03-03 11:45:41 +09006917 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006918 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006919 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6920
6921 signApkRule := module.Rule("signapk")
6922 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006923
Colin Crossaa255532020-07-03 13:18:24 -07006924 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006925 var builder strings.Builder
6926 data.Custom(&builder, name, "TARGET_", "", data)
6927 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006928 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6929 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
6930 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006931 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006932 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006933 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006934 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006935 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006936 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
6937 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006938}
6939
Albert Martineefabcf2022-03-21 20:11:16 +00006940func TestMinSdkVersionOverride(t *testing.T) {
6941 // Override from 29 to 31
6942 minSdkOverride31 := "31"
6943 ctx := testApex(t, `
6944 apex {
6945 name: "myapex",
6946 key: "myapex.key",
6947 native_shared_libs: ["mylib"],
6948 updatable: true,
6949 min_sdk_version: "29"
6950 }
6951
6952 override_apex {
6953 name: "override_myapex",
6954 base: "myapex",
6955 logging_parent: "com.foo.bar",
6956 package_name: "test.overridden.package"
6957 }
6958
6959 apex_key {
6960 name: "myapex.key",
6961 public_key: "testkey.avbpubkey",
6962 private_key: "testkey.pem",
6963 }
6964
6965 cc_library {
6966 name: "mylib",
6967 srcs: ["mylib.cpp"],
6968 runtime_libs: ["libbar"],
6969 system_shared_libs: [],
6970 stl: "none",
6971 apex_available: [ "myapex" ],
6972 min_sdk_version: "apex_inherit"
6973 }
6974
6975 cc_library {
6976 name: "libbar",
6977 srcs: ["mylib.cpp"],
6978 system_shared_libs: [],
6979 stl: "none",
6980 apex_available: [ "myapex" ],
6981 min_sdk_version: "apex_inherit"
6982 }
6983
6984 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6985
6986 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6987 copyCmds := apexRule.Args["copy_commands"]
6988
6989 // Ensure that direct non-stubs dep is always included
6990 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6991
6992 // Ensure that runtime_libs dep in included
6993 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6994
6995 // Ensure libraries target overridden min_sdk_version value
6996 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6997}
6998
6999func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7000 // Attempt to override from 31 to 29, should be a NOOP
7001 minSdkOverride29 := "29"
7002 ctx := testApex(t, `
7003 apex {
7004 name: "myapex",
7005 key: "myapex.key",
7006 native_shared_libs: ["mylib"],
7007 updatable: true,
7008 min_sdk_version: "31"
7009 }
7010
7011 override_apex {
7012 name: "override_myapex",
7013 base: "myapex",
7014 logging_parent: "com.foo.bar",
7015 package_name: "test.overridden.package"
7016 }
7017
7018 apex_key {
7019 name: "myapex.key",
7020 public_key: "testkey.avbpubkey",
7021 private_key: "testkey.pem",
7022 }
7023
7024 cc_library {
7025 name: "mylib",
7026 srcs: ["mylib.cpp"],
7027 runtime_libs: ["libbar"],
7028 system_shared_libs: [],
7029 stl: "none",
7030 apex_available: [ "myapex" ],
7031 min_sdk_version: "apex_inherit"
7032 }
7033
7034 cc_library {
7035 name: "libbar",
7036 srcs: ["mylib.cpp"],
7037 system_shared_libs: [],
7038 stl: "none",
7039 apex_available: [ "myapex" ],
7040 min_sdk_version: "apex_inherit"
7041 }
7042
7043 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7044
7045 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
7046 copyCmds := apexRule.Args["copy_commands"]
7047
7048 // Ensure that direct non-stubs dep is always included
7049 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7050
7051 // Ensure that runtime_libs dep in included
7052 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7053
7054 // Ensure libraries target the original min_sdk_version value rather than the overridden
7055 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7056}
7057
Jooyung Han214bf372019-11-12 13:03:50 +09007058func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007059 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007060 apex {
7061 name: "myapex",
7062 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007063 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007064 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007065 }
7066
7067 apex_key {
7068 name: "myapex.key",
7069 public_key: "testkey.avbpubkey",
7070 private_key: "testkey.pem",
7071 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007072
7073 cc_library {
7074 name: "mylib",
7075 srcs: ["mylib.cpp"],
7076 stl: "libc++",
7077 system_shared_libs: [],
7078 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007079 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007080 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007081 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007082
7083 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
7084 args := module.Rule("apexRule").Args
7085 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007086 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007087
7088 // The copies of the libraries in the apex should have one more dependency than
7089 // the ones outside the apex, namely the unwinder. Ideally we should check
7090 // the dependency names directly here but for some reason the names are blank in
7091 // this test.
7092 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007093 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007094 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7095 if len(apexImplicits) != len(nonApexImplicits)+1 {
7096 t.Errorf("%q missing unwinder dep", lib)
7097 }
7098 }
Jooyung Han214bf372019-11-12 13:03:50 +09007099}
7100
Paul Duffine05480a2021-03-08 15:07:14 +00007101var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007102 "api/current.txt": nil,
7103 "api/removed.txt": nil,
7104 "api/system-current.txt": nil,
7105 "api/system-removed.txt": nil,
7106 "api/test-current.txt": nil,
7107 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007108
Anton Hanssondff2c782020-12-21 17:10:01 +00007109 "100/public/api/foo.txt": nil,
7110 "100/public/api/foo-removed.txt": nil,
7111 "100/system/api/foo.txt": nil,
7112 "100/system/api/foo-removed.txt": nil,
7113
Paul Duffineedc5d52020-06-12 17:46:39 +01007114 // For java_sdk_library_import
7115 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007116}
7117
Jooyung Han58f26ab2019-12-18 15:34:32 +09007118func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007119 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007120 apex {
7121 name: "myapex",
7122 key: "myapex.key",
7123 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007124 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007125 }
7126
7127 apex_key {
7128 name: "myapex.key",
7129 public_key: "testkey.avbpubkey",
7130 private_key: "testkey.pem",
7131 }
7132
7133 java_sdk_library {
7134 name: "foo",
7135 srcs: ["a.java"],
7136 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007137 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007138 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007139
7140 prebuilt_apis {
7141 name: "sdk",
7142 api_dirs: ["100"],
7143 }
Paul Duffin9b879592020-05-26 13:21:35 +01007144 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007145
7146 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00007147 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007148 "javalib/foo.jar",
7149 "etc/permissions/foo.xml",
7150 })
7151 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007152 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007153 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 +09007154}
7155
Paul Duffin9b879592020-05-26 13:21:35 +01007156func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007157 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007158 apex {
7159 name: "myapex",
7160 key: "myapex.key",
7161 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007162 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007163 }
7164
7165 apex_key {
7166 name: "myapex.key",
7167 public_key: "testkey.avbpubkey",
7168 private_key: "testkey.pem",
7169 }
7170
7171 java_sdk_library {
7172 name: "foo",
7173 srcs: ["a.java"],
7174 api_packages: ["foo"],
7175 apex_available: ["myapex"],
7176 sdk_version: "none",
7177 system_modules: "none",
7178 }
7179
7180 java_library {
7181 name: "bar",
7182 srcs: ["a.java"],
7183 libs: ["foo"],
7184 apex_available: ["myapex"],
7185 sdk_version: "none",
7186 system_modules: "none",
7187 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007188
7189 prebuilt_apis {
7190 name: "sdk",
7191 api_dirs: ["100"],
7192 }
Paul Duffin9b879592020-05-26 13:21:35 +01007193 `, withFiles(filesForSdkLibrary))
7194
7195 // java_sdk_library installs both impl jar and permission XML
7196 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7197 "javalib/bar.jar",
7198 "javalib/foo.jar",
7199 "etc/permissions/foo.xml",
7200 })
7201
7202 // The bar library should depend on the implementation jar.
7203 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007204 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007205 t.Errorf("expected %q, found %#q", expected, actual)
7206 }
7207}
7208
7209func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007210 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007211 apex {
7212 name: "myapex",
7213 key: "myapex.key",
7214 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007215 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007216 }
7217
7218 apex_key {
7219 name: "myapex.key",
7220 public_key: "testkey.avbpubkey",
7221 private_key: "testkey.pem",
7222 }
7223
7224 java_sdk_library {
7225 name: "foo",
7226 srcs: ["a.java"],
7227 api_packages: ["foo"],
7228 apex_available: ["myapex"],
7229 sdk_version: "none",
7230 system_modules: "none",
7231 }
7232
7233 java_library {
7234 name: "bar",
7235 srcs: ["a.java"],
7236 libs: ["foo"],
7237 sdk_version: "none",
7238 system_modules: "none",
7239 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007240
7241 prebuilt_apis {
7242 name: "sdk",
7243 api_dirs: ["100"],
7244 }
Paul Duffin9b879592020-05-26 13:21:35 +01007245 `, withFiles(filesForSdkLibrary))
7246
7247 // java_sdk_library installs both impl jar and permission XML
7248 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7249 "javalib/foo.jar",
7250 "etc/permissions/foo.xml",
7251 })
7252
7253 // The bar library should depend on the stubs jar.
7254 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007255 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007256 t.Errorf("expected %q, found %#q", expected, actual)
7257 }
7258}
7259
Paul Duffineedc5d52020-06-12 17:46:39 +01007260func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007261 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007262 prebuilt_apis {
7263 name: "sdk",
7264 api_dirs: ["100"],
7265 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007266 withFiles(map[string][]byte{
7267 "apex/a.java": nil,
7268 "apex/apex_manifest.json": nil,
7269 "apex/Android.bp": []byte(`
7270 package {
7271 default_visibility: ["//visibility:private"],
7272 }
7273
7274 apex {
7275 name: "myapex",
7276 key: "myapex.key",
7277 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007278 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007279 }
7280
7281 apex_key {
7282 name: "myapex.key",
7283 public_key: "testkey.avbpubkey",
7284 private_key: "testkey.pem",
7285 }
7286
7287 java_library {
7288 name: "bar",
7289 srcs: ["a.java"],
7290 libs: ["foo"],
7291 apex_available: ["myapex"],
7292 sdk_version: "none",
7293 system_modules: "none",
7294 }
7295`),
7296 "source/a.java": nil,
7297 "source/api/current.txt": nil,
7298 "source/api/removed.txt": nil,
7299 "source/Android.bp": []byte(`
7300 package {
7301 default_visibility: ["//visibility:private"],
7302 }
7303
7304 java_sdk_library {
7305 name: "foo",
7306 visibility: ["//apex"],
7307 srcs: ["a.java"],
7308 api_packages: ["foo"],
7309 apex_available: ["myapex"],
7310 sdk_version: "none",
7311 system_modules: "none",
7312 public: {
7313 enabled: true,
7314 },
7315 }
7316`),
7317 "prebuilt/a.jar": nil,
7318 "prebuilt/Android.bp": []byte(`
7319 package {
7320 default_visibility: ["//visibility:private"],
7321 }
7322
7323 java_sdk_library_import {
7324 name: "foo",
7325 visibility: ["//apex", "//source"],
7326 apex_available: ["myapex"],
7327 prefer: true,
7328 public: {
7329 jars: ["a.jar"],
7330 },
7331 }
7332`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007333 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007334 )
7335
7336 // java_sdk_library installs both impl jar and permission XML
7337 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7338 "javalib/bar.jar",
7339 "javalib/foo.jar",
7340 "etc/permissions/foo.xml",
7341 })
7342
7343 // The bar library should depend on the implementation jar.
7344 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007345 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007346 t.Errorf("expected %q, found %#q", expected, actual)
7347 }
7348}
7349
7350func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7351 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7352 apex {
7353 name: "myapex",
7354 key: "myapex.key",
7355 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007356 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007357 }
7358
7359 apex_key {
7360 name: "myapex.key",
7361 public_key: "testkey.avbpubkey",
7362 private_key: "testkey.pem",
7363 }
7364
7365 java_sdk_library_import {
7366 name: "foo",
7367 apex_available: ["myapex"],
7368 prefer: true,
7369 public: {
7370 jars: ["a.jar"],
7371 },
7372 }
7373
7374 `, withFiles(filesForSdkLibrary))
7375}
7376
atrost6e126252020-01-27 17:01:16 +00007377func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007378 result := android.GroupFixturePreparers(
7379 prepareForApexTest,
7380 java.PrepareForTestWithPlatformCompatConfig,
7381 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007382 apex {
7383 name: "myapex",
7384 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007385 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007386 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007387 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007388 }
7389
7390 apex_key {
7391 name: "myapex.key",
7392 public_key: "testkey.avbpubkey",
7393 private_key: "testkey.pem",
7394 }
7395
7396 platform_compat_config {
7397 name: "myjar-platform-compat-config",
7398 src: ":myjar",
7399 }
7400
7401 java_library {
7402 name: "myjar",
7403 srcs: ["foo/bar/MyClass.java"],
7404 sdk_version: "none",
7405 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007406 apex_available: [ "myapex" ],
7407 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007408
7409 // Make sure that a preferred prebuilt does not affect the apex contents.
7410 prebuilt_platform_compat_config {
7411 name: "myjar-platform-compat-config",
7412 metadata: "compat-config/metadata.xml",
7413 prefer: true,
7414 }
atrost6e126252020-01-27 17:01:16 +00007415 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007416 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007417 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7418 "etc/compatconfig/myjar-platform-compat-config.xml",
7419 "javalib/myjar.jar",
7420 })
7421}
7422
Jooyung Han862c0d62022-12-21 10:15:37 +09007423func TestNoDupeApexFiles(t *testing.T) {
7424 android.GroupFixturePreparers(
7425 android.PrepareForTestWithAndroidBuildComponents,
7426 PrepareForTestWithApexBuildComponents,
7427 prepareForTestWithMyapex,
7428 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7429 ).
7430 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7431 RunTestWithBp(t, `
7432 apex {
7433 name: "myapex",
7434 key: "myapex.key",
7435 prebuilts: ["foo", "bar"],
7436 updatable: false,
7437 }
7438
7439 apex_key {
7440 name: "myapex.key",
7441 public_key: "testkey.avbpubkey",
7442 private_key: "testkey.pem",
7443 }
7444
7445 prebuilt_etc {
7446 name: "foo",
7447 src: "myprebuilt",
7448 filename_from_src: true,
7449 }
7450
7451 prebuilt_etc {
7452 name: "bar",
7453 src: "myprebuilt",
7454 filename_from_src: true,
7455 }
7456 `)
7457}
7458
Jiyong Park479321d2019-12-16 11:47:12 +09007459func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7460 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7461 apex {
7462 name: "myapex",
7463 key: "myapex.key",
7464 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007465 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007466 }
7467
7468 apex_key {
7469 name: "myapex.key",
7470 public_key: "testkey.avbpubkey",
7471 private_key: "testkey.pem",
7472 }
7473
7474 java_library {
7475 name: "myjar",
7476 srcs: ["foo/bar/MyClass.java"],
7477 sdk_version: "none",
7478 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007479 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007480 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007481 }
7482 `)
7483}
7484
Jiyong Park7afd1072019-12-30 16:56:33 +09007485func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007486 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007487 apex {
7488 name: "myapex",
7489 key: "myapex.key",
7490 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007491 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007492 }
7493
7494 apex_key {
7495 name: "myapex.key",
7496 public_key: "testkey.avbpubkey",
7497 private_key: "testkey.pem",
7498 }
7499
7500 cc_library {
7501 name: "mylib",
7502 srcs: ["mylib.cpp"],
7503 system_shared_libs: [],
7504 stl: "none",
7505 required: ["a", "b"],
7506 host_required: ["c", "d"],
7507 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007508 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007509 }
7510 `)
7511
7512 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007513 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007514 name := apexBundle.BaseModuleName()
7515 prefix := "TARGET_"
7516 var builder strings.Builder
7517 data.Custom(&builder, name, prefix, "", data)
7518 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007519 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 -08007520 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7521 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007522}
7523
Jiyong Park7cd10e32020-01-14 09:22:18 +09007524func TestSymlinksFromApexToSystem(t *testing.T) {
7525 bp := `
7526 apex {
7527 name: "myapex",
7528 key: "myapex.key",
7529 native_shared_libs: ["mylib"],
7530 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007531 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007532 }
7533
Jiyong Park9d677202020-02-19 16:29:35 +09007534 apex {
7535 name: "myapex.updatable",
7536 key: "myapex.key",
7537 native_shared_libs: ["mylib"],
7538 java_libs: ["myjar"],
7539 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007540 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007541 }
7542
Jiyong Park7cd10e32020-01-14 09:22:18 +09007543 apex_key {
7544 name: "myapex.key",
7545 public_key: "testkey.avbpubkey",
7546 private_key: "testkey.pem",
7547 }
7548
7549 cc_library {
7550 name: "mylib",
7551 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007552 shared_libs: [
7553 "myotherlib",
7554 "myotherlib_ext",
7555 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007556 system_shared_libs: [],
7557 stl: "none",
7558 apex_available: [
7559 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007560 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007561 "//apex_available:platform",
7562 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007563 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007564 }
7565
7566 cc_library {
7567 name: "myotherlib",
7568 srcs: ["mylib.cpp"],
7569 system_shared_libs: [],
7570 stl: "none",
7571 apex_available: [
7572 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007573 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007574 "//apex_available:platform",
7575 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007576 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007577 }
7578
Jiyong Parkce243632023-02-17 18:22:25 +09007579 cc_library {
7580 name: "myotherlib_ext",
7581 srcs: ["mylib.cpp"],
7582 system_shared_libs: [],
7583 system_ext_specific: true,
7584 stl: "none",
7585 apex_available: [
7586 "myapex",
7587 "myapex.updatable",
7588 "//apex_available:platform",
7589 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007590 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007591 }
7592
Jiyong Park7cd10e32020-01-14 09:22:18 +09007593 java_library {
7594 name: "myjar",
7595 srcs: ["foo/bar/MyClass.java"],
7596 sdk_version: "none",
7597 system_modules: "none",
7598 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007599 apex_available: [
7600 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007601 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007602 "//apex_available:platform",
7603 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007604 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007605 }
7606
7607 java_library {
7608 name: "myotherjar",
7609 srcs: ["foo/bar/MyClass.java"],
7610 sdk_version: "none",
7611 system_modules: "none",
7612 apex_available: [
7613 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007614 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007615 "//apex_available:platform",
7616 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007617 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007618 }
7619 `
7620
7621 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7622 for _, f := range files {
7623 if f.path == file {
7624 if f.isLink {
7625 t.Errorf("%q is not a real file", file)
7626 }
7627 return
7628 }
7629 }
7630 t.Errorf("%q is not found", file)
7631 }
7632
Jiyong Parkce243632023-02-17 18:22:25 +09007633 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007634 for _, f := range files {
7635 if f.path == file {
7636 if !f.isLink {
7637 t.Errorf("%q is not a symlink", file)
7638 }
Jiyong Parkce243632023-02-17 18:22:25 +09007639 if f.src != target {
7640 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7641 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007642 return
7643 }
7644 }
7645 t.Errorf("%q is not found", file)
7646 }
7647
Jiyong Park9d677202020-02-19 16:29:35 +09007648 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7649 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007650 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007651 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007652 ensureRealfileExists(t, files, "javalib/myjar.jar")
7653 ensureRealfileExists(t, files, "lib64/mylib.so")
7654 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007655 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007656
Jiyong Park9d677202020-02-19 16:29:35 +09007657 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7658 ensureRealfileExists(t, files, "javalib/myjar.jar")
7659 ensureRealfileExists(t, files, "lib64/mylib.so")
7660 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007661 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007662
7663 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007664 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007665 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007666 ensureRealfileExists(t, files, "javalib/myjar.jar")
7667 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007668 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7669 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007670
7671 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7672 ensureRealfileExists(t, files, "javalib/myjar.jar")
7673 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007674 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7675 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007676}
7677
Yo Chiange8128052020-07-23 20:09:18 +08007678func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007679 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007680 apex {
7681 name: "myapex",
7682 key: "myapex.key",
7683 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007684 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007685 }
7686
7687 apex_key {
7688 name: "myapex.key",
7689 public_key: "testkey.avbpubkey",
7690 private_key: "testkey.pem",
7691 }
7692
7693 cc_library_shared {
7694 name: "mylib",
7695 srcs: ["mylib.cpp"],
7696 shared_libs: ["myotherlib"],
7697 system_shared_libs: [],
7698 stl: "none",
7699 apex_available: [
7700 "myapex",
7701 "//apex_available:platform",
7702 ],
7703 }
7704
7705 cc_prebuilt_library_shared {
7706 name: "myotherlib",
7707 srcs: ["prebuilt.so"],
7708 system_shared_libs: [],
7709 stl: "none",
7710 apex_available: [
7711 "myapex",
7712 "//apex_available:platform",
7713 ],
7714 }
7715 `)
7716
Prerana Patilb1896c82022-11-09 18:14:34 +00007717 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007718 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007719 var builder strings.Builder
7720 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7721 androidMk := builder.String()
7722 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007723 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007724 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7725 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7726 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007727 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 +08007728}
7729
Jooyung Han643adc42020-02-27 13:50:06 +09007730func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007731 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007732 apex {
7733 name: "myapex",
7734 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007735 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007736 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007737 }
7738
7739 apex_key {
7740 name: "myapex.key",
7741 public_key: "testkey.avbpubkey",
7742 private_key: "testkey.pem",
7743 }
7744
7745 cc_library {
7746 name: "mylib",
7747 srcs: ["mylib.cpp"],
7748 shared_libs: ["mylib2"],
7749 system_shared_libs: [],
7750 stl: "none",
7751 apex_available: [ "myapex" ],
7752 }
7753
7754 cc_library {
7755 name: "mylib2",
7756 srcs: ["mylib.cpp"],
7757 system_shared_libs: [],
7758 stl: "none",
7759 apex_available: [ "myapex" ],
7760 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007761
7762 rust_ffi_shared {
7763 name: "libfoo.rust",
7764 crate_name: "foo",
7765 srcs: ["foo.rs"],
7766 shared_libs: ["libfoo.shared_from_rust"],
7767 prefer_rlib: true,
7768 apex_available: ["myapex"],
7769 }
7770
7771 cc_library_shared {
7772 name: "libfoo.shared_from_rust",
7773 srcs: ["mylib.cpp"],
7774 system_shared_libs: [],
7775 stl: "none",
7776 stubs: {
7777 versions: ["10", "11", "12"],
7778 },
7779 }
7780
Jooyung Han643adc42020-02-27 13:50:06 +09007781 `)
7782
7783 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7784 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007785 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007786 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7787 "lib64/mylib.so",
7788 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007789 "lib64/libfoo.rust.so",
7790 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7791 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007792 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007793
7794 // b/220397949
7795 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007796}
7797
Jooyung Han49f67012020-04-17 13:43:10 +09007798func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007799 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007800 apex {
7801 name: "myapex",
7802 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007803 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007804 }
7805 apex_key {
7806 name: "myapex.key",
7807 public_key: "testkey.avbpubkey",
7808 private_key: "testkey.pem",
7809 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007810 `,
7811 android.FixtureModifyConfig(func(config android.Config) {
7812 delete(config.Targets, android.Android)
7813 config.AndroidCommonTarget = android.Target{}
7814 }),
7815 )
Jooyung Han49f67012020-04-17 13:43:10 +09007816
7817 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7818 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7819 }
7820}
7821
Jiyong Parkbd159612020-02-28 15:22:21 +09007822func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007823 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007824 apex {
7825 name: "myapex",
7826 key: "myapex.key",
7827 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007828 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007829 }
7830
7831 apex_key {
7832 name: "myapex.key",
7833 public_key: "testkey.avbpubkey",
7834 private_key: "testkey.pem",
7835 }
7836
7837 android_app {
7838 name: "AppFoo",
7839 srcs: ["foo/bar/MyClass.java"],
7840 sdk_version: "none",
7841 system_modules: "none",
7842 apex_available: [ "myapex" ],
7843 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007844 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007845
Colin Crosscf371cc2020-11-13 11:48:42 -08007846 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007847 content := bundleConfigRule.Args["content"]
7848
7849 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007850 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 +09007851}
7852
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007853func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007854 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007855 apex {
7856 name: "myapex",
7857 key: "myapex.key",
7858 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007859 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007860 }
7861
7862 apex_key {
7863 name: "myapex.key",
7864 public_key: "testkey.avbpubkey",
7865 private_key: "testkey.pem",
7866 }
7867
7868 android_app_set {
7869 name: "AppSet",
7870 set: "AppSet.apks",
7871 }`)
7872 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007873 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007874 content := bundleConfigRule.Args["content"]
7875 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7876 s := mod.Rule("apexRule").Args["copy_commands"]
7877 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007878 if len(copyCmds) != 4 {
7879 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007880 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007881 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7882 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007883 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7884 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007885
7886 // Ensure that canned_fs_config has an entry for the app set zip file
7887 generateFsRule := mod.Rule("generateFsConfig")
7888 cmd := generateFsRule.RuleParams.Command
7889 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007890}
7891
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007892func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007893 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007894 apex_set {
7895 name: "myapex",
7896 filename: "foo_v2.apex",
7897 sanitized: {
7898 none: { set: "myapex.apks", },
7899 hwaddress: { set: "myapex.hwasan.apks", },
7900 },
Paul Duffin24704672021-04-06 16:09:30 +01007901 }
7902 `
7903 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007904
Paul Duffin24704672021-04-06 16:09:30 +01007905 // Check that the extractor produces the correct output file from the correct input file.
7906 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007907
Paul Duffin24704672021-04-06 16:09:30 +01007908 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7909 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007910
Paul Duffin24704672021-04-06 16:09:30 +01007911 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7912
7913 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007914 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7915 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007916
7917 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007918}
7919
Pranav Guptaeba03b02022-09-27 00:27:08 +00007920func TestApexSetApksModuleAssignment(t *testing.T) {
7921 ctx := testApex(t, `
7922 apex_set {
7923 name: "myapex",
7924 set: ":myapex_apks_file",
7925 }
7926
7927 filegroup {
7928 name: "myapex_apks_file",
7929 srcs: ["myapex.apks"],
7930 }
7931 `)
7932
7933 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7934
7935 // Check that the extractor produces the correct apks file from the input module
7936 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7937 extractedApex := m.Output(extractorOutput)
7938
7939 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7940}
7941
Paul Duffin89f570a2021-06-16 01:42:33 +01007942func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007943 t.Helper()
7944
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007945 bp := `
7946 java_library {
7947 name: "some-updatable-apex-lib",
7948 srcs: ["a.java"],
7949 sdk_version: "current",
7950 apex_available: [
7951 "some-updatable-apex",
7952 ],
satayevabcd5972021-08-06 17:49:46 +01007953 permitted_packages: ["some.updatable.apex.lib"],
Spandan Dascc9d9422023-04-06 18:07:43 +00007954 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007955 }
7956
7957 java_library {
7958 name: "some-non-updatable-apex-lib",
7959 srcs: ["a.java"],
7960 apex_available: [
7961 "some-non-updatable-apex",
7962 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007963 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007964 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007965 }
7966
7967 bootclasspath_fragment {
7968 name: "some-non-updatable-fragment",
7969 contents: ["some-non-updatable-apex-lib"],
7970 apex_available: [
7971 "some-non-updatable-apex",
7972 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007973 hidden_api: {
7974 split_packages: ["*"],
7975 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007976 }
7977
7978 java_library {
7979 name: "some-platform-lib",
7980 srcs: ["a.java"],
7981 sdk_version: "current",
7982 installable: true,
7983 }
7984
7985 java_library {
7986 name: "some-art-lib",
7987 srcs: ["a.java"],
7988 sdk_version: "current",
7989 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007990 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007991 ],
7992 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007993 compile_dex: 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-updatable-apex",
7999 key: "some-updatable-apex.key",
8000 java_libs: ["some-updatable-apex-lib"],
8001 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00008002 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008003 }
8004
8005 apex {
8006 name: "some-non-updatable-apex",
8007 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01008008 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008009 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008010 }
8011
8012 apex_key {
8013 name: "some-updatable-apex.key",
8014 }
8015
8016 apex_key {
8017 name: "some-non-updatable-apex.key",
8018 }
8019
8020 apex {
Paul Duffind376f792021-01-26 11:59:35 +00008021 name: "com.android.art.debug",
8022 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01008023 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008024 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00008025 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008026 }
8027
Paul Duffinf23bc472021-04-27 12:42:20 +01008028 bootclasspath_fragment {
8029 name: "art-bootclasspath-fragment",
8030 image_name: "art",
8031 contents: ["some-art-lib"],
8032 apex_available: [
8033 "com.android.art.debug",
8034 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01008035 hidden_api: {
8036 split_packages: ["*"],
8037 },
Paul Duffinf23bc472021-04-27 12:42:20 +01008038 }
8039
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008040 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00008041 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008042 }
8043
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008044 filegroup {
8045 name: "some-updatable-apex-file_contexts",
8046 srcs: [
8047 "system/sepolicy/apex/some-updatable-apex-file_contexts",
8048 ],
8049 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008050
8051 filegroup {
8052 name: "some-non-updatable-apex-file_contexts",
8053 srcs: [
8054 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
8055 ],
8056 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008057 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00008058
Paul Duffin89f570a2021-06-16 01:42:33 +01008059 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00008060}
8061
Paul Duffin89f570a2021-06-16 01:42:33 +01008062func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008063 t.Helper()
8064
Paul Duffin55607122021-03-30 23:32:51 +01008065 fs := android.MockFS{
8066 "a.java": nil,
8067 "a.jar": nil,
8068 "apex_manifest.json": nil,
8069 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008070 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008071 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8072 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8073 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008074 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008075 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008076
Paul Duffin55607122021-03-30 23:32:51 +01008077 errorHandler := android.FixtureExpectsNoErrors
8078 if errmsg != "" {
8079 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008080 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008081
Paul Duffin55607122021-03-30 23:32:51 +01008082 result := android.GroupFixturePreparers(
8083 cc.PrepareForTestWithCcDefaultModules,
8084 java.PrepareForTestWithHiddenApiBuildComponents,
8085 java.PrepareForTestWithJavaDefaultModules,
8086 java.PrepareForTestWithJavaSdkLibraryFiles,
8087 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008088 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008089 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008090 android.FixtureModifyMockFS(func(fs android.MockFS) {
8091 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8092 insert := ""
8093 for _, fragment := range fragments {
8094 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8095 }
8096 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8097 platform_bootclasspath {
8098 name: "platform-bootclasspath",
8099 fragments: [
8100 %s
8101 ],
8102 }
8103 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008104 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008105 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008106 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008107 ).
8108 ExtendWithErrorHandler(errorHandler).
8109 RunTestWithBp(t, bp)
8110
8111 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008112}
8113
Paul Duffin5556c5f2022-06-09 17:32:21 +00008114func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008115 preparers := android.GroupFixturePreparers(
8116 java.PrepareForTestWithJavaDefaultModules,
8117 PrepareForTestWithApexBuildComponents,
8118 ).
8119 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
8120 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
8121
8122 bpBase := `
8123 apex_set {
8124 name: "com.android.myapex",
8125 installable: true,
8126 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8127 set: "myapex.apks",
8128 }
8129
8130 apex_set {
8131 name: "com.mycompany.android.myapex",
8132 apex_name: "com.android.myapex",
8133 installable: true,
8134 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8135 set: "company-myapex.apks",
8136 }
8137
8138 prebuilt_bootclasspath_fragment {
8139 name: "my-bootclasspath-fragment",
8140 apex_available: ["com.android.myapex"],
8141 %s
8142 }
8143 `
8144
8145 t.Run("java_import", func(t *testing.T) {
8146 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8147 java_import {
8148 name: "libfoo",
8149 jars: ["libfoo.jar"],
8150 apex_available: ["com.android.myapex"],
8151 }
8152 `)
8153 })
8154
8155 t.Run("java_sdk_library_import", func(t *testing.T) {
8156 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8157 java_sdk_library_import {
8158 name: "libfoo",
8159 public: {
8160 jars: ["libbar.jar"],
8161 },
8162 apex_available: ["com.android.myapex"],
8163 }
8164 `)
8165 })
8166
8167 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8168 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8169 image_name: "art",
8170 contents: ["libfoo"],
8171 `)+`
8172 java_sdk_library_import {
8173 name: "libfoo",
8174 public: {
8175 jars: ["libbar.jar"],
8176 },
8177 apex_available: ["com.android.myapex"],
8178 }
8179 `)
8180 })
8181}
8182
Paul Duffin5556c5f2022-06-09 17:32:21 +00008183func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8184 preparers := android.GroupFixturePreparers(
8185 java.PrepareForTestWithJavaDefaultModules,
8186 PrepareForTestWithApexBuildComponents,
8187 )
8188
8189 bpBase := `
8190 apex_set {
8191 name: "com.android.myapex",
8192 installable: true,
8193 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8194 set: "myapex.apks",
8195 }
8196
8197 apex_set {
8198 name: "com.android.myapex_compressed",
8199 apex_name: "com.android.myapex",
8200 installable: true,
8201 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8202 set: "myapex_compressed.apks",
8203 }
8204
8205 prebuilt_bootclasspath_fragment {
8206 name: "my-bootclasspath-fragment",
8207 apex_available: [
8208 "com.android.myapex",
8209 "com.android.myapex_compressed",
8210 ],
8211 hidden_api: {
8212 annotation_flags: "annotation-flags.csv",
8213 metadata: "metadata.csv",
8214 index: "index.csv",
8215 signature_patterns: "signature_patterns.csv",
8216 },
8217 %s
8218 }
8219 `
8220
8221 t.Run("java_import", func(t *testing.T) {
8222 result := preparers.RunTestWithBp(t,
8223 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8224 java_import {
8225 name: "libfoo",
8226 jars: ["libfoo.jar"],
8227 apex_available: [
8228 "com.android.myapex",
8229 "com.android.myapex_compressed",
8230 ],
8231 }
8232 `)
8233
8234 module := result.Module("libfoo", "android_common_com.android.myapex")
8235 usesLibraryDep := module.(java.UsesLibraryDependency)
8236 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8237 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8238 usesLibraryDep.DexJarBuildPath().Path())
8239 })
8240
8241 t.Run("java_sdk_library_import", func(t *testing.T) {
8242 result := preparers.RunTestWithBp(t,
8243 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8244 java_sdk_library_import {
8245 name: "libfoo",
8246 public: {
8247 jars: ["libbar.jar"],
8248 },
8249 apex_available: [
8250 "com.android.myapex",
8251 "com.android.myapex_compressed",
8252 ],
8253 compile_dex: true,
8254 }
8255 `)
8256
8257 module := result.Module("libfoo", "android_common_com.android.myapex")
8258 usesLibraryDep := module.(java.UsesLibraryDependency)
8259 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8260 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8261 usesLibraryDep.DexJarBuildPath().Path())
8262 })
8263
8264 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8265 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8266 image_name: "art",
8267 contents: ["libfoo"],
8268 `)+`
8269 java_sdk_library_import {
8270 name: "libfoo",
8271 public: {
8272 jars: ["libbar.jar"],
8273 },
8274 apex_available: [
8275 "com.android.myapex",
8276 "com.android.myapex_compressed",
8277 ],
8278 compile_dex: true,
8279 }
8280 `)
8281 })
8282}
8283
Jooyung Han548640b2020-04-27 12:10:30 +09008284func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8285 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8286 apex {
8287 name: "myapex",
8288 key: "myapex.key",
8289 updatable: true,
8290 }
8291
8292 apex_key {
8293 name: "myapex.key",
8294 public_key: "testkey.avbpubkey",
8295 private_key: "testkey.pem",
8296 }
8297 `)
8298}
8299
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008300func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8301 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8302 apex {
8303 name: "myapex",
8304 key: "myapex.key",
8305 }
8306
8307 apex_key {
8308 name: "myapex.key",
8309 public_key: "testkey.avbpubkey",
8310 private_key: "testkey.pem",
8311 }
8312 `)
8313}
8314
Jooyung Handfc864c2023-03-20 18:19:07 +09008315func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8316 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008317 apex {
8318 name: "myapex",
8319 key: "myapex.key",
8320 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008321 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008322 soc_specific: true,
8323 }
8324
8325 apex_key {
8326 name: "myapex.key",
8327 public_key: "testkey.avbpubkey",
8328 private_key: "testkey.pem",
8329 }
8330 `)
8331}
8332
Jooyung Han02873da2023-03-22 17:41:03 +09008333func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8334 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8335 apex {
8336 name: "myapex",
8337 key: "myapex.key",
8338 updatable: false,
8339 min_sdk_version: "29",
8340 use_vndk_as_stable: true,
8341 vendor: true,
8342 }
8343
8344 apex_key {
8345 name: "myapex.key",
8346 public_key: "testkey.avbpubkey",
8347 private_key: "testkey.pem",
8348 }
8349 `)
8350}
8351
Jooyung Handfc864c2023-03-20 18:19:07 +09008352func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8353 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8354 apex {
8355 name: "myapex",
8356 key: "myapex.key",
8357 updatable: false,
8358 use_vndk_as_stable: true,
8359 }
8360
8361 apex_key {
8362 name: "myapex.key",
8363 public_key: "testkey.avbpubkey",
8364 private_key: "testkey.pem",
8365 }
8366 `)
8367}
8368
satayevb98371c2021-06-15 16:49:50 +01008369func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8370 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8371 apex {
8372 name: "myapex",
8373 key: "myapex.key",
8374 systemserverclasspath_fragments: [
8375 "mysystemserverclasspathfragment",
8376 ],
8377 min_sdk_version: "29",
8378 updatable: true,
8379 }
8380
8381 apex_key {
8382 name: "myapex.key",
8383 public_key: "testkey.avbpubkey",
8384 private_key: "testkey.pem",
8385 }
8386
8387 java_library {
8388 name: "foo",
8389 srcs: ["b.java"],
8390 min_sdk_version: "29",
8391 installable: true,
8392 apex_available: [
8393 "myapex",
8394 ],
8395 }
8396
8397 systemserverclasspath_fragment {
8398 name: "mysystemserverclasspathfragment",
8399 generate_classpaths_proto: false,
8400 contents: [
8401 "foo",
8402 ],
8403 apex_available: [
8404 "myapex",
8405 ],
8406 }
satayevabcd5972021-08-06 17:49:46 +01008407 `,
8408 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8409 )
satayevb98371c2021-06-15 16:49:50 +01008410}
8411
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008412func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008413 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
8414 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
8415 // modules to be included in the BootJars.
8416 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
8417 return android.GroupFixturePreparers(
8418 dexpreopt.FixtureSetBootJars(bootJars...),
8419 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8420 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8421 }),
8422 )
8423 }
8424
8425 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
8426 // same value. This can result in an invalid configuration as it allows non art apex jars to be
8427 // specified in the ArtApexJars configuration.
8428 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
8429 return android.GroupFixturePreparers(
8430 dexpreopt.FixtureSetArtBootJars(bootJars...),
8431 dexpreopt.FixtureSetBootJars(bootJars...),
8432 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8433 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8434 }),
8435 )
8436 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008437
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008438 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008439 preparer := android.GroupFixturePreparers(
8440 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
8441 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8442 )
8443 fragments := []java.ApexVariantReference{
8444 {
8445 Apex: proptools.StringPtr("com.android.art.debug"),
8446 Module: proptools.StringPtr("art-bootclasspath-fragment"),
8447 },
8448 {
8449 Apex: proptools.StringPtr("some-non-updatable-apex"),
8450 Module: proptools.StringPtr("some-non-updatable-fragment"),
8451 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008452 }
satayevabcd5972021-08-06 17:49:46 +01008453 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008454 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008455
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008456 t.Run("updatable jar from ART apex in the platform bootclasspath => error", func(t *testing.T) {
8457 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the platform bootclasspath`
Paul Duffin60264a02021-04-12 20:02:36 +01008458 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01008459 preparer := android.GroupFixturePreparers(
8460 prepareSetBootJars("com.android.art.debug:some-art-lib"),
8461 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8462 )
Paul Duffin60264a02021-04-12 20:02:36 +01008463 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008464 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008465
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008466 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 +01008467 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 +01008468 // Update the dexpreopt ArtApexJars directly.
8469 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
8470 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008471 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008472
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008473 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 +01008474 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 +01008475 // Update the dexpreopt ArtApexJars directly.
8476 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
8477 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008478 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008479
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008480 t.Run("updatable jar from some other apex in the platform bootclasspath => error", func(t *testing.T) {
8481 err := `module "some-updatable-apex-lib" from updatable apexes \["some-updatable-apex"\] is not allowed in the platform bootclasspath`
satayevabcd5972021-08-06 17:49:46 +01008482 preparer := android.GroupFixturePreparers(
8483 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
8484 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8485 )
Paul Duffin60264a02021-04-12 20:02:36 +01008486 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008487 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008488
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008489 t.Run("non-updatable jar from some other apex in the platform bootclasspath => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008490 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01008491 fragment := java.ApexVariantReference{
8492 Apex: proptools.StringPtr("some-non-updatable-apex"),
8493 Module: proptools.StringPtr("some-non-updatable-fragment"),
8494 }
8495 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008496 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008497
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008498 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008499 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008500 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8501 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008502 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008503
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008504 t.Run("nonexistent jar in the platform bootclasspath => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008505 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008506 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8507 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008508 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008509
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008510 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008511 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01008512 // Update the dexpreopt ArtApexJars directly.
8513 preparer := prepareSetArtJars("platform:some-platform-lib")
8514 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008515 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008516
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008517 t.Run("platform jar in the platform bootclasspath => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008518 preparer := android.GroupFixturePreparers(
8519 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8520 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8521 )
8522 fragments := []java.ApexVariantReference{
8523 {
8524 Apex: proptools.StringPtr("some-non-updatable-apex"),
8525 Module: proptools.StringPtr("some-non-updatable-fragment"),
8526 },
8527 }
8528 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008529 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008530}
8531
8532func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008533 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008534 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008535 fragment := java.ApexVariantReference{
8536 Apex: proptools.StringPtr("myapex"),
8537 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8538 }
8539
Paul Duffin064b70c2020-11-02 17:32:38 +00008540 testDexpreoptWithApexes(t, `
8541 prebuilt_apex {
8542 name: "myapex" ,
8543 arch: {
8544 arm64: {
8545 src: "myapex-arm64.apex",
8546 },
8547 arm: {
8548 src: "myapex-arm.apex",
8549 },
8550 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008551 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8552 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008553
Paul Duffin89f570a2021-06-16 01:42:33 +01008554 prebuilt_bootclasspath_fragment {
8555 name: "my-bootclasspath-fragment",
8556 contents: ["libfoo"],
8557 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008558 hidden_api: {
8559 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8560 metadata: "my-bootclasspath-fragment/metadata.csv",
8561 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008562 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8563 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8564 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008565 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008566 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008567
Paul Duffin89f570a2021-06-16 01:42:33 +01008568 java_import {
8569 name: "libfoo",
8570 jars: ["libfoo.jar"],
8571 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008572 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008573 }
8574 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008575 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008576}
8577
Spandan Dasf14e2542021-11-12 00:01:37 +00008578func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008579 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008580 bp += `
8581 apex_key {
8582 name: "myapex.key",
8583 public_key: "testkey.avbpubkey",
8584 private_key: "testkey.pem",
8585 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008586 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008587 "lib1/src/A.java": nil,
8588 "lib2/src/B.java": nil,
8589 "system/sepolicy/apex/myapex-file_contexts": nil,
8590 }
8591
Paul Duffin45338f02021-03-30 23:07:52 +01008592 errorHandler := android.FixtureExpectsNoErrors
8593 if errmsg != "" {
8594 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008595 }
Colin Crossae8600b2020-10-29 17:09:13 -07008596
Paul Duffin45338f02021-03-30 23:07:52 +01008597 android.GroupFixturePreparers(
8598 android.PrepareForTestWithAndroidBuildComponents,
8599 java.PrepareForTestWithJavaBuildComponents,
8600 PrepareForTestWithApexBuildComponents,
8601 android.PrepareForTestWithNeverallowRules(rules),
8602 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008603 apexBootJars := make([]string, 0, len(bootJars))
8604 for _, apexBootJar := range bootJars {
8605 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008606 }
satayevd604b212021-07-21 14:23:52 +01008607 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008608 }),
8609 fs.AddToFixture(),
8610 ).
8611 ExtendWithErrorHandler(errorHandler).
8612 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008613}
8614
8615func TestApexPermittedPackagesRules(t *testing.T) {
8616 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008617 name string
8618 expectedError string
8619 bp string
8620 bootJars []string
8621 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008622 }{
8623
8624 {
8625 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8626 expectedError: "",
8627 bp: `
8628 java_library {
8629 name: "bcp_lib1",
8630 srcs: ["lib1/src/*.java"],
8631 permitted_packages: ["foo.bar"],
8632 apex_available: ["myapex"],
8633 sdk_version: "none",
8634 system_modules: "none",
8635 }
8636 java_library {
8637 name: "nonbcp_lib2",
8638 srcs: ["lib2/src/*.java"],
8639 apex_available: ["myapex"],
8640 permitted_packages: ["a.b"],
8641 sdk_version: "none",
8642 system_modules: "none",
8643 }
8644 apex {
8645 name: "myapex",
8646 key: "myapex.key",
8647 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008648 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008649 }`,
8650 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008651 bcpPermittedPackages: map[string][]string{
8652 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008653 "foo.bar",
8654 },
8655 },
8656 },
8657 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008658 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008659 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 +01008660 bp: `
8661 java_library {
8662 name: "bcp_lib1",
8663 srcs: ["lib1/src/*.java"],
8664 apex_available: ["myapex"],
8665 permitted_packages: ["foo.bar"],
8666 sdk_version: "none",
8667 system_modules: "none",
8668 }
8669 java_library {
8670 name: "bcp_lib2",
8671 srcs: ["lib2/src/*.java"],
8672 apex_available: ["myapex"],
8673 permitted_packages: ["foo.bar", "bar.baz"],
8674 sdk_version: "none",
8675 system_modules: "none",
8676 }
8677 apex {
8678 name: "myapex",
8679 key: "myapex.key",
8680 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008681 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008682 }
8683 `,
8684 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008685 bcpPermittedPackages: map[string][]string{
8686 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008687 "foo.bar",
8688 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008689 "bcp_lib2": []string{
8690 "foo.bar",
8691 },
8692 },
8693 },
8694 {
8695 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8696 expectedError: "",
8697 bp: `
8698 java_library {
8699 name: "bcp_lib_restricted",
8700 srcs: ["lib1/src/*.java"],
8701 apex_available: ["myapex"],
8702 permitted_packages: ["foo.bar"],
8703 sdk_version: "none",
8704 min_sdk_version: "29",
8705 system_modules: "none",
8706 }
8707 java_library {
8708 name: "bcp_lib_unrestricted",
8709 srcs: ["lib2/src/*.java"],
8710 apex_available: ["myapex"],
8711 permitted_packages: ["foo.bar", "bar.baz"],
8712 sdk_version: "none",
8713 min_sdk_version: "29",
8714 system_modules: "none",
8715 }
8716 apex {
8717 name: "myapex",
8718 key: "myapex.key",
8719 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8720 updatable: true,
8721 min_sdk_version: "29",
8722 }
8723 `,
8724 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8725 bcpPermittedPackages: map[string][]string{
8726 "bcp_lib1_non_updateable": []string{
8727 "foo.bar",
8728 },
8729 // 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 +01008730 },
8731 },
8732 }
8733 for _, tc := range testcases {
8734 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008735 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8736 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008737 })
8738 }
8739}
8740
Jiyong Park62304bb2020-04-13 16:19:48 +09008741func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008742 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008743 apex {
8744 name: "myapex",
8745 key: "myapex.key",
8746 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008747 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008748 }
8749
8750 apex_key {
8751 name: "myapex.key",
8752 public_key: "testkey.avbpubkey",
8753 private_key: "testkey.pem",
8754 }
8755
8756 cc_library {
8757 name: "mylib",
8758 srcs: ["mylib.cpp"],
8759 system_shared_libs: [],
8760 stl: "none",
8761 stubs: {
8762 versions: ["1"],
8763 },
8764 apex_available: ["myapex"],
8765 }
8766
8767 cc_library {
8768 name: "myprivlib",
8769 srcs: ["mylib.cpp"],
8770 system_shared_libs: [],
8771 stl: "none",
8772 apex_available: ["myapex"],
8773 }
8774
8775
8776 cc_test {
8777 name: "mytest",
8778 gtest: false,
8779 srcs: ["mylib.cpp"],
8780 system_shared_libs: [],
8781 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008782 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008783 test_for: ["myapex"]
8784 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008785
8786 cc_library {
8787 name: "mytestlib",
8788 srcs: ["mylib.cpp"],
8789 system_shared_libs: [],
8790 shared_libs: ["mylib", "myprivlib"],
8791 stl: "none",
8792 test_for: ["myapex"],
8793 }
8794
8795 cc_benchmark {
8796 name: "mybench",
8797 srcs: ["mylib.cpp"],
8798 system_shared_libs: [],
8799 shared_libs: ["mylib", "myprivlib"],
8800 stl: "none",
8801 test_for: ["myapex"],
8802 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008803 `)
8804
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008805 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008806 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008807 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8808 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8809 }
8810
8811 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008812 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008813 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8814 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8815 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8816}
Jiyong Park46a512f2020-12-04 18:02:13 +09008817
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008818func TestIndirectTestFor(t *testing.T) {
8819 ctx := testApex(t, `
8820 apex {
8821 name: "myapex",
8822 key: "myapex.key",
8823 native_shared_libs: ["mylib", "myprivlib"],
8824 updatable: false,
8825 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008826
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008827 apex_key {
8828 name: "myapex.key",
8829 public_key: "testkey.avbpubkey",
8830 private_key: "testkey.pem",
8831 }
8832
8833 cc_library {
8834 name: "mylib",
8835 srcs: ["mylib.cpp"],
8836 system_shared_libs: [],
8837 stl: "none",
8838 stubs: {
8839 versions: ["1"],
8840 },
8841 apex_available: ["myapex"],
8842 }
8843
8844 cc_library {
8845 name: "myprivlib",
8846 srcs: ["mylib.cpp"],
8847 system_shared_libs: [],
8848 stl: "none",
8849 shared_libs: ["mylib"],
8850 apex_available: ["myapex"],
8851 }
8852
8853 cc_library {
8854 name: "mytestlib",
8855 srcs: ["mylib.cpp"],
8856 system_shared_libs: [],
8857 shared_libs: ["myprivlib"],
8858 stl: "none",
8859 test_for: ["myapex"],
8860 }
8861 `)
8862
8863 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008864 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008865 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8866 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8867 }
8868
8869 // The platform variant of mytestlib links to the platform variant of the
8870 // internal myprivlib.
8871 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8872
8873 // The platform variant of myprivlib links to the platform variant of mylib
8874 // and bypasses its stubs.
8875 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 +09008876}
8877
Martin Stjernholmec009002021-03-27 15:18:31 +00008878func TestTestForForLibInOtherApex(t *testing.T) {
8879 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8880 _ = testApex(t, `
8881 apex {
8882 name: "com.android.art",
8883 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008884 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008885 updatable: false,
8886 }
8887
8888 apex {
8889 name: "com.android.art.debug",
8890 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008891 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008892 updatable: false,
8893 }
8894
8895 apex_key {
8896 name: "myapex.key",
8897 public_key: "testkey.avbpubkey",
8898 private_key: "testkey.pem",
8899 }
8900
8901 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008902 name: "libnativebridge",
8903 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008904 system_shared_libs: [],
8905 stl: "none",
8906 stubs: {
8907 versions: ["1"],
8908 },
8909 apex_available: ["com.android.art", "com.android.art.debug"],
8910 }
8911
8912 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008913 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008914 srcs: ["mylib.cpp"],
8915 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008916 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008917 stl: "none",
8918 apex_available: ["com.android.art.debug"],
8919 test_for: ["com.android.art"],
8920 }
8921 `,
8922 android.MockFS{
8923 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8924 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8925 }.AddToFixture())
8926}
8927
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008928// TODO(jungjw): Move this to proptools
8929func intPtr(i int) *int {
8930 return &i
8931}
8932
8933func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008934 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008935 apex_set {
8936 name: "myapex",
8937 set: "myapex.apks",
8938 filename: "foo_v2.apex",
8939 overrides: ["foo"],
8940 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008941 `,
8942 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8943 variables.Platform_sdk_version = intPtr(30)
8944 }),
8945 android.FixtureModifyConfig(func(config android.Config) {
8946 config.Targets[android.Android] = []android.Target{
8947 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8948 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8949 }
8950 }),
8951 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008952
Paul Duffin24704672021-04-06 16:09:30 +01008953 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008954
8955 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008956 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008957 actual := extractedApex.Args["abis"]
8958 expected := "ARMEABI_V7A,ARM64_V8A"
8959 if actual != expected {
8960 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8961 }
8962 actual = extractedApex.Args["sdk-version"]
8963 expected = "30"
8964 if actual != expected {
8965 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8966 }
8967
Paul Duffin6717d882021-06-15 19:09:41 +01008968 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008969 a := m.Module().(*ApexSet)
8970 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008971 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008972 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8973 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8974 }
8975}
8976
Anton Hansson805e0a52022-11-25 14:06:46 +00008977func TestApexSet_NativeBridge(t *testing.T) {
8978 ctx := testApex(t, `
8979 apex_set {
8980 name: "myapex",
8981 set: "myapex.apks",
8982 filename: "foo_v2.apex",
8983 overrides: ["foo"],
8984 }
8985 `,
8986 android.FixtureModifyConfig(func(config android.Config) {
8987 config.Targets[android.Android] = []android.Target{
8988 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8989 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8990 }
8991 }),
8992 )
8993
8994 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8995
8996 // Check extract_apks tool parameters. No native bridge arch expected
8997 extractedApex := m.Output("extracted/myapex.apks")
8998 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8999}
9000
Jiyong Park7d95a512020-05-10 15:16:24 +09009001func TestNoStaticLinkingToStubsLib(t *testing.T) {
9002 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9003 apex {
9004 name: "myapex",
9005 key: "myapex.key",
9006 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009007 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009008 }
9009
9010 apex_key {
9011 name: "myapex.key",
9012 public_key: "testkey.avbpubkey",
9013 private_key: "testkey.pem",
9014 }
9015
9016 cc_library {
9017 name: "mylib",
9018 srcs: ["mylib.cpp"],
9019 static_libs: ["otherlib"],
9020 system_shared_libs: [],
9021 stl: "none",
9022 apex_available: [ "myapex" ],
9023 }
9024
9025 cc_library {
9026 name: "otherlib",
9027 srcs: ["mylib.cpp"],
9028 system_shared_libs: [],
9029 stl: "none",
9030 stubs: {
9031 versions: ["1", "2", "3"],
9032 },
9033 apex_available: [ "myapex" ],
9034 }
9035 `)
9036}
9037
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009038func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009039 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009040 apex {
9041 name: "myapex",
9042 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009043 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009044 custom_sign_tool: "sign_myapex",
9045 }
9046
9047 apex_key {
9048 name: "myapex.key",
9049 public_key: "testkey.avbpubkey",
9050 private_key: "testkey.pem",
9051 }
9052 `)
9053
9054 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9055 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
9056 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"`)
9057}
9058
9059func TestApexKeysTxtOverrides(t *testing.T) {
9060 ctx := testApex(t, `
9061 apex {
9062 name: "myapex",
9063 key: "myapex.key",
9064 updatable: false,
9065 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009066 }
9067
9068 apex_key {
9069 name: "myapex.key",
9070 public_key: "testkey.avbpubkey",
9071 private_key: "testkey.pem",
9072 }
9073
9074 prebuilt_apex {
9075 name: "myapex",
9076 prefer: true,
9077 arch: {
9078 arm64: {
9079 src: "myapex-arm64.apex",
9080 },
9081 arm: {
9082 src: "myapex-arm.apex",
9083 },
9084 },
9085 }
9086
9087 apex_set {
9088 name: "myapex_set",
9089 set: "myapex.apks",
9090 filename: "myapex_set.apex",
9091 overrides: ["myapex"],
9092 }
9093 `)
9094
9095 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9096 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
9097 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 +09009098 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 +09009099}
9100
Jooyung Han938b5932020-06-20 12:47:47 +09009101func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009102 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009103 apex {
9104 name: "myapex",
9105 key: "myapex.key",
9106 apps: ["app"],
9107 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009108 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009109 }
9110
9111 apex_key {
9112 name: "myapex.key",
9113 public_key: "testkey.avbpubkey",
9114 private_key: "testkey.pem",
9115 }
9116
9117 android_app {
9118 name: "app",
9119 srcs: ["foo/bar/MyClass.java"],
9120 package_name: "foo",
9121 sdk_version: "none",
9122 system_modules: "none",
9123 apex_available: [ "myapex" ],
9124 }
9125 `, withFiles(map[string][]byte{
9126 "sub/Android.bp": []byte(`
9127 override_apex {
9128 name: "override_myapex",
9129 base: "myapex",
9130 apps: ["override_app"],
9131 allowed_files: ":allowed",
9132 }
9133 // Overridable "path" property should be referenced indirectly
9134 filegroup {
9135 name: "allowed",
9136 srcs: ["allowed.txt"],
9137 }
9138 override_android_app {
9139 name: "override_app",
9140 base: "app",
9141 package_name: "bar",
9142 }
9143 `),
9144 }))
9145
9146 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
9147 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9148 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9149 }
9150
9151 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
9152 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9153 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9154 }
9155}
9156
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009157func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009158 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009159 apex {
9160 name: "myapex",
9161 key: "myapex.key",
9162 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009163 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009164 }
9165
9166 apex_key {
9167 name: "myapex.key",
9168 public_key: "testkey.avbpubkey",
9169 private_key: "testkey.pem",
9170 }
9171
9172 cc_library {
9173 name: "mylib",
9174 srcs: ["mylib.cpp"],
9175 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009176 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009177 },
9178 apex_available: ["myapex"],
9179 }
9180
9181 cc_prebuilt_library_shared {
9182 name: "mylib",
9183 prefer: false,
9184 srcs: ["prebuilt.so"],
9185 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009186 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009187 },
9188 apex_available: ["myapex"],
9189 }
9190 `)
9191}
9192
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009193func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009194 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009195 apex {
9196 name: "myapex",
9197 key: "myapex.key",
9198 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009199 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009200 }
9201 apex_key {
9202 name: "myapex.key",
9203 public_key: "testkey.avbpubkey",
9204 private_key: "testkey.pem",
9205 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009206 `,
9207 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9208 variables.CompressedApex = proptools.BoolPtr(true)
9209 }),
9210 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009211
9212 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
9213 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9214
9215 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
9216 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9217
9218 // Make sure output of bundle is .capex
9219 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9220 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9221
9222 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009223 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009224 var builder strings.Builder
9225 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9226 androidMk := builder.String()
9227 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9228}
9229
Martin Stjernholm2856c662020-12-02 15:03:42 +00009230func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009231 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009232 apex {
9233 name: "myapex",
9234 key: "myapex.key",
9235 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009236 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009237 }
9238
9239 apex_key {
9240 name: "myapex.key",
9241 public_key: "testkey.avbpubkey",
9242 private_key: "testkey.pem",
9243 }
9244
9245 cc_library {
9246 name: "mylib",
9247 srcs: ["mylib.cpp"],
9248 apex_available: ["myapex"],
9249 shared_libs: ["otherlib"],
9250 system_shared_libs: [],
9251 }
9252
9253 cc_library {
9254 name: "otherlib",
9255 srcs: ["mylib.cpp"],
9256 stubs: {
9257 versions: ["current"],
9258 },
9259 }
9260
9261 cc_prebuilt_library_shared {
9262 name: "otherlib",
9263 prefer: true,
9264 srcs: ["prebuilt.so"],
9265 stubs: {
9266 versions: ["current"],
9267 },
9268 }
9269 `)
9270
9271 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009272 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009273 var builder strings.Builder
9274 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9275 androidMk := builder.String()
9276
9277 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9278 // a thing there.
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009279 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 +00009280}
9281
Jiyong Parke3867542020-12-03 17:28:25 +09009282func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009283 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009284 apex {
9285 name: "myapex",
9286 key: "myapex.key",
9287 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009288 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009289 }
9290
9291 apex_key {
9292 name: "myapex.key",
9293 public_key: "testkey.avbpubkey",
9294 private_key: "testkey.pem",
9295 }
9296
9297 cc_library {
9298 name: "mylib",
9299 srcs: ["mylib.cpp"],
9300 system_shared_libs: [],
9301 stl: "none",
9302 apex_available: ["myapex"],
9303 shared_libs: ["mylib2"],
9304 target: {
9305 apex: {
9306 exclude_shared_libs: ["mylib2"],
9307 },
9308 },
9309 }
9310
9311 cc_library {
9312 name: "mylib2",
9313 srcs: ["mylib.cpp"],
9314 system_shared_libs: [],
9315 stl: "none",
9316 }
9317 `)
9318
9319 // Check if mylib is linked to mylib2 for the non-apex target
9320 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9321 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9322
9323 // Make sure that the link doesn't occur for the apex target
9324 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9325 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9326
9327 // It shouldn't appear in the copy cmd as well.
9328 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
9329 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9330}
9331
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009332func TestPrebuiltStubLibDep(t *testing.T) {
9333 bpBase := `
9334 apex {
9335 name: "myapex",
9336 key: "myapex.key",
9337 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009338 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009339 }
9340 apex_key {
9341 name: "myapex.key",
9342 public_key: "testkey.avbpubkey",
9343 private_key: "testkey.pem",
9344 }
9345 cc_library {
9346 name: "mylib",
9347 srcs: ["mylib.cpp"],
9348 apex_available: ["myapex"],
9349 shared_libs: ["stublib"],
9350 system_shared_libs: [],
9351 }
9352 apex {
9353 name: "otherapex",
9354 enabled: %s,
9355 key: "myapex.key",
9356 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009357 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009358 }
9359 `
9360
9361 stublibSourceBp := `
9362 cc_library {
9363 name: "stublib",
9364 srcs: ["mylib.cpp"],
9365 apex_available: ["otherapex"],
9366 system_shared_libs: [],
9367 stl: "none",
9368 stubs: {
9369 versions: ["1"],
9370 },
9371 }
9372 `
9373
9374 stublibPrebuiltBp := `
9375 cc_prebuilt_library_shared {
9376 name: "stublib",
9377 srcs: ["prebuilt.so"],
9378 apex_available: ["otherapex"],
9379 stubs: {
9380 versions: ["1"],
9381 },
9382 %s
9383 }
9384 `
9385
9386 tests := []struct {
9387 name string
9388 stublibBp string
9389 usePrebuilt bool
9390 modNames []string // Modules to collect AndroidMkEntries for
9391 otherApexEnabled []string
9392 }{
9393 {
9394 name: "only_source",
9395 stublibBp: stublibSourceBp,
9396 usePrebuilt: false,
9397 modNames: []string{"stublib"},
9398 otherApexEnabled: []string{"true", "false"},
9399 },
9400 {
9401 name: "source_preferred",
9402 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9403 usePrebuilt: false,
9404 modNames: []string{"stublib", "prebuilt_stublib"},
9405 otherApexEnabled: []string{"true", "false"},
9406 },
9407 {
9408 name: "prebuilt_preferred",
9409 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9410 usePrebuilt: true,
9411 modNames: []string{"stublib", "prebuilt_stublib"},
9412 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9413 },
9414 {
9415 name: "only_prebuilt",
9416 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9417 usePrebuilt: true,
9418 modNames: []string{"stublib"},
9419 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9420 },
9421 }
9422
9423 for _, test := range tests {
9424 t.Run(test.name, func(t *testing.T) {
9425 for _, otherApexEnabled := range test.otherApexEnabled {
9426 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009427 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009428
9429 type modAndMkEntries struct {
9430 mod *cc.Module
9431 mkEntries android.AndroidMkEntries
9432 }
9433 entries := []*modAndMkEntries{}
9434
9435 // Gather shared lib modules that are installable
9436 for _, modName := range test.modNames {
9437 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9438 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9439 continue
9440 }
9441 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009442 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009443 continue
9444 }
Colin Crossaa255532020-07-03 13:18:24 -07009445 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009446 if ent.Disabled {
9447 continue
9448 }
9449 entries = append(entries, &modAndMkEntries{
9450 mod: mod,
9451 mkEntries: ent,
9452 })
9453 }
9454 }
9455 }
9456
9457 var entry *modAndMkEntries = nil
9458 for _, ent := range entries {
9459 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9460 if entry != nil {
9461 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9462 } else {
9463 entry = ent
9464 }
9465 }
9466 }
9467
9468 if entry == nil {
9469 t.Errorf("AndroidMk entry for \"stublib\" missing")
9470 } else {
9471 isPrebuilt := entry.mod.Prebuilt() != nil
9472 if isPrebuilt != test.usePrebuilt {
9473 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9474 }
9475 if !entry.mod.IsStubs() {
9476 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9477 }
9478 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9479 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9480 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009481 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009482 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009483 if !android.InList(expected, cflags) {
9484 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9485 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009486 }
9487 })
9488 }
9489 })
9490 }
9491}
9492
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009493func TestHostApexInHostOnlyBuild(t *testing.T) {
9494 testApex(t, `
9495 apex {
9496 name: "myapex",
9497 host_supported: true,
9498 key: "myapex.key",
9499 updatable: false,
9500 payload_type: "zip",
9501 }
9502 apex_key {
9503 name: "myapex.key",
9504 public_key: "testkey.avbpubkey",
9505 private_key: "testkey.pem",
9506 }
9507 `,
9508 android.FixtureModifyConfig(func(config android.Config) {
9509 // We may not have device targets in all builds, e.g. in
9510 // prebuilts/build-tools/build-prebuilts.sh
9511 config.Targets[android.Android] = []android.Target{}
9512 }))
9513}
9514
Colin Crossc33e5212021-05-25 18:16:02 -07009515func TestApexJavaCoverage(t *testing.T) {
9516 bp := `
9517 apex {
9518 name: "myapex",
9519 key: "myapex.key",
9520 java_libs: ["mylib"],
9521 bootclasspath_fragments: ["mybootclasspathfragment"],
9522 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9523 updatable: false,
9524 }
9525
9526 apex_key {
9527 name: "myapex.key",
9528 public_key: "testkey.avbpubkey",
9529 private_key: "testkey.pem",
9530 }
9531
9532 java_library {
9533 name: "mylib",
9534 srcs: ["mylib.java"],
9535 apex_available: ["myapex"],
9536 compile_dex: true,
9537 }
9538
9539 bootclasspath_fragment {
9540 name: "mybootclasspathfragment",
9541 contents: ["mybootclasspathlib"],
9542 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009543 hidden_api: {
9544 split_packages: ["*"],
9545 },
Colin Crossc33e5212021-05-25 18:16:02 -07009546 }
9547
9548 java_library {
9549 name: "mybootclasspathlib",
9550 srcs: ["mybootclasspathlib.java"],
9551 apex_available: ["myapex"],
9552 compile_dex: true,
9553 }
9554
9555 systemserverclasspath_fragment {
9556 name: "mysystemserverclasspathfragment",
9557 contents: ["mysystemserverclasspathlib"],
9558 apex_available: ["myapex"],
9559 }
9560
9561 java_library {
9562 name: "mysystemserverclasspathlib",
9563 srcs: ["mysystemserverclasspathlib.java"],
9564 apex_available: ["myapex"],
9565 compile_dex: true,
9566 }
9567 `
9568
9569 result := android.GroupFixturePreparers(
9570 PrepareForTestWithApexBuildComponents,
9571 prepareForTestWithMyapex,
9572 java.PrepareForTestWithJavaDefaultModules,
9573 android.PrepareForTestWithAndroidBuildComponents,
9574 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009575 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9576 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009577 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009578 ).RunTest(t)
9579
9580 // Make sure jacoco ran on both mylib and mybootclasspathlib
9581 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9582 t.Errorf("Failed to find jacoco rule for mylib")
9583 }
9584 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9585 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9586 }
9587 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9588 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9589 }
9590}
9591
Jiyong Park192600a2021-08-03 07:52:17 +00009592func TestProhibitStaticExecutable(t *testing.T) {
9593 testApexError(t, `executable mybin is static`, `
9594 apex {
9595 name: "myapex",
9596 key: "myapex.key",
9597 binaries: ["mybin"],
9598 min_sdk_version: "29",
9599 }
9600
9601 apex_key {
9602 name: "myapex.key",
9603 public_key: "testkey.avbpubkey",
9604 private_key: "testkey.pem",
9605 }
9606
9607 cc_binary {
9608 name: "mybin",
9609 srcs: ["mylib.cpp"],
9610 relative_install_path: "foo/bar",
9611 static_executable: true,
9612 system_shared_libs: [],
9613 stl: "none",
9614 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009615 min_sdk_version: "29",
9616 }
9617 `)
9618
9619 testApexError(t, `executable mybin.rust is static`, `
9620 apex {
9621 name: "myapex",
9622 key: "myapex.key",
9623 binaries: ["mybin.rust"],
9624 min_sdk_version: "29",
9625 }
9626
9627 apex_key {
9628 name: "myapex.key",
9629 public_key: "testkey.avbpubkey",
9630 private_key: "testkey.pem",
9631 }
9632
9633 rust_binary {
9634 name: "mybin.rust",
9635 srcs: ["foo.rs"],
9636 static_executable: true,
9637 apex_available: ["myapex"],
9638 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009639 }
9640 `)
9641}
9642
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009643func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9644 ctx := testApex(t, `
9645 apex {
9646 name: "myapex",
9647 key: "myapex.key",
9648 updatable: false,
9649 java_libs: ["foo"],
9650 }
9651
9652 apex_key {
9653 name: "myapex.key",
9654 public_key: "testkey.avbpubkey",
9655 private_key: "testkey.pem",
9656 }
9657
9658 java_library {
9659 name: "foo",
9660 srcs: ["foo.java"],
9661 apex_available: ["myapex"],
9662 installable: true,
9663 }
9664 `,
9665 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9666 )
9667
9668 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9669 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9670 var builder strings.Builder
9671 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9672 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009673 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 +00009674}
9675
9676func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9677 ctx := testApex(t, `
9678 prebuilt_apex {
9679 name: "myapex",
9680 arch: {
9681 arm64: {
9682 src: "myapex-arm64.apex",
9683 },
9684 arm: {
9685 src: "myapex-arm.apex",
9686 },
9687 },
9688 exported_java_libs: ["foo"],
9689 }
9690
9691 java_import {
9692 name: "foo",
9693 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009694 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009695 }
9696 `,
9697 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9698 )
9699
9700 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9701 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9702 mainModuleEntries := entriesList[0]
9703 android.AssertArrayString(t,
9704 "LOCAL_REQUIRED_MODULES",
9705 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9706 []string{
9707 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9708 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9709 })
9710}
9711
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009712func TestAndroidMk_RequiredModules(t *testing.T) {
9713 ctx := testApex(t, `
9714 apex {
9715 name: "myapex",
9716 key: "myapex.key",
9717 updatable: false,
9718 java_libs: ["foo"],
9719 required: ["otherapex"],
9720 }
9721
9722 apex {
9723 name: "otherapex",
9724 key: "myapex.key",
9725 updatable: false,
9726 java_libs: ["foo"],
9727 required: ["otherapex"],
9728 }
9729
9730 apex_key {
9731 name: "myapex.key",
9732 public_key: "testkey.avbpubkey",
9733 private_key: "testkey.pem",
9734 }
9735
9736 java_library {
9737 name: "foo",
9738 srcs: ["foo.java"],
9739 apex_available: ["myapex", "otherapex"],
9740 installable: true,
9741 }
9742 `)
9743
9744 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9745 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9746 var builder strings.Builder
9747 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9748 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009749 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009750}
9751
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009752func TestAndroidMk_RequiredDeps(t *testing.T) {
9753 ctx := testApex(t, `
9754 apex {
9755 name: "myapex",
9756 key: "myapex.key",
9757 updatable: false,
9758 }
9759
9760 apex_key {
9761 name: "myapex.key",
9762 public_key: "testkey.avbpubkey",
9763 private_key: "testkey.pem",
9764 }
9765 `)
9766
9767 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009768 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009769 data := android.AndroidMkDataForTest(t, ctx, bundle)
9770 var builder strings.Builder
9771 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9772 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009773 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009774
9775 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009776 flattenedBundle.makeModulesToInstall = append(flattenedBundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009777 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9778 var flattenedBuilder strings.Builder
9779 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9780 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009781 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009782}
9783
Jooyung Hana6d36672022-02-24 13:58:07 +09009784func TestApexOutputFileProducer(t *testing.T) {
9785 for _, tc := range []struct {
9786 name string
9787 ref string
9788 expected_data []string
9789 }{
9790 {
9791 name: "test_using_output",
9792 ref: ":myapex",
9793 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9794 },
9795 {
9796 name: "test_using_apex",
9797 ref: ":myapex{.apex}",
9798 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9799 },
9800 } {
9801 t.Run(tc.name, func(t *testing.T) {
9802 ctx := testApex(t, `
9803 apex {
9804 name: "myapex",
9805 key: "myapex.key",
9806 compressible: true,
9807 updatable: false,
9808 }
9809
9810 apex_key {
9811 name: "myapex.key",
9812 public_key: "testkey.avbpubkey",
9813 private_key: "testkey.pem",
9814 }
9815
9816 java_test {
9817 name: "`+tc.name+`",
9818 srcs: ["a.java"],
9819 data: ["`+tc.ref+`"],
9820 }
9821 `,
9822 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9823 variables.CompressedApex = proptools.BoolPtr(true)
9824 }))
9825 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9826 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9827 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9828 })
9829 }
9830}
9831
satayev758968a2021-12-06 11:42:40 +00009832func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9833 preparer := android.GroupFixturePreparers(
9834 PrepareForTestWithApexBuildComponents,
9835 prepareForTestWithMyapex,
9836 java.PrepareForTestWithJavaSdkLibraryFiles,
9837 java.PrepareForTestWithJavaDefaultModules,
9838 android.PrepareForTestWithAndroidBuildComponents,
9839 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9840 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9841 )
9842
9843 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9844 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9845 preparer.RunTestWithBp(t, `
9846 apex {
9847 name: "myapex",
9848 key: "myapex.key",
9849 bootclasspath_fragments: ["mybootclasspathfragment"],
9850 min_sdk_version: "30",
9851 updatable: false,
9852 }
9853
9854 apex_key {
9855 name: "myapex.key",
9856 public_key: "testkey.avbpubkey",
9857 private_key: "testkey.pem",
9858 }
9859
9860 bootclasspath_fragment {
9861 name: "mybootclasspathfragment",
9862 contents: ["mybootclasspathlib"],
9863 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009864 hidden_api: {
9865 split_packages: ["*"],
9866 },
satayev758968a2021-12-06 11:42:40 +00009867 }
9868
9869 java_sdk_library {
9870 name: "mybootclasspathlib",
9871 srcs: ["mybootclasspathlib.java"],
9872 apex_available: ["myapex"],
9873 compile_dex: true,
9874 unsafe_ignore_missing_latest_api: true,
9875 min_sdk_version: "31",
9876 static_libs: ["util"],
9877 }
9878
9879 java_library {
9880 name: "util",
9881 srcs: ["a.java"],
9882 apex_available: ["myapex"],
9883 min_sdk_version: "31",
9884 static_libs: ["another_util"],
9885 }
9886
9887 java_library {
9888 name: "another_util",
9889 srcs: ["a.java"],
9890 min_sdk_version: "31",
9891 apex_available: ["myapex"],
9892 }
9893 `)
9894 })
9895
9896 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9897 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9898 preparer.RunTestWithBp(t, `
9899 apex {
9900 name: "myapex",
9901 key: "myapex.key",
9902 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9903 min_sdk_version: "30",
9904 updatable: false,
9905 }
9906
9907 apex_key {
9908 name: "myapex.key",
9909 public_key: "testkey.avbpubkey",
9910 private_key: "testkey.pem",
9911 }
9912
9913 systemserverclasspath_fragment {
9914 name: "mysystemserverclasspathfragment",
9915 contents: ["mysystemserverclasspathlib"],
9916 apex_available: ["myapex"],
9917 }
9918
9919 java_sdk_library {
9920 name: "mysystemserverclasspathlib",
9921 srcs: ["mysystemserverclasspathlib.java"],
9922 apex_available: ["myapex"],
9923 compile_dex: true,
9924 min_sdk_version: "32",
9925 unsafe_ignore_missing_latest_api: true,
9926 static_libs: ["util"],
9927 }
9928
9929 java_library {
9930 name: "util",
9931 srcs: ["a.java"],
9932 apex_available: ["myapex"],
9933 min_sdk_version: "31",
9934 static_libs: ["another_util"],
9935 }
9936
9937 java_library {
9938 name: "another_util",
9939 srcs: ["a.java"],
9940 min_sdk_version: "31",
9941 apex_available: ["myapex"],
9942 }
9943 `)
9944 })
9945
9946 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9947 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9948 RunTestWithBp(t, `
9949 apex {
9950 name: "myapex",
9951 key: "myapex.key",
9952 bootclasspath_fragments: ["mybootclasspathfragment"],
9953 min_sdk_version: "30",
9954 updatable: false,
9955 }
9956
9957 apex_key {
9958 name: "myapex.key",
9959 public_key: "testkey.avbpubkey",
9960 private_key: "testkey.pem",
9961 }
9962
9963 bootclasspath_fragment {
9964 name: "mybootclasspathfragment",
9965 contents: ["mybootclasspathlib"],
9966 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009967 hidden_api: {
9968 split_packages: ["*"],
9969 },
satayev758968a2021-12-06 11:42:40 +00009970 }
9971
9972 java_sdk_library {
9973 name: "mybootclasspathlib",
9974 srcs: ["mybootclasspathlib.java"],
9975 apex_available: ["myapex"],
9976 compile_dex: true,
9977 unsafe_ignore_missing_latest_api: true,
9978 }
9979 `)
9980 })
9981
9982 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9983 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9984 RunTestWithBp(t, `
9985 apex {
9986 name: "myapex",
9987 key: "myapex.key",
9988 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9989 min_sdk_version: "30",
9990 updatable: false,
9991 }
9992
9993 apex_key {
9994 name: "myapex.key",
9995 public_key: "testkey.avbpubkey",
9996 private_key: "testkey.pem",
9997 }
9998
9999 systemserverclasspath_fragment {
10000 name: "mysystemserverclasspathfragment",
10001 contents: ["mysystemserverclasspathlib"],
10002 apex_available: ["myapex"],
10003 }
10004
10005 java_sdk_library {
10006 name: "mysystemserverclasspathlib",
10007 srcs: ["mysystemserverclasspathlib.java"],
10008 apex_available: ["myapex"],
10009 compile_dex: true,
10010 unsafe_ignore_missing_latest_api: true,
10011 }
10012 `)
10013 })
10014}
10015
Jiakai Zhang6decef92022-01-12 17:56:19 +000010016// Verifies that the APEX depends on all the Make modules in the list.
10017func ensureContainsRequiredDeps(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.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010021 }
10022}
10023
10024// Verifies that the APEX does not depend on any of the Make modules in the list.
10025func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10026 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10027 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010028 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010029 }
10030}
10031
Cole Faust1021ccd2023-02-26 21:15:25 -080010032// TODO(b/193460475): Re-enable this test
10033//func TestApexStrictUpdtabilityLint(t *testing.T) {
10034// bpTemplate := `
10035// apex {
10036// name: "myapex",
10037// key: "myapex.key",
10038// java_libs: ["myjavalib"],
10039// updatable: %v,
10040// min_sdk_version: "29",
10041// }
10042// apex_key {
10043// name: "myapex.key",
10044// }
10045// java_library {
10046// name: "myjavalib",
10047// srcs: ["MyClass.java"],
10048// apex_available: [ "myapex" ],
10049// lint: {
10050// strict_updatability_linting: %v,
10051// },
10052// sdk_version: "current",
10053// min_sdk_version: "29",
10054// }
10055// `
10056// fs := android.MockFS{
10057// "lint-baseline.xml": nil,
10058// }
10059//
10060// testCases := []struct {
10061// testCaseName string
10062// apexUpdatable bool
10063// javaStrictUpdtabilityLint bool
10064// lintFileExists bool
10065// disallowedFlagExpected bool
10066// }{
10067// {
10068// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10069// apexUpdatable: true,
10070// javaStrictUpdtabilityLint: true,
10071// lintFileExists: false,
10072// disallowedFlagExpected: false,
10073// },
10074// {
10075// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10076// apexUpdatable: false,
10077// javaStrictUpdtabilityLint: false,
10078// lintFileExists: true,
10079// disallowedFlagExpected: false,
10080// },
10081// {
10082// testCaseName: "non-updatable apex respects strict updatability of javalib",
10083// apexUpdatable: false,
10084// javaStrictUpdtabilityLint: true,
10085// lintFileExists: true,
10086// disallowedFlagExpected: true,
10087// },
10088// {
10089// testCaseName: "updatable apex sets strict updatability of javalib to true",
10090// apexUpdatable: true,
10091// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10092// lintFileExists: true,
10093// disallowedFlagExpected: true,
10094// },
10095// }
10096//
10097// for _, testCase := range testCases {
10098// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10099// fixtures := []android.FixturePreparer{}
10100// if testCase.lintFileExists {
10101// fixtures = append(fixtures, fs.AddToFixture())
10102// }
10103//
10104// result := testApex(t, bp, fixtures...)
10105// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10106// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10107// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10108//
10109// if disallowedFlagActual != testCase.disallowedFlagExpected {
10110// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10111// }
10112// }
10113//}
10114//
10115//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10116// bp := `
10117// apex {
10118// name: "myapex",
10119// key: "myapex.key",
10120// java_libs: ["myjavalib"],
10121// updatable: true,
10122// min_sdk_version: "29",
10123// }
10124// apex_key {
10125// name: "myapex.key",
10126// }
10127// java_library {
10128// name: "myjavalib",
10129// srcs: ["MyClass.java"],
10130// apex_available: [ "myapex" ],
10131// sdk_version: "current",
10132// min_sdk_version: "29",
10133// }
10134// `
10135//
10136// testCases := []struct {
10137// testCaseName string
10138// moduleDirectory string
10139// disallowedFlagExpected bool
10140// }{
10141// {
10142// testCaseName: "lintable module defined outside libcore",
10143// moduleDirectory: "",
10144// disallowedFlagExpected: true,
10145// },
10146// {
10147// testCaseName: "lintable module defined in libcore root directory",
10148// moduleDirectory: "libcore/",
10149// disallowedFlagExpected: false,
10150// },
10151// {
10152// testCaseName: "lintable module defined in libcore child directory",
10153// moduleDirectory: "libcore/childdir/",
10154// disallowedFlagExpected: true,
10155// },
10156// }
10157//
10158// for _, testCase := range testCases {
10159// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10160// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10161// result := testApex(t, "", lintFileCreator, bpFileCreator)
10162// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10163// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10164// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10165// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10166//
10167// if disallowedFlagActual != testCase.disallowedFlagExpected {
10168// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10169// }
10170// }
10171//}
10172//
10173//// checks transtive deps of an apex coming from bootclasspath_fragment
10174//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10175// bp := `
10176// apex {
10177// name: "myapex",
10178// key: "myapex.key",
10179// bootclasspath_fragments: ["mybootclasspathfragment"],
10180// updatable: true,
10181// min_sdk_version: "29",
10182// }
10183// apex_key {
10184// name: "myapex.key",
10185// }
10186// bootclasspath_fragment {
10187// name: "mybootclasspathfragment",
10188// contents: ["myjavalib"],
10189// apex_available: ["myapex"],
10190// hidden_api: {
10191// split_packages: ["*"],
10192// },
10193// }
10194// java_library {
10195// name: "myjavalib",
10196// srcs: ["MyClass.java"],
10197// apex_available: [ "myapex" ],
10198// sdk_version: "current",
10199// min_sdk_version: "29",
10200// compile_dex: true,
10201// }
10202// `
10203// fs := android.MockFS{
10204// "lint-baseline.xml": nil,
10205// }
10206//
10207// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10208// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10209// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10210// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10211// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10212// }
10213//}
Spandan Das66773252022-01-15 00:23:18 +000010214
Spandan Das42e89502022-05-06 22:12:55 +000010215// updatable apexes should propagate updatable=true to its apps
10216func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10217 bp := `
10218 apex {
10219 name: "myapex",
10220 key: "myapex.key",
10221 updatable: %v,
10222 apps: [
10223 "myapp",
10224 ],
10225 min_sdk_version: "30",
10226 }
10227 apex_key {
10228 name: "myapex.key",
10229 }
10230 android_app {
10231 name: "myapp",
10232 updatable: %v,
10233 apex_available: [
10234 "myapex",
10235 ],
10236 sdk_version: "current",
10237 min_sdk_version: "30",
10238 }
10239 `
10240 testCases := []struct {
10241 name string
10242 apex_is_updatable_bp bool
10243 app_is_updatable_bp bool
10244 app_is_updatable_expected bool
10245 }{
10246 {
10247 name: "Non-updatable apex respects updatable property of non-updatable app",
10248 apex_is_updatable_bp: false,
10249 app_is_updatable_bp: false,
10250 app_is_updatable_expected: false,
10251 },
10252 {
10253 name: "Non-updatable apex respects updatable property of updatable app",
10254 apex_is_updatable_bp: false,
10255 app_is_updatable_bp: true,
10256 app_is_updatable_expected: true,
10257 },
10258 {
10259 name: "Updatable apex respects updatable property of updatable app",
10260 apex_is_updatable_bp: true,
10261 app_is_updatable_bp: true,
10262 app_is_updatable_expected: true,
10263 },
10264 {
10265 name: "Updatable apex sets updatable=true on non-updatable app",
10266 apex_is_updatable_bp: true,
10267 app_is_updatable_bp: false,
10268 app_is_updatable_expected: true,
10269 },
10270 }
10271 for _, testCase := range testCases {
10272 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10273 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10274 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10275 }
10276}
10277
Kiyoung Kim487689e2022-07-26 09:48:22 +090010278func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10279 bp := `
10280 apex {
10281 name: "myapex",
10282 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010283 native_shared_libs: ["libbaz"],
10284 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010285 min_sdk_version: "29",
10286 }
10287 apex_key {
10288 name: "myapex.key",
10289 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010290 cc_binary {
10291 name: "binfoo",
10292 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010293 apex_available: ["myapex"],
10294 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010295 recovery_available: false,
10296 }
10297 cc_library {
10298 name: "libbar",
10299 srcs: ["libbar.cc"],
10300 stubs: {
10301 symbol_file: "libbar.map.txt",
10302 versions: [
10303 "29",
10304 ],
10305 },
10306 }
10307 cc_library {
10308 name: "libbaz",
10309 srcs: ["libbaz.cc"],
10310 apex_available: ["myapex"],
10311 min_sdk_version: "29",
10312 stubs: {
10313 symbol_file: "libbaz.map.txt",
10314 versions: [
10315 "29",
10316 ],
10317 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010318 }
10319 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010320 name: "libbar",
10321 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010322 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010323 variants: ["apex.29"],
10324 }
10325 cc_api_variant {
10326 name: "libbar",
10327 variant: "apex",
10328 version: "29",
10329 src: "libbar_apex_29.so",
10330 }
10331 cc_api_library {
10332 name: "libbaz",
10333 src: "libbaz_stub.so",
10334 min_sdk_version: "29",
10335 variants: ["apex.29"],
10336 }
10337 cc_api_variant {
10338 name: "libbaz",
10339 variant: "apex",
10340 version: "29",
10341 src: "libbaz_apex_29.so",
10342 }
10343 cc_api_library {
10344 name: "libqux",
10345 src: "libqux_stub.so",
10346 min_sdk_version: "29",
10347 variants: ["apex.29"],
10348 }
10349 cc_api_variant {
10350 name: "libqux",
10351 variant: "apex",
10352 version: "29",
10353 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010354 }
10355 api_imports {
10356 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010357 apex_shared_libs: [
10358 "libbar",
10359 "libbaz",
10360 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010361 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010362 }
10363 `
10364 result := testApex(t, bp)
10365
10366 hasDep := func(m android.Module, wantDep android.Module) bool {
10367 t.Helper()
10368 var found bool
10369 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10370 if dep == wantDep {
10371 found = true
10372 }
10373 })
10374 return found
10375 }
10376
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010377 // Library defines stubs and cc_api_library should be used with cc_api_library
10378 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10379 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10380 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010381
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010382 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10383 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010384
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010385 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10386 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10387 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10388 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10389
10390 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10391 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10392 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10393 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10394 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10395
10396 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10397 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10398 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10399
10400 // cc_api_library defined without original library should be linked with cc_api_library
10401 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10402 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10403 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10404}
10405
10406func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10407 bp := `
10408 apex {
10409 name: "myapex",
10410 key: "myapex.key",
10411 native_shared_libs: ["libbar"],
10412 min_sdk_version: "29",
10413 }
10414 apex_key {
10415 name: "myapex.key",
10416 }
10417 cc_binary {
10418 name: "binfoo",
10419 shared_libs: ["libbar"],
10420 recovery_available: false,
10421 }
10422 cc_library {
10423 name: "libbar",
10424 srcs: ["libbar.cc"],
10425 apex_available: ["myapex"],
10426 min_sdk_version: "29",
10427 stubs: {
10428 symbol_file: "libbar.map.txt",
10429 versions: [
10430 "29",
10431 ],
10432 },
10433 }
10434 cc_api_library {
10435 name: "libbar",
10436 src: "libbar_stub.so",
10437 variants: ["apex.29"],
10438 }
10439 cc_api_variant {
10440 name: "libbar",
10441 variant: "apex",
10442 version: "29",
10443 src: "libbar_apex_29.so",
10444 }
10445 api_imports {
10446 name: "api_imports",
10447 apex_shared_libs: [
10448 "libbar",
10449 ],
10450 }
10451 `
10452
10453 result := testApex(t, bp)
10454
10455 hasDep := func(m android.Module, wantDep android.Module) bool {
10456 t.Helper()
10457 var found bool
10458 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10459 if dep == wantDep {
10460 found = true
10461 }
10462 })
10463 return found
10464 }
10465
10466 // Library defines stubs and cc_api_library should be used with cc_api_library
10467 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10468 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10469 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10470
10471 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10472 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10473
10474 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10475 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10476 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10477 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010478}
Dennis Shend4f5d932023-01-31 20:27:21 +000010479
10480func TestTrimmedApex(t *testing.T) {
10481 bp := `
10482 apex {
10483 name: "myapex",
10484 key: "myapex.key",
10485 native_shared_libs: ["libfoo","libbaz"],
10486 min_sdk_version: "29",
10487 trim_against: "mydcla",
10488 }
10489 apex {
10490 name: "mydcla",
10491 key: "myapex.key",
10492 native_shared_libs: ["libfoo","libbar"],
10493 min_sdk_version: "29",
10494 file_contexts: ":myapex-file_contexts",
10495 dynamic_common_lib_apex: true,
10496 }
10497 apex_key {
10498 name: "myapex.key",
10499 }
10500 cc_library {
10501 name: "libfoo",
10502 shared_libs: ["libc"],
10503 apex_available: ["myapex","mydcla"],
10504 min_sdk_version: "29",
10505 }
10506 cc_library {
10507 name: "libbar",
10508 shared_libs: ["libc"],
10509 apex_available: ["myapex","mydcla"],
10510 min_sdk_version: "29",
10511 }
10512 cc_library {
10513 name: "libbaz",
10514 shared_libs: ["libc"],
10515 apex_available: ["myapex","mydcla"],
10516 min_sdk_version: "29",
10517 }
10518 cc_api_library {
10519 name: "libc",
10520 src: "libc.so",
10521 min_sdk_version: "29",
10522 recovery_available: true,
10523 }
10524 api_imports {
10525 name: "api_imports",
10526 shared_libs: [
10527 "libc",
10528 ],
10529 header_libs: [],
10530 }
10531 `
10532 ctx := testApex(t, bp)
10533 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10534 apexRule := module.MaybeRule("apexRule")
10535 if apexRule.Rule == nil {
10536 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10537 }
10538
10539 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
10540 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
10541 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10542 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10543 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10544 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10545}
Jingwen Chendea7a642023-03-28 11:30:50 +000010546
10547func TestCannedFsConfig(t *testing.T) {
10548 ctx := testApex(t, `
10549 apex {
10550 name: "myapex",
10551 key: "myapex.key",
10552 updatable: false,
10553 }
10554
10555 apex_key {
10556 name: "myapex.key",
10557 public_key: "testkey.avbpubkey",
10558 private_key: "testkey.pem",
10559 }`)
10560 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10561 generateFsRule := mod.Rule("generateFsConfig")
10562 cmd := generateFsRule.RuleParams.Command
10563
10564 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10565}
10566
10567func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10568 ctx := testApex(t, `
10569 apex {
10570 name: "myapex",
10571 key: "myapex.key",
10572 canned_fs_config: "my_config",
10573 updatable: false,
10574 }
10575
10576 apex_key {
10577 name: "myapex.key",
10578 public_key: "testkey.avbpubkey",
10579 private_key: "testkey.pem",
10580 }`)
10581 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10582 generateFsRule := mod.Rule("generateFsConfig")
10583 cmd := generateFsRule.RuleParams.Command
10584
10585 // Ensure that canned_fs_config has "cat my_config" at the end
10586 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10587}
Spandan Das20fce2d2023-04-12 17:21:39 +000010588
10589func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10590 testCases := []struct {
10591 desc string
10592 hasStubs bool
10593 apexAvailable string
10594 expectedError string
10595 }{
10596 {
10597 desc: "non-stub library can have multiple apex_available",
10598 hasStubs: false,
10599 apexAvailable: `["myapex", "otherapex"]`,
10600 },
10601 {
10602 desc: "stub library should not be available to anyapex",
10603 hasStubs: true,
10604 apexAvailable: `["//apex_available:anyapex"]`,
10605 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10606 },
10607 {
10608 desc: "stub library should not be available to multiple apexes",
10609 hasStubs: true,
10610 apexAvailable: `["myapex", "otherapex"]`,
10611 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10612 },
10613 {
10614 desc: "stub library can be available to a core apex and a test apex",
10615 hasStubs: true,
10616 apexAvailable: `["myapex", "test_myapex"]`,
10617 },
10618 }
10619 bpTemplate := `
10620 cc_library {
10621 name: "libfoo",
10622 %v
10623 apex_available: %v,
10624 }
10625 apex {
10626 name: "myapex",
10627 key: "apex.key",
10628 updatable: false,
10629 native_shared_libs: ["libfoo"],
10630 }
10631 apex {
10632 name: "otherapex",
10633 key: "apex.key",
10634 updatable: false,
10635 }
10636 apex_test {
10637 name: "test_myapex",
10638 key: "apex.key",
10639 updatable: false,
10640 native_shared_libs: ["libfoo"],
10641 }
10642 apex_key {
10643 name: "apex.key",
10644 }
10645 `
10646 for _, tc := range testCases {
10647 stubs := ""
10648 if tc.hasStubs {
10649 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10650 }
10651 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10652 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10653 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10654 })
10655 if tc.expectedError == "" {
10656 testApex(t, bp, mockFsFixturePreparer)
10657 } else {
10658 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10659 }
10660 }
10661}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010662
10663func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10664 context := android.GroupFixturePreparers(
10665 android.PrepareForIntegrationTestWithAndroid,
10666 cc.PrepareForIntegrationTestWithCc,
10667 PrepareForTestWithApexBuildComponents,
10668 prepareForTestWithMyapex,
10669 filesystem.PrepareForTestWithFilesystemBuildComponents,
10670 )
10671 result := context.RunTestWithBp(t, `
10672 android_system_image {
10673 name: "myfilesystem",
10674 deps: [
10675 "libfoo",
10676 ],
10677 linker_config_src: "linker.config.json",
10678 }
10679
10680 cc_library {
10681 name: "libfoo",
10682 shared_libs: [
10683 "libbar",
10684 ],
10685 stl: "none",
10686 }
10687
10688 cc_library {
10689 name: "libbar",
10690 stl: "none",
10691 apex_available: ["myapex"],
10692 }
10693
10694 apex {
10695 name: "myapex",
10696 native_shared_libs: ["libbar"],
10697 key: "myapex.key",
10698 updatable: false,
10699 }
10700
10701 apex_key {
10702 name: "myapex.key",
10703 public_key: "testkey.avbpubkey",
10704 private_key: "testkey.pem",
10705 }
10706 `)
10707
10708 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10709 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10710 inputs.Strings(),
10711 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10712}