blob: 38e24e844c073f571c598edecb1e5202ea3bacea [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,
Sam Delmerico15809f82023-05-15 17:21:47 -04006263 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006264 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006265 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006266 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006267
6268 cc_library_shared {
6269 name: "libjni",
6270 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006271 shared_libs: ["libfoo"],
6272 stl: "none",
6273 system_shared_libs: [],
6274 apex_available: [ "myapex" ],
6275 sdk_version: "current",
6276 }
6277
6278 cc_library_shared {
6279 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006280 stl: "none",
6281 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006282 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006283 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006284 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006285 `)
6286
Sundong Ahnabb64432019-10-22 13:58:29 +09006287 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006288 apexRule := module.Rule("apexRule")
6289 copyCmds := apexRule.Args["copy_commands"]
6290
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006291 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6292 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006293 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006294
Colin Crossaede88c2020-08-11 12:17:01 -07006295 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006296 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006297 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006298 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006299 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006300 // JNI libraries including transitive deps are
6301 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006302 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006303 // ... embedded inside APK (jnilibs.zip)
6304 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6305 // ... and not directly inside the APEX
6306 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6307 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006308
6309 apexBundle := module.Module().(*apexBundle)
6310 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6311 var builder strings.Builder
6312 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6313 androidMk := builder.String()
6314 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6315 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6316 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6317 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6318 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6319 ensureContains(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := privapp_allowlist_com.android.AppFooPriv.xml:$(PRODUCT_OUT)/apex/myapex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Dario Frenicde2a032019-10-27 00:29:22 +01006320}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006321
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006322func TestApexWithAppImportBuildId(t *testing.T) {
6323 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6324 for _, id := range invalidBuildIds {
6325 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6326 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6327 variables.BuildId = proptools.StringPtr(id)
6328 })
6329 testApexError(t, message, `apex {
6330 name: "myapex",
6331 key: "myapex.key",
6332 apps: ["AppFooPrebuilt"],
6333 updatable: false,
6334 }
6335
6336 apex_key {
6337 name: "myapex.key",
6338 public_key: "testkey.avbpubkey",
6339 private_key: "testkey.pem",
6340 }
6341
6342 android_app_import {
6343 name: "AppFooPrebuilt",
6344 apk: "PrebuiltAppFoo.apk",
6345 presigned: true,
6346 apex_available: ["myapex"],
6347 }
6348 `, fixture)
6349 }
6350}
6351
Dario Frenicde2a032019-10-27 00:29:22 +01006352func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006353 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006354 apex {
6355 name: "myapex",
6356 key: "myapex.key",
6357 apps: [
6358 "AppFooPrebuilt",
6359 "AppFooPrivPrebuilt",
6360 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006361 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006362 }
6363
6364 apex_key {
6365 name: "myapex.key",
6366 public_key: "testkey.avbpubkey",
6367 private_key: "testkey.pem",
6368 }
6369
6370 android_app_import {
6371 name: "AppFooPrebuilt",
6372 apk: "PrebuiltAppFoo.apk",
6373 presigned: true,
6374 dex_preopt: {
6375 enabled: false,
6376 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006377 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006378 }
6379
6380 android_app_import {
6381 name: "AppFooPrivPrebuilt",
6382 apk: "PrebuiltAppFooPriv.apk",
6383 privileged: true,
6384 presigned: true,
6385 dex_preopt: {
6386 enabled: false,
6387 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006388 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006389 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006390 }
6391 `)
6392
Sundong Ahnabb64432019-10-22 13:58:29 +09006393 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01006394 apexRule := module.Rule("apexRule")
6395 copyCmds := apexRule.Args["copy_commands"]
6396
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006397 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6398 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006399}
6400
6401func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006402 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006403 apex {
6404 name: "myapex",
6405 key: "myapex.key",
6406 apps: [
6407 "AppFoo",
6408 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006409 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006410 }
6411
6412 apex_key {
6413 name: "myapex.key",
6414 public_key: "testkey.avbpubkey",
6415 private_key: "testkey.pem",
6416 }
6417
6418 android_app {
6419 name: "AppFoo",
6420 srcs: ["foo/bar/MyClass.java"],
6421 sdk_version: "none",
6422 system_modules: "none",
6423 apex_available: [ "myapex" ],
6424 }
6425
6426 android_app_import {
6427 name: "AppFoo",
6428 apk: "AppFooPrebuilt.apk",
6429 filename: "AppFooPrebuilt.apk",
6430 presigned: true,
6431 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006432 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006433 }
6434 `, withFiles(map[string][]byte{
6435 "AppFooPrebuilt.apk": nil,
6436 }))
6437
6438 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006439 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006440 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006441}
6442
Dario Freni6f3937c2019-12-20 22:58:03 +00006443func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006444 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006445 apex {
6446 name: "myapex",
6447 key: "myapex.key",
6448 apps: [
6449 "TesterHelpAppFoo",
6450 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006451 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006452 }
6453
6454 apex_key {
6455 name: "myapex.key",
6456 public_key: "testkey.avbpubkey",
6457 private_key: "testkey.pem",
6458 }
6459
6460 android_test_helper_app {
6461 name: "TesterHelpAppFoo",
6462 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006463 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006464 }
6465
6466 `)
6467
6468 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6469 apexRule := module.Rule("apexRule")
6470 copyCmds := apexRule.Args["copy_commands"]
6471
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006472 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006473}
6474
Jooyung Han18020ea2019-11-13 10:50:48 +09006475func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6476 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006477 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006478 apex {
6479 name: "myapex",
6480 key: "myapex.key",
6481 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006482 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006483 }
6484
6485 apex_key {
6486 name: "myapex.key",
6487 public_key: "testkey.avbpubkey",
6488 private_key: "testkey.pem",
6489 }
6490
6491 apex {
6492 name: "otherapex",
6493 key: "myapex.key",
6494 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006495 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006496 }
6497
6498 cc_defaults {
6499 name: "libfoo-defaults",
6500 apex_available: ["otherapex"],
6501 }
6502
6503 cc_library {
6504 name: "libfoo",
6505 defaults: ["libfoo-defaults"],
6506 stl: "none",
6507 system_shared_libs: [],
6508 }`)
6509}
6510
Paul Duffine52e66f2020-03-30 17:54:29 +01006511func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006512 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006513 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006514 apex {
6515 name: "myapex",
6516 key: "myapex.key",
6517 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006518 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006519 }
6520
6521 apex_key {
6522 name: "myapex.key",
6523 public_key: "testkey.avbpubkey",
6524 private_key: "testkey.pem",
6525 }
6526
6527 apex {
6528 name: "otherapex",
6529 key: "otherapex.key",
6530 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006531 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006532 }
6533
6534 apex_key {
6535 name: "otherapex.key",
6536 public_key: "testkey.avbpubkey",
6537 private_key: "testkey.pem",
6538 }
6539
6540 cc_library {
6541 name: "libfoo",
6542 stl: "none",
6543 system_shared_libs: [],
6544 apex_available: ["otherapex"],
6545 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006546}
Jiyong Park127b40b2019-09-30 16:04:35 +09006547
Paul Duffine52e66f2020-03-30 17:54:29 +01006548func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006549 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006550 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006551.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006552.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006553.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006554.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006555.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006556.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006557 apex {
6558 name: "myapex",
6559 key: "myapex.key",
6560 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006561 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006562 }
6563
6564 apex_key {
6565 name: "myapex.key",
6566 public_key: "testkey.avbpubkey",
6567 private_key: "testkey.pem",
6568 }
6569
Jiyong Park127b40b2019-09-30 16:04:35 +09006570 cc_library {
6571 name: "libfoo",
6572 stl: "none",
6573 shared_libs: ["libbar"],
6574 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006575 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006576 }
6577
6578 cc_library {
6579 name: "libbar",
6580 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006581 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006582 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006583 apex_available: ["myapex"],
6584 }
6585
6586 cc_library {
6587 name: "libbaz",
6588 stl: "none",
6589 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006590 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006591}
Jiyong Park127b40b2019-09-30 16:04:35 +09006592
Liz Kammer5f108fa2023-05-11 14:33:17 -04006593func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6594 testApex(t, `
6595 apex {
6596 name: "myapex",
6597 key: "myapex.key",
6598 native_shared_libs: ["libfoo"],
6599 updatable: false,
6600 }
6601
6602 apex_key {
6603 name: "myapex.key",
6604 public_key: "testkey.avbpubkey",
6605 private_key: "testkey.pem",
6606 }
6607
6608 cc_library {
6609 name: "libfoo",
6610 stl: "none",
6611 static_libs: ["libbar"],
6612 system_shared_libs: [],
6613 apex_available: ["myapex"],
6614 }
6615
6616 cc_library {
6617 name: "libbar",
6618 stl: "none",
6619 shared_libs: ["libbaz"],
6620 system_shared_libs: [],
6621 apex_available: ["myapex"],
6622 }
6623
6624 cc_library {
6625 name: "libbaz",
6626 stl: "none",
6627 system_shared_libs: [],
6628 }`)
6629
6630 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6631 apex {
6632 name: "myapex",
6633 key: "myapex.key",
6634 native_shared_libs: ["libfoo"],
6635 updatable: false,
6636 }
6637
6638 apex_key {
6639 name: "myapex.key",
6640 public_key: "testkey.avbpubkey",
6641 private_key: "testkey.pem",
6642 }
6643
6644 cc_library {
6645 name: "libfoo",
6646 stl: "none",
6647 static_libs: ["libbar"],
6648 system_shared_libs: [],
6649 apex_available: ["myapex"],
6650 }
6651
6652 cc_library {
6653 name: "libbar",
6654 stl: "none",
6655 system_shared_libs: [],
6656 }`)
6657}
6658
Paul Duffine52e66f2020-03-30 17:54:29 +01006659func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006660 testApexError(t, "\"otherapex\" is not a valid module name", `
6661 apex {
6662 name: "myapex",
6663 key: "myapex.key",
6664 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006665 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006666 }
6667
6668 apex_key {
6669 name: "myapex.key",
6670 public_key: "testkey.avbpubkey",
6671 private_key: "testkey.pem",
6672 }
6673
6674 cc_library {
6675 name: "libfoo",
6676 stl: "none",
6677 system_shared_libs: [],
6678 apex_available: ["otherapex"],
6679 }`)
6680
Paul Duffine52e66f2020-03-30 17:54:29 +01006681 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006682 apex {
6683 name: "myapex",
6684 key: "myapex.key",
6685 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006686 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006687 }
6688
6689 apex_key {
6690 name: "myapex.key",
6691 public_key: "testkey.avbpubkey",
6692 private_key: "testkey.pem",
6693 }
6694
6695 cc_library {
6696 name: "libfoo",
6697 stl: "none",
6698 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006699 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006700 apex_available: ["myapex"],
6701 }
6702
6703 cc_library {
6704 name: "libbar",
6705 stl: "none",
6706 system_shared_libs: [],
6707 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006708 }
6709
6710 cc_library {
6711 name: "libbaz",
6712 stl: "none",
6713 system_shared_libs: [],
6714 stubs: {
6715 versions: ["10", "20", "30"],
6716 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006717 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006718}
Jiyong Park127b40b2019-09-30 16:04:35 +09006719
Jiyong Park89e850a2020-04-07 16:37:39 +09006720func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006721 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006722 apex {
6723 name: "myapex",
6724 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006725 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006726 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006727 }
6728
6729 apex_key {
6730 name: "myapex.key",
6731 public_key: "testkey.avbpubkey",
6732 private_key: "testkey.pem",
6733 }
6734
6735 cc_library {
6736 name: "libfoo",
6737 stl: "none",
6738 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006739 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006740 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006741 }
6742
6743 cc_library {
6744 name: "libfoo2",
6745 stl: "none",
6746 system_shared_libs: [],
6747 shared_libs: ["libbaz"],
6748 apex_available: ["//apex_available:platform"],
6749 }
6750
6751 cc_library {
6752 name: "libbar",
6753 stl: "none",
6754 system_shared_libs: [],
6755 apex_available: ["myapex"],
6756 }
6757
6758 cc_library {
6759 name: "libbaz",
6760 stl: "none",
6761 system_shared_libs: [],
6762 apex_available: ["myapex"],
6763 stubs: {
6764 versions: ["1"],
6765 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006766 }`)
6767
Jiyong Park89e850a2020-04-07 16:37:39 +09006768 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6769 // because it depends on libbar which isn't available to platform
6770 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6771 if libfoo.NotAvailableForPlatform() != true {
6772 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6773 }
6774
6775 // libfoo2 however can be available to platform because it depends on libbaz which provides
6776 // stubs
6777 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6778 if libfoo2.NotAvailableForPlatform() == true {
6779 t.Errorf("%q should be available to platform", libfoo2.String())
6780 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006781}
Jiyong Parka90ca002019-10-07 15:47:24 +09006782
Paul Duffine52e66f2020-03-30 17:54:29 +01006783func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006784 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006785 apex {
6786 name: "myapex",
6787 key: "myapex.key",
6788 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006789 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006790 }
6791
6792 apex_key {
6793 name: "myapex.key",
6794 public_key: "testkey.avbpubkey",
6795 private_key: "testkey.pem",
6796 }
6797
6798 cc_library {
6799 name: "libfoo",
6800 stl: "none",
6801 system_shared_libs: [],
6802 apex_available: ["myapex"],
6803 static: {
6804 apex_available: ["//apex_available:platform"],
6805 },
6806 }`)
6807
Jiyong Park89e850a2020-04-07 16:37:39 +09006808 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6809 if libfooShared.NotAvailableForPlatform() != true {
6810 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6811 }
6812 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6813 if libfooStatic.NotAvailableForPlatform() != false {
6814 t.Errorf("%q should be available to platform", libfooStatic.String())
6815 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006816}
6817
Jiyong Park5d790c32019-11-15 18:40:32 +09006818func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006819 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006820 apex {
6821 name: "myapex",
6822 key: "myapex.key",
6823 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006824 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006825 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006826 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006827 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006828 }
6829
6830 override_apex {
6831 name: "override_myapex",
6832 base: "myapex",
6833 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006834 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006835 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006836 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006837 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006838 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006839 key: "mynewapex.key",
6840 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006841 }
6842
6843 apex_key {
6844 name: "myapex.key",
6845 public_key: "testkey.avbpubkey",
6846 private_key: "testkey.pem",
6847 }
6848
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006849 apex_key {
6850 name: "mynewapex.key",
6851 public_key: "testkey2.avbpubkey",
6852 private_key: "testkey2.pem",
6853 }
6854
6855 android_app_certificate {
6856 name: "myapex.certificate",
6857 certificate: "testkey",
6858 }
6859
Jiyong Park5d790c32019-11-15 18:40:32 +09006860 android_app {
6861 name: "app",
6862 srcs: ["foo/bar/MyClass.java"],
6863 package_name: "foo",
6864 sdk_version: "none",
6865 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006866 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006867 }
6868
6869 override_android_app {
6870 name: "override_app",
6871 base: "app",
6872 package_name: "bar",
6873 }
markchien7c803b82021-08-26 22:10:06 +08006874
6875 bpf {
6876 name: "bpf",
6877 srcs: ["bpf.c"],
6878 }
6879
6880 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006881 name: "overrideBpf",
6882 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006883 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006884
6885 prebuilt_etc {
6886 name: "myetc",
6887 src: "myprebuilt",
6888 }
6889
6890 prebuilt_etc {
6891 name: "override_myetc",
6892 src: "override_myprebuilt",
6893 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006894 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006895
Jiyong Park317645e2019-12-05 13:20:58 +09006896 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6897 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6898 if originalVariant.GetOverriddenBy() != "" {
6899 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6900 }
6901 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6902 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6903 }
6904
Jiyong Park5d790c32019-11-15 18:40:32 +09006905 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6906 apexRule := module.Rule("apexRule")
6907 copyCmds := apexRule.Args["copy_commands"]
6908
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006909 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6910 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006911
markchien7c803b82021-08-26 22:10:06 +08006912 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006913 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006914
Daniel Norman5a3ce132021-08-26 15:44:43 -07006915 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6916 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6917
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006918 apexBundle := module.Module().(*apexBundle)
6919 name := apexBundle.Name()
6920 if name != "override_myapex" {
6921 t.Errorf("name should be \"override_myapex\", but was %q", name)
6922 }
6923
Baligh Uddin004d7172020-02-19 21:29:28 -08006924 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6925 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6926 }
6927
Jiyong Park20bacab2020-03-03 11:45:41 +09006928 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006929 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006930 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6931
6932 signApkRule := module.Rule("signapk")
6933 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006934
Colin Crossaa255532020-07-03 13:18:24 -07006935 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006936 var builder strings.Builder
6937 data.Custom(&builder, name, "TARGET_", "", data)
6938 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006939 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6940 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
6941 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006942 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006943 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006944 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006945 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006946 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006947 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
6948 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006949}
6950
Albert Martineefabcf2022-03-21 20:11:16 +00006951func TestMinSdkVersionOverride(t *testing.T) {
6952 // Override from 29 to 31
6953 minSdkOverride31 := "31"
6954 ctx := testApex(t, `
6955 apex {
6956 name: "myapex",
6957 key: "myapex.key",
6958 native_shared_libs: ["mylib"],
6959 updatable: true,
6960 min_sdk_version: "29"
6961 }
6962
6963 override_apex {
6964 name: "override_myapex",
6965 base: "myapex",
6966 logging_parent: "com.foo.bar",
6967 package_name: "test.overridden.package"
6968 }
6969
6970 apex_key {
6971 name: "myapex.key",
6972 public_key: "testkey.avbpubkey",
6973 private_key: "testkey.pem",
6974 }
6975
6976 cc_library {
6977 name: "mylib",
6978 srcs: ["mylib.cpp"],
6979 runtime_libs: ["libbar"],
6980 system_shared_libs: [],
6981 stl: "none",
6982 apex_available: [ "myapex" ],
6983 min_sdk_version: "apex_inherit"
6984 }
6985
6986 cc_library {
6987 name: "libbar",
6988 srcs: ["mylib.cpp"],
6989 system_shared_libs: [],
6990 stl: "none",
6991 apex_available: [ "myapex" ],
6992 min_sdk_version: "apex_inherit"
6993 }
6994
6995 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6996
6997 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6998 copyCmds := apexRule.Args["copy_commands"]
6999
7000 // Ensure that direct non-stubs dep is always included
7001 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7002
7003 // Ensure that runtime_libs dep in included
7004 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7005
7006 // Ensure libraries target overridden min_sdk_version value
7007 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7008}
7009
7010func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7011 // Attempt to override from 31 to 29, should be a NOOP
7012 minSdkOverride29 := "29"
7013 ctx := testApex(t, `
7014 apex {
7015 name: "myapex",
7016 key: "myapex.key",
7017 native_shared_libs: ["mylib"],
7018 updatable: true,
7019 min_sdk_version: "31"
7020 }
7021
7022 override_apex {
7023 name: "override_myapex",
7024 base: "myapex",
7025 logging_parent: "com.foo.bar",
7026 package_name: "test.overridden.package"
7027 }
7028
7029 apex_key {
7030 name: "myapex.key",
7031 public_key: "testkey.avbpubkey",
7032 private_key: "testkey.pem",
7033 }
7034
7035 cc_library {
7036 name: "mylib",
7037 srcs: ["mylib.cpp"],
7038 runtime_libs: ["libbar"],
7039 system_shared_libs: [],
7040 stl: "none",
7041 apex_available: [ "myapex" ],
7042 min_sdk_version: "apex_inherit"
7043 }
7044
7045 cc_library {
7046 name: "libbar",
7047 srcs: ["mylib.cpp"],
7048 system_shared_libs: [],
7049 stl: "none",
7050 apex_available: [ "myapex" ],
7051 min_sdk_version: "apex_inherit"
7052 }
7053
7054 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7055
7056 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
7057 copyCmds := apexRule.Args["copy_commands"]
7058
7059 // Ensure that direct non-stubs dep is always included
7060 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7061
7062 // Ensure that runtime_libs dep in included
7063 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7064
7065 // Ensure libraries target the original min_sdk_version value rather than the overridden
7066 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7067}
7068
Jooyung Han214bf372019-11-12 13:03:50 +09007069func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007070 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007071 apex {
7072 name: "myapex",
7073 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007074 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007075 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007076 }
7077
7078 apex_key {
7079 name: "myapex.key",
7080 public_key: "testkey.avbpubkey",
7081 private_key: "testkey.pem",
7082 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007083
7084 cc_library {
7085 name: "mylib",
7086 srcs: ["mylib.cpp"],
7087 stl: "libc++",
7088 system_shared_libs: [],
7089 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007090 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007091 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007092 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007093
7094 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
7095 args := module.Rule("apexRule").Args
7096 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007097 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007098
7099 // The copies of the libraries in the apex should have one more dependency than
7100 // the ones outside the apex, namely the unwinder. Ideally we should check
7101 // the dependency names directly here but for some reason the names are blank in
7102 // this test.
7103 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007104 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007105 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7106 if len(apexImplicits) != len(nonApexImplicits)+1 {
7107 t.Errorf("%q missing unwinder dep", lib)
7108 }
7109 }
Jooyung Han214bf372019-11-12 13:03:50 +09007110}
7111
Paul Duffine05480a2021-03-08 15:07:14 +00007112var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007113 "api/current.txt": nil,
7114 "api/removed.txt": nil,
7115 "api/system-current.txt": nil,
7116 "api/system-removed.txt": nil,
7117 "api/test-current.txt": nil,
7118 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007119
Anton Hanssondff2c782020-12-21 17:10:01 +00007120 "100/public/api/foo.txt": nil,
7121 "100/public/api/foo-removed.txt": nil,
7122 "100/system/api/foo.txt": nil,
7123 "100/system/api/foo-removed.txt": nil,
7124
Paul Duffineedc5d52020-06-12 17:46:39 +01007125 // For java_sdk_library_import
7126 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007127}
7128
Jooyung Han58f26ab2019-12-18 15:34:32 +09007129func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007130 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007131 apex {
7132 name: "myapex",
7133 key: "myapex.key",
7134 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007135 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007136 }
7137
7138 apex_key {
7139 name: "myapex.key",
7140 public_key: "testkey.avbpubkey",
7141 private_key: "testkey.pem",
7142 }
7143
7144 java_sdk_library {
7145 name: "foo",
7146 srcs: ["a.java"],
7147 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007148 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007149 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007150
7151 prebuilt_apis {
7152 name: "sdk",
7153 api_dirs: ["100"],
7154 }
Paul Duffin9b879592020-05-26 13:21:35 +01007155 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007156
7157 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00007158 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007159 "javalib/foo.jar",
7160 "etc/permissions/foo.xml",
7161 })
7162 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007163 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007164 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 +09007165}
7166
Paul Duffin9b879592020-05-26 13:21:35 +01007167func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007168 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007169 apex {
7170 name: "myapex",
7171 key: "myapex.key",
7172 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007173 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007174 }
7175
7176 apex_key {
7177 name: "myapex.key",
7178 public_key: "testkey.avbpubkey",
7179 private_key: "testkey.pem",
7180 }
7181
7182 java_sdk_library {
7183 name: "foo",
7184 srcs: ["a.java"],
7185 api_packages: ["foo"],
7186 apex_available: ["myapex"],
7187 sdk_version: "none",
7188 system_modules: "none",
7189 }
7190
7191 java_library {
7192 name: "bar",
7193 srcs: ["a.java"],
7194 libs: ["foo"],
7195 apex_available: ["myapex"],
7196 sdk_version: "none",
7197 system_modules: "none",
7198 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007199
7200 prebuilt_apis {
7201 name: "sdk",
7202 api_dirs: ["100"],
7203 }
Paul Duffin9b879592020-05-26 13:21:35 +01007204 `, withFiles(filesForSdkLibrary))
7205
7206 // java_sdk_library installs both impl jar and permission XML
7207 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7208 "javalib/bar.jar",
7209 "javalib/foo.jar",
7210 "etc/permissions/foo.xml",
7211 })
7212
7213 // The bar library should depend on the implementation jar.
7214 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007215 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007216 t.Errorf("expected %q, found %#q", expected, actual)
7217 }
7218}
7219
7220func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007221 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007222 apex {
7223 name: "myapex",
7224 key: "myapex.key",
7225 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007226 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007227 }
7228
7229 apex_key {
7230 name: "myapex.key",
7231 public_key: "testkey.avbpubkey",
7232 private_key: "testkey.pem",
7233 }
7234
7235 java_sdk_library {
7236 name: "foo",
7237 srcs: ["a.java"],
7238 api_packages: ["foo"],
7239 apex_available: ["myapex"],
7240 sdk_version: "none",
7241 system_modules: "none",
7242 }
7243
7244 java_library {
7245 name: "bar",
7246 srcs: ["a.java"],
7247 libs: ["foo"],
7248 sdk_version: "none",
7249 system_modules: "none",
7250 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007251
7252 prebuilt_apis {
7253 name: "sdk",
7254 api_dirs: ["100"],
7255 }
Paul Duffin9b879592020-05-26 13:21:35 +01007256 `, withFiles(filesForSdkLibrary))
7257
7258 // java_sdk_library installs both impl jar and permission XML
7259 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7260 "javalib/foo.jar",
7261 "etc/permissions/foo.xml",
7262 })
7263
7264 // The bar library should depend on the stubs jar.
7265 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007266 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007267 t.Errorf("expected %q, found %#q", expected, actual)
7268 }
7269}
7270
Paul Duffineedc5d52020-06-12 17:46:39 +01007271func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007272 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007273 prebuilt_apis {
7274 name: "sdk",
7275 api_dirs: ["100"],
7276 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007277 withFiles(map[string][]byte{
7278 "apex/a.java": nil,
7279 "apex/apex_manifest.json": nil,
7280 "apex/Android.bp": []byte(`
7281 package {
7282 default_visibility: ["//visibility:private"],
7283 }
7284
7285 apex {
7286 name: "myapex",
7287 key: "myapex.key",
7288 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007289 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007290 }
7291
7292 apex_key {
7293 name: "myapex.key",
7294 public_key: "testkey.avbpubkey",
7295 private_key: "testkey.pem",
7296 }
7297
7298 java_library {
7299 name: "bar",
7300 srcs: ["a.java"],
7301 libs: ["foo"],
7302 apex_available: ["myapex"],
7303 sdk_version: "none",
7304 system_modules: "none",
7305 }
7306`),
7307 "source/a.java": nil,
7308 "source/api/current.txt": nil,
7309 "source/api/removed.txt": nil,
7310 "source/Android.bp": []byte(`
7311 package {
7312 default_visibility: ["//visibility:private"],
7313 }
7314
7315 java_sdk_library {
7316 name: "foo",
7317 visibility: ["//apex"],
7318 srcs: ["a.java"],
7319 api_packages: ["foo"],
7320 apex_available: ["myapex"],
7321 sdk_version: "none",
7322 system_modules: "none",
7323 public: {
7324 enabled: true,
7325 },
7326 }
7327`),
7328 "prebuilt/a.jar": nil,
7329 "prebuilt/Android.bp": []byte(`
7330 package {
7331 default_visibility: ["//visibility:private"],
7332 }
7333
7334 java_sdk_library_import {
7335 name: "foo",
7336 visibility: ["//apex", "//source"],
7337 apex_available: ["myapex"],
7338 prefer: true,
7339 public: {
7340 jars: ["a.jar"],
7341 },
7342 }
7343`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007344 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007345 )
7346
7347 // java_sdk_library installs both impl jar and permission XML
7348 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7349 "javalib/bar.jar",
7350 "javalib/foo.jar",
7351 "etc/permissions/foo.xml",
7352 })
7353
7354 // The bar library should depend on the implementation jar.
7355 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007356 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007357 t.Errorf("expected %q, found %#q", expected, actual)
7358 }
7359}
7360
7361func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7362 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7363 apex {
7364 name: "myapex",
7365 key: "myapex.key",
7366 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007367 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007368 }
7369
7370 apex_key {
7371 name: "myapex.key",
7372 public_key: "testkey.avbpubkey",
7373 private_key: "testkey.pem",
7374 }
7375
7376 java_sdk_library_import {
7377 name: "foo",
7378 apex_available: ["myapex"],
7379 prefer: true,
7380 public: {
7381 jars: ["a.jar"],
7382 },
7383 }
7384
7385 `, withFiles(filesForSdkLibrary))
7386}
7387
atrost6e126252020-01-27 17:01:16 +00007388func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007389 result := android.GroupFixturePreparers(
7390 prepareForApexTest,
7391 java.PrepareForTestWithPlatformCompatConfig,
7392 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007393 apex {
7394 name: "myapex",
7395 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007396 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007397 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007398 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007399 }
7400
7401 apex_key {
7402 name: "myapex.key",
7403 public_key: "testkey.avbpubkey",
7404 private_key: "testkey.pem",
7405 }
7406
7407 platform_compat_config {
7408 name: "myjar-platform-compat-config",
7409 src: ":myjar",
7410 }
7411
7412 java_library {
7413 name: "myjar",
7414 srcs: ["foo/bar/MyClass.java"],
7415 sdk_version: "none",
7416 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007417 apex_available: [ "myapex" ],
7418 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007419
7420 // Make sure that a preferred prebuilt does not affect the apex contents.
7421 prebuilt_platform_compat_config {
7422 name: "myjar-platform-compat-config",
7423 metadata: "compat-config/metadata.xml",
7424 prefer: true,
7425 }
atrost6e126252020-01-27 17:01:16 +00007426 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007427 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007428 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7429 "etc/compatconfig/myjar-platform-compat-config.xml",
7430 "javalib/myjar.jar",
7431 })
7432}
7433
Jooyung Han862c0d62022-12-21 10:15:37 +09007434func TestNoDupeApexFiles(t *testing.T) {
7435 android.GroupFixturePreparers(
7436 android.PrepareForTestWithAndroidBuildComponents,
7437 PrepareForTestWithApexBuildComponents,
7438 prepareForTestWithMyapex,
7439 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7440 ).
7441 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7442 RunTestWithBp(t, `
7443 apex {
7444 name: "myapex",
7445 key: "myapex.key",
7446 prebuilts: ["foo", "bar"],
7447 updatable: false,
7448 }
7449
7450 apex_key {
7451 name: "myapex.key",
7452 public_key: "testkey.avbpubkey",
7453 private_key: "testkey.pem",
7454 }
7455
7456 prebuilt_etc {
7457 name: "foo",
7458 src: "myprebuilt",
7459 filename_from_src: true,
7460 }
7461
7462 prebuilt_etc {
7463 name: "bar",
7464 src: "myprebuilt",
7465 filename_from_src: true,
7466 }
7467 `)
7468}
7469
Jiyong Park479321d2019-12-16 11:47:12 +09007470func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7471 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7472 apex {
7473 name: "myapex",
7474 key: "myapex.key",
7475 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007476 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007477 }
7478
7479 apex_key {
7480 name: "myapex.key",
7481 public_key: "testkey.avbpubkey",
7482 private_key: "testkey.pem",
7483 }
7484
7485 java_library {
7486 name: "myjar",
7487 srcs: ["foo/bar/MyClass.java"],
7488 sdk_version: "none",
7489 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007490 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007491 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007492 }
7493 `)
7494}
7495
Jiyong Park7afd1072019-12-30 16:56:33 +09007496func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007497 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007498 apex {
7499 name: "myapex",
7500 key: "myapex.key",
7501 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007502 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007503 }
7504
7505 apex_key {
7506 name: "myapex.key",
7507 public_key: "testkey.avbpubkey",
7508 private_key: "testkey.pem",
7509 }
7510
7511 cc_library {
7512 name: "mylib",
7513 srcs: ["mylib.cpp"],
7514 system_shared_libs: [],
7515 stl: "none",
7516 required: ["a", "b"],
7517 host_required: ["c", "d"],
7518 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007519 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007520 }
7521 `)
7522
7523 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007524 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007525 name := apexBundle.BaseModuleName()
7526 prefix := "TARGET_"
7527 var builder strings.Builder
7528 data.Custom(&builder, name, prefix, "", data)
7529 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007530 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 -08007531 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7532 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007533}
7534
Jiyong Park7cd10e32020-01-14 09:22:18 +09007535func TestSymlinksFromApexToSystem(t *testing.T) {
7536 bp := `
7537 apex {
7538 name: "myapex",
7539 key: "myapex.key",
7540 native_shared_libs: ["mylib"],
7541 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007542 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007543 }
7544
Jiyong Park9d677202020-02-19 16:29:35 +09007545 apex {
7546 name: "myapex.updatable",
7547 key: "myapex.key",
7548 native_shared_libs: ["mylib"],
7549 java_libs: ["myjar"],
7550 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007551 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007552 }
7553
Jiyong Park7cd10e32020-01-14 09:22:18 +09007554 apex_key {
7555 name: "myapex.key",
7556 public_key: "testkey.avbpubkey",
7557 private_key: "testkey.pem",
7558 }
7559
7560 cc_library {
7561 name: "mylib",
7562 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007563 shared_libs: [
7564 "myotherlib",
7565 "myotherlib_ext",
7566 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007567 system_shared_libs: [],
7568 stl: "none",
7569 apex_available: [
7570 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007571 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007572 "//apex_available:platform",
7573 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007574 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007575 }
7576
7577 cc_library {
7578 name: "myotherlib",
7579 srcs: ["mylib.cpp"],
7580 system_shared_libs: [],
7581 stl: "none",
7582 apex_available: [
7583 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007584 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007585 "//apex_available:platform",
7586 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007587 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007588 }
7589
Jiyong Parkce243632023-02-17 18:22:25 +09007590 cc_library {
7591 name: "myotherlib_ext",
7592 srcs: ["mylib.cpp"],
7593 system_shared_libs: [],
7594 system_ext_specific: true,
7595 stl: "none",
7596 apex_available: [
7597 "myapex",
7598 "myapex.updatable",
7599 "//apex_available:platform",
7600 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007601 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007602 }
7603
Jiyong Park7cd10e32020-01-14 09:22:18 +09007604 java_library {
7605 name: "myjar",
7606 srcs: ["foo/bar/MyClass.java"],
7607 sdk_version: "none",
7608 system_modules: "none",
7609 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007610 apex_available: [
7611 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007612 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007613 "//apex_available:platform",
7614 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007615 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007616 }
7617
7618 java_library {
7619 name: "myotherjar",
7620 srcs: ["foo/bar/MyClass.java"],
7621 sdk_version: "none",
7622 system_modules: "none",
7623 apex_available: [
7624 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007625 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007626 "//apex_available:platform",
7627 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007628 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007629 }
7630 `
7631
7632 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7633 for _, f := range files {
7634 if f.path == file {
7635 if f.isLink {
7636 t.Errorf("%q is not a real file", file)
7637 }
7638 return
7639 }
7640 }
7641 t.Errorf("%q is not found", file)
7642 }
7643
Jiyong Parkce243632023-02-17 18:22:25 +09007644 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007645 for _, f := range files {
7646 if f.path == file {
7647 if !f.isLink {
7648 t.Errorf("%q is not a symlink", file)
7649 }
Jiyong Parkce243632023-02-17 18:22:25 +09007650 if f.src != target {
7651 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7652 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007653 return
7654 }
7655 }
7656 t.Errorf("%q is not found", file)
7657 }
7658
Jiyong Park9d677202020-02-19 16:29:35 +09007659 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7660 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007661 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007662 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007663 ensureRealfileExists(t, files, "javalib/myjar.jar")
7664 ensureRealfileExists(t, files, "lib64/mylib.so")
7665 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007666 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007667
Jiyong Park9d677202020-02-19 16:29:35 +09007668 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7669 ensureRealfileExists(t, files, "javalib/myjar.jar")
7670 ensureRealfileExists(t, files, "lib64/mylib.so")
7671 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007672 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007673
7674 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007675 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007676 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007677 ensureRealfileExists(t, files, "javalib/myjar.jar")
7678 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007679 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7680 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007681
7682 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7683 ensureRealfileExists(t, files, "javalib/myjar.jar")
7684 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007685 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7686 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007687}
7688
Yo Chiange8128052020-07-23 20:09:18 +08007689func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007690 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007691 apex {
7692 name: "myapex",
7693 key: "myapex.key",
7694 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007695 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007696 }
7697
7698 apex_key {
7699 name: "myapex.key",
7700 public_key: "testkey.avbpubkey",
7701 private_key: "testkey.pem",
7702 }
7703
7704 cc_library_shared {
7705 name: "mylib",
7706 srcs: ["mylib.cpp"],
7707 shared_libs: ["myotherlib"],
7708 system_shared_libs: [],
7709 stl: "none",
7710 apex_available: [
7711 "myapex",
7712 "//apex_available:platform",
7713 ],
7714 }
7715
7716 cc_prebuilt_library_shared {
7717 name: "myotherlib",
7718 srcs: ["prebuilt.so"],
7719 system_shared_libs: [],
7720 stl: "none",
7721 apex_available: [
7722 "myapex",
7723 "//apex_available:platform",
7724 ],
7725 }
7726 `)
7727
Prerana Patilb1896c82022-11-09 18:14:34 +00007728 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007729 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007730 var builder strings.Builder
7731 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7732 androidMk := builder.String()
7733 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007734 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007735 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7736 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7737 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007738 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 +08007739}
7740
Jooyung Han643adc42020-02-27 13:50:06 +09007741func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007742 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007743 apex {
7744 name: "myapex",
7745 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007746 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007747 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007748 }
7749
7750 apex_key {
7751 name: "myapex.key",
7752 public_key: "testkey.avbpubkey",
7753 private_key: "testkey.pem",
7754 }
7755
7756 cc_library {
7757 name: "mylib",
7758 srcs: ["mylib.cpp"],
7759 shared_libs: ["mylib2"],
7760 system_shared_libs: [],
7761 stl: "none",
7762 apex_available: [ "myapex" ],
7763 }
7764
7765 cc_library {
7766 name: "mylib2",
7767 srcs: ["mylib.cpp"],
7768 system_shared_libs: [],
7769 stl: "none",
7770 apex_available: [ "myapex" ],
7771 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007772
7773 rust_ffi_shared {
7774 name: "libfoo.rust",
7775 crate_name: "foo",
7776 srcs: ["foo.rs"],
7777 shared_libs: ["libfoo.shared_from_rust"],
7778 prefer_rlib: true,
7779 apex_available: ["myapex"],
7780 }
7781
7782 cc_library_shared {
7783 name: "libfoo.shared_from_rust",
7784 srcs: ["mylib.cpp"],
7785 system_shared_libs: [],
7786 stl: "none",
7787 stubs: {
7788 versions: ["10", "11", "12"],
7789 },
7790 }
7791
Jooyung Han643adc42020-02-27 13:50:06 +09007792 `)
7793
7794 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7795 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007796 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007797 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7798 "lib64/mylib.so",
7799 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007800 "lib64/libfoo.rust.so",
7801 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7802 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007803 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007804
7805 // b/220397949
7806 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007807}
7808
Jooyung Han49f67012020-04-17 13:43:10 +09007809func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007810 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007811 apex {
7812 name: "myapex",
7813 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007814 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007815 }
7816 apex_key {
7817 name: "myapex.key",
7818 public_key: "testkey.avbpubkey",
7819 private_key: "testkey.pem",
7820 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007821 `,
7822 android.FixtureModifyConfig(func(config android.Config) {
7823 delete(config.Targets, android.Android)
7824 config.AndroidCommonTarget = android.Target{}
7825 }),
7826 )
Jooyung Han49f67012020-04-17 13:43:10 +09007827
7828 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7829 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7830 }
7831}
7832
Jiyong Parkbd159612020-02-28 15:22:21 +09007833func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007834 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007835 apex {
7836 name: "myapex",
7837 key: "myapex.key",
7838 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007839 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007840 }
7841
7842 apex_key {
7843 name: "myapex.key",
7844 public_key: "testkey.avbpubkey",
7845 private_key: "testkey.pem",
7846 }
7847
7848 android_app {
7849 name: "AppFoo",
7850 srcs: ["foo/bar/MyClass.java"],
7851 sdk_version: "none",
7852 system_modules: "none",
7853 apex_available: [ "myapex" ],
7854 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007855 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007856
Colin Crosscf371cc2020-11-13 11:48:42 -08007857 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007858 content := bundleConfigRule.Args["content"]
7859
7860 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007861 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 +09007862}
7863
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007864func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007865 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007866 apex {
7867 name: "myapex",
7868 key: "myapex.key",
7869 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007870 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007871 }
7872
7873 apex_key {
7874 name: "myapex.key",
7875 public_key: "testkey.avbpubkey",
7876 private_key: "testkey.pem",
7877 }
7878
7879 android_app_set {
7880 name: "AppSet",
7881 set: "AppSet.apks",
7882 }`)
7883 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007884 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007885 content := bundleConfigRule.Args["content"]
7886 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7887 s := mod.Rule("apexRule").Args["copy_commands"]
7888 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007889 if len(copyCmds) != 4 {
7890 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007891 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007892 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7893 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007894 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7895 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007896
7897 // Ensure that canned_fs_config has an entry for the app set zip file
7898 generateFsRule := mod.Rule("generateFsConfig")
7899 cmd := generateFsRule.RuleParams.Command
7900 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007901}
7902
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007903func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007904 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007905 apex_set {
7906 name: "myapex",
7907 filename: "foo_v2.apex",
7908 sanitized: {
7909 none: { set: "myapex.apks", },
7910 hwaddress: { set: "myapex.hwasan.apks", },
7911 },
Paul Duffin24704672021-04-06 16:09:30 +01007912 }
7913 `
7914 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007915
Paul Duffin24704672021-04-06 16:09:30 +01007916 // Check that the extractor produces the correct output file from the correct input file.
7917 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007918
Paul Duffin24704672021-04-06 16:09:30 +01007919 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7920 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007921
Paul Duffin24704672021-04-06 16:09:30 +01007922 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7923
7924 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007925 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7926 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007927
7928 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007929}
7930
Pranav Guptaeba03b02022-09-27 00:27:08 +00007931func TestApexSetApksModuleAssignment(t *testing.T) {
7932 ctx := testApex(t, `
7933 apex_set {
7934 name: "myapex",
7935 set: ":myapex_apks_file",
7936 }
7937
7938 filegroup {
7939 name: "myapex_apks_file",
7940 srcs: ["myapex.apks"],
7941 }
7942 `)
7943
7944 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7945
7946 // Check that the extractor produces the correct apks file from the input module
7947 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7948 extractedApex := m.Output(extractorOutput)
7949
7950 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7951}
7952
Paul Duffin89f570a2021-06-16 01:42:33 +01007953func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007954 t.Helper()
7955
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007956 bp := `
7957 java_library {
7958 name: "some-updatable-apex-lib",
7959 srcs: ["a.java"],
7960 sdk_version: "current",
7961 apex_available: [
7962 "some-updatable-apex",
7963 ],
satayevabcd5972021-08-06 17:49:46 +01007964 permitted_packages: ["some.updatable.apex.lib"],
Spandan Dascc9d9422023-04-06 18:07:43 +00007965 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007966 }
7967
7968 java_library {
7969 name: "some-non-updatable-apex-lib",
7970 srcs: ["a.java"],
7971 apex_available: [
7972 "some-non-updatable-apex",
7973 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007974 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007975 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007976 }
7977
7978 bootclasspath_fragment {
7979 name: "some-non-updatable-fragment",
7980 contents: ["some-non-updatable-apex-lib"],
7981 apex_available: [
7982 "some-non-updatable-apex",
7983 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007984 hidden_api: {
7985 split_packages: ["*"],
7986 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007987 }
7988
7989 java_library {
7990 name: "some-platform-lib",
7991 srcs: ["a.java"],
7992 sdk_version: "current",
7993 installable: true,
7994 }
7995
7996 java_library {
7997 name: "some-art-lib",
7998 srcs: ["a.java"],
7999 sdk_version: "current",
8000 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00008001 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008002 ],
8003 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01008004 compile_dex: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00008005 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008006 }
8007
8008 apex {
8009 name: "some-updatable-apex",
8010 key: "some-updatable-apex.key",
8011 java_libs: ["some-updatable-apex-lib"],
8012 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00008013 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008014 }
8015
8016 apex {
8017 name: "some-non-updatable-apex",
8018 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01008019 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008020 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008021 }
8022
8023 apex_key {
8024 name: "some-updatable-apex.key",
8025 }
8026
8027 apex_key {
8028 name: "some-non-updatable-apex.key",
8029 }
8030
8031 apex {
Paul Duffind376f792021-01-26 11:59:35 +00008032 name: "com.android.art.debug",
8033 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01008034 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008035 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00008036 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008037 }
8038
Paul Duffinf23bc472021-04-27 12:42:20 +01008039 bootclasspath_fragment {
8040 name: "art-bootclasspath-fragment",
8041 image_name: "art",
8042 contents: ["some-art-lib"],
8043 apex_available: [
8044 "com.android.art.debug",
8045 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01008046 hidden_api: {
8047 split_packages: ["*"],
8048 },
Paul Duffinf23bc472021-04-27 12:42:20 +01008049 }
8050
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008051 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00008052 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008053 }
8054
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008055 filegroup {
8056 name: "some-updatable-apex-file_contexts",
8057 srcs: [
8058 "system/sepolicy/apex/some-updatable-apex-file_contexts",
8059 ],
8060 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008061
8062 filegroup {
8063 name: "some-non-updatable-apex-file_contexts",
8064 srcs: [
8065 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
8066 ],
8067 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008068 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00008069
Paul Duffin89f570a2021-06-16 01:42:33 +01008070 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00008071}
8072
Paul Duffin89f570a2021-06-16 01:42:33 +01008073func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008074 t.Helper()
8075
Paul Duffin55607122021-03-30 23:32:51 +01008076 fs := android.MockFS{
8077 "a.java": nil,
8078 "a.jar": nil,
8079 "apex_manifest.json": nil,
8080 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008081 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008082 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8083 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8084 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008085 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008086 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008087
Paul Duffin55607122021-03-30 23:32:51 +01008088 errorHandler := android.FixtureExpectsNoErrors
8089 if errmsg != "" {
8090 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008091 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008092
Paul Duffin55607122021-03-30 23:32:51 +01008093 result := android.GroupFixturePreparers(
8094 cc.PrepareForTestWithCcDefaultModules,
8095 java.PrepareForTestWithHiddenApiBuildComponents,
8096 java.PrepareForTestWithJavaDefaultModules,
8097 java.PrepareForTestWithJavaSdkLibraryFiles,
8098 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008099 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008100 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008101 android.FixtureModifyMockFS(func(fs android.MockFS) {
8102 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8103 insert := ""
8104 for _, fragment := range fragments {
8105 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8106 }
8107 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8108 platform_bootclasspath {
8109 name: "platform-bootclasspath",
8110 fragments: [
8111 %s
8112 ],
8113 }
8114 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008115 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008116 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008117 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008118 ).
8119 ExtendWithErrorHandler(errorHandler).
8120 RunTestWithBp(t, bp)
8121
8122 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008123}
8124
Paul Duffin5556c5f2022-06-09 17:32:21 +00008125func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008126 preparers := android.GroupFixturePreparers(
8127 java.PrepareForTestWithJavaDefaultModules,
8128 PrepareForTestWithApexBuildComponents,
8129 ).
8130 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
8131 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
8132
8133 bpBase := `
8134 apex_set {
8135 name: "com.android.myapex",
8136 installable: true,
8137 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8138 set: "myapex.apks",
8139 }
8140
8141 apex_set {
8142 name: "com.mycompany.android.myapex",
8143 apex_name: "com.android.myapex",
8144 installable: true,
8145 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8146 set: "company-myapex.apks",
8147 }
8148
8149 prebuilt_bootclasspath_fragment {
8150 name: "my-bootclasspath-fragment",
8151 apex_available: ["com.android.myapex"],
8152 %s
8153 }
8154 `
8155
8156 t.Run("java_import", func(t *testing.T) {
8157 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8158 java_import {
8159 name: "libfoo",
8160 jars: ["libfoo.jar"],
8161 apex_available: ["com.android.myapex"],
8162 }
8163 `)
8164 })
8165
8166 t.Run("java_sdk_library_import", func(t *testing.T) {
8167 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8168 java_sdk_library_import {
8169 name: "libfoo",
8170 public: {
8171 jars: ["libbar.jar"],
8172 },
8173 apex_available: ["com.android.myapex"],
8174 }
8175 `)
8176 })
8177
8178 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8179 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8180 image_name: "art",
8181 contents: ["libfoo"],
8182 `)+`
8183 java_sdk_library_import {
8184 name: "libfoo",
8185 public: {
8186 jars: ["libbar.jar"],
8187 },
8188 apex_available: ["com.android.myapex"],
8189 }
8190 `)
8191 })
8192}
8193
Paul Duffin5556c5f2022-06-09 17:32:21 +00008194func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8195 preparers := android.GroupFixturePreparers(
8196 java.PrepareForTestWithJavaDefaultModules,
8197 PrepareForTestWithApexBuildComponents,
8198 )
8199
8200 bpBase := `
8201 apex_set {
8202 name: "com.android.myapex",
8203 installable: true,
8204 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8205 set: "myapex.apks",
8206 }
8207
8208 apex_set {
8209 name: "com.android.myapex_compressed",
8210 apex_name: "com.android.myapex",
8211 installable: true,
8212 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8213 set: "myapex_compressed.apks",
8214 }
8215
8216 prebuilt_bootclasspath_fragment {
8217 name: "my-bootclasspath-fragment",
8218 apex_available: [
8219 "com.android.myapex",
8220 "com.android.myapex_compressed",
8221 ],
8222 hidden_api: {
8223 annotation_flags: "annotation-flags.csv",
8224 metadata: "metadata.csv",
8225 index: "index.csv",
8226 signature_patterns: "signature_patterns.csv",
8227 },
8228 %s
8229 }
8230 `
8231
8232 t.Run("java_import", func(t *testing.T) {
8233 result := preparers.RunTestWithBp(t,
8234 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8235 java_import {
8236 name: "libfoo",
8237 jars: ["libfoo.jar"],
8238 apex_available: [
8239 "com.android.myapex",
8240 "com.android.myapex_compressed",
8241 ],
8242 }
8243 `)
8244
8245 module := result.Module("libfoo", "android_common_com.android.myapex")
8246 usesLibraryDep := module.(java.UsesLibraryDependency)
8247 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8248 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8249 usesLibraryDep.DexJarBuildPath().Path())
8250 })
8251
8252 t.Run("java_sdk_library_import", func(t *testing.T) {
8253 result := preparers.RunTestWithBp(t,
8254 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8255 java_sdk_library_import {
8256 name: "libfoo",
8257 public: {
8258 jars: ["libbar.jar"],
8259 },
8260 apex_available: [
8261 "com.android.myapex",
8262 "com.android.myapex_compressed",
8263 ],
8264 compile_dex: true,
8265 }
8266 `)
8267
8268 module := result.Module("libfoo", "android_common_com.android.myapex")
8269 usesLibraryDep := module.(java.UsesLibraryDependency)
8270 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8271 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8272 usesLibraryDep.DexJarBuildPath().Path())
8273 })
8274
8275 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8276 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8277 image_name: "art",
8278 contents: ["libfoo"],
8279 `)+`
8280 java_sdk_library_import {
8281 name: "libfoo",
8282 public: {
8283 jars: ["libbar.jar"],
8284 },
8285 apex_available: [
8286 "com.android.myapex",
8287 "com.android.myapex_compressed",
8288 ],
8289 compile_dex: true,
8290 }
8291 `)
8292 })
8293}
8294
Jooyung Han548640b2020-04-27 12:10:30 +09008295func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8296 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8297 apex {
8298 name: "myapex",
8299 key: "myapex.key",
8300 updatable: true,
8301 }
8302
8303 apex_key {
8304 name: "myapex.key",
8305 public_key: "testkey.avbpubkey",
8306 private_key: "testkey.pem",
8307 }
8308 `)
8309}
8310
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008311func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8312 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8313 apex {
8314 name: "myapex",
8315 key: "myapex.key",
8316 }
8317
8318 apex_key {
8319 name: "myapex.key",
8320 public_key: "testkey.avbpubkey",
8321 private_key: "testkey.pem",
8322 }
8323 `)
8324}
8325
Jooyung Handfc864c2023-03-20 18:19:07 +09008326func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8327 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008328 apex {
8329 name: "myapex",
8330 key: "myapex.key",
8331 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008332 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008333 soc_specific: true,
8334 }
8335
8336 apex_key {
8337 name: "myapex.key",
8338 public_key: "testkey.avbpubkey",
8339 private_key: "testkey.pem",
8340 }
8341 `)
8342}
8343
Jooyung Han02873da2023-03-22 17:41:03 +09008344func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8345 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8346 apex {
8347 name: "myapex",
8348 key: "myapex.key",
8349 updatable: false,
8350 min_sdk_version: "29",
8351 use_vndk_as_stable: true,
8352 vendor: true,
8353 }
8354
8355 apex_key {
8356 name: "myapex.key",
8357 public_key: "testkey.avbpubkey",
8358 private_key: "testkey.pem",
8359 }
8360 `)
8361}
8362
Jooyung Handfc864c2023-03-20 18:19:07 +09008363func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8364 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8365 apex {
8366 name: "myapex",
8367 key: "myapex.key",
8368 updatable: false,
8369 use_vndk_as_stable: true,
8370 }
8371
8372 apex_key {
8373 name: "myapex.key",
8374 public_key: "testkey.avbpubkey",
8375 private_key: "testkey.pem",
8376 }
8377 `)
8378}
8379
satayevb98371c2021-06-15 16:49:50 +01008380func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8381 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8382 apex {
8383 name: "myapex",
8384 key: "myapex.key",
8385 systemserverclasspath_fragments: [
8386 "mysystemserverclasspathfragment",
8387 ],
8388 min_sdk_version: "29",
8389 updatable: true,
8390 }
8391
8392 apex_key {
8393 name: "myapex.key",
8394 public_key: "testkey.avbpubkey",
8395 private_key: "testkey.pem",
8396 }
8397
8398 java_library {
8399 name: "foo",
8400 srcs: ["b.java"],
8401 min_sdk_version: "29",
8402 installable: true,
8403 apex_available: [
8404 "myapex",
8405 ],
8406 }
8407
8408 systemserverclasspath_fragment {
8409 name: "mysystemserverclasspathfragment",
8410 generate_classpaths_proto: false,
8411 contents: [
8412 "foo",
8413 ],
8414 apex_available: [
8415 "myapex",
8416 ],
8417 }
satayevabcd5972021-08-06 17:49:46 +01008418 `,
8419 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8420 )
satayevb98371c2021-06-15 16:49:50 +01008421}
8422
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008423func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008424 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
8425 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
8426 // modules to be included in the BootJars.
8427 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
8428 return android.GroupFixturePreparers(
8429 dexpreopt.FixtureSetBootJars(bootJars...),
8430 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8431 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8432 }),
8433 )
8434 }
8435
8436 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
8437 // same value. This can result in an invalid configuration as it allows non art apex jars to be
8438 // specified in the ArtApexJars configuration.
8439 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
8440 return android.GroupFixturePreparers(
8441 dexpreopt.FixtureSetArtBootJars(bootJars...),
8442 dexpreopt.FixtureSetBootJars(bootJars...),
8443 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8444 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8445 }),
8446 )
8447 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008448
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008449 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008450 preparer := android.GroupFixturePreparers(
8451 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
8452 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8453 )
8454 fragments := []java.ApexVariantReference{
8455 {
8456 Apex: proptools.StringPtr("com.android.art.debug"),
8457 Module: proptools.StringPtr("art-bootclasspath-fragment"),
8458 },
8459 {
8460 Apex: proptools.StringPtr("some-non-updatable-apex"),
8461 Module: proptools.StringPtr("some-non-updatable-fragment"),
8462 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008463 }
satayevabcd5972021-08-06 17:49:46 +01008464 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008465 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008466
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008467 t.Run("updatable jar from ART apex in the platform bootclasspath => error", func(t *testing.T) {
8468 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 +01008469 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01008470 preparer := android.GroupFixturePreparers(
8471 prepareSetBootJars("com.android.art.debug:some-art-lib"),
8472 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8473 )
Paul Duffin60264a02021-04-12 20:02:36 +01008474 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008475 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008476
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008477 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 +01008478 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 +01008479 // Update the dexpreopt ArtApexJars directly.
8480 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
8481 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008482 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008483
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008484 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 +01008485 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 +01008486 // Update the dexpreopt ArtApexJars directly.
8487 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
8488 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008489 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008490
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008491 t.Run("updatable jar from some other apex in the platform bootclasspath => error", func(t *testing.T) {
8492 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 +01008493 preparer := android.GroupFixturePreparers(
8494 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
8495 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8496 )
Paul Duffin60264a02021-04-12 20:02:36 +01008497 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008498 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008499
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008500 t.Run("non-updatable jar from some other apex in the platform bootclasspath => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008501 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01008502 fragment := java.ApexVariantReference{
8503 Apex: proptools.StringPtr("some-non-updatable-apex"),
8504 Module: proptools.StringPtr("some-non-updatable-fragment"),
8505 }
8506 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008507 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008508
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008509 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008510 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008511 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8512 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008513 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008514
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008515 t.Run("nonexistent jar in the platform bootclasspath => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008516 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008517 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8518 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008519 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008520
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008521 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008522 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01008523 // Update the dexpreopt ArtApexJars directly.
8524 preparer := prepareSetArtJars("platform:some-platform-lib")
8525 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008526 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008527
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008528 t.Run("platform jar in the platform bootclasspath => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008529 preparer := android.GroupFixturePreparers(
8530 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8531 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8532 )
8533 fragments := []java.ApexVariantReference{
8534 {
8535 Apex: proptools.StringPtr("some-non-updatable-apex"),
8536 Module: proptools.StringPtr("some-non-updatable-fragment"),
8537 },
8538 }
8539 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008540 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008541}
8542
8543func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008544 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008545 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008546 fragment := java.ApexVariantReference{
8547 Apex: proptools.StringPtr("myapex"),
8548 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8549 }
8550
Paul Duffin064b70c2020-11-02 17:32:38 +00008551 testDexpreoptWithApexes(t, `
8552 prebuilt_apex {
8553 name: "myapex" ,
8554 arch: {
8555 arm64: {
8556 src: "myapex-arm64.apex",
8557 },
8558 arm: {
8559 src: "myapex-arm.apex",
8560 },
8561 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008562 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8563 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008564
Paul Duffin89f570a2021-06-16 01:42:33 +01008565 prebuilt_bootclasspath_fragment {
8566 name: "my-bootclasspath-fragment",
8567 contents: ["libfoo"],
8568 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008569 hidden_api: {
8570 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8571 metadata: "my-bootclasspath-fragment/metadata.csv",
8572 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008573 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8574 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8575 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008576 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008577 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008578
Paul Duffin89f570a2021-06-16 01:42:33 +01008579 java_import {
8580 name: "libfoo",
8581 jars: ["libfoo.jar"],
8582 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008583 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008584 }
8585 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008586 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008587}
8588
Spandan Dasf14e2542021-11-12 00:01:37 +00008589func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008590 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008591 bp += `
8592 apex_key {
8593 name: "myapex.key",
8594 public_key: "testkey.avbpubkey",
8595 private_key: "testkey.pem",
8596 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008597 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008598 "lib1/src/A.java": nil,
8599 "lib2/src/B.java": nil,
8600 "system/sepolicy/apex/myapex-file_contexts": nil,
8601 }
8602
Paul Duffin45338f02021-03-30 23:07:52 +01008603 errorHandler := android.FixtureExpectsNoErrors
8604 if errmsg != "" {
8605 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008606 }
Colin Crossae8600b2020-10-29 17:09:13 -07008607
Paul Duffin45338f02021-03-30 23:07:52 +01008608 android.GroupFixturePreparers(
8609 android.PrepareForTestWithAndroidBuildComponents,
8610 java.PrepareForTestWithJavaBuildComponents,
8611 PrepareForTestWithApexBuildComponents,
8612 android.PrepareForTestWithNeverallowRules(rules),
8613 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008614 apexBootJars := make([]string, 0, len(bootJars))
8615 for _, apexBootJar := range bootJars {
8616 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008617 }
satayevd604b212021-07-21 14:23:52 +01008618 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008619 }),
8620 fs.AddToFixture(),
8621 ).
8622 ExtendWithErrorHandler(errorHandler).
8623 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008624}
8625
8626func TestApexPermittedPackagesRules(t *testing.T) {
8627 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008628 name string
8629 expectedError string
8630 bp string
8631 bootJars []string
8632 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008633 }{
8634
8635 {
8636 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8637 expectedError: "",
8638 bp: `
8639 java_library {
8640 name: "bcp_lib1",
8641 srcs: ["lib1/src/*.java"],
8642 permitted_packages: ["foo.bar"],
8643 apex_available: ["myapex"],
8644 sdk_version: "none",
8645 system_modules: "none",
8646 }
8647 java_library {
8648 name: "nonbcp_lib2",
8649 srcs: ["lib2/src/*.java"],
8650 apex_available: ["myapex"],
8651 permitted_packages: ["a.b"],
8652 sdk_version: "none",
8653 system_modules: "none",
8654 }
8655 apex {
8656 name: "myapex",
8657 key: "myapex.key",
8658 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008659 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008660 }`,
8661 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008662 bcpPermittedPackages: map[string][]string{
8663 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008664 "foo.bar",
8665 },
8666 },
8667 },
8668 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008669 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008670 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 +01008671 bp: `
8672 java_library {
8673 name: "bcp_lib1",
8674 srcs: ["lib1/src/*.java"],
8675 apex_available: ["myapex"],
8676 permitted_packages: ["foo.bar"],
8677 sdk_version: "none",
8678 system_modules: "none",
8679 }
8680 java_library {
8681 name: "bcp_lib2",
8682 srcs: ["lib2/src/*.java"],
8683 apex_available: ["myapex"],
8684 permitted_packages: ["foo.bar", "bar.baz"],
8685 sdk_version: "none",
8686 system_modules: "none",
8687 }
8688 apex {
8689 name: "myapex",
8690 key: "myapex.key",
8691 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008692 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008693 }
8694 `,
8695 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008696 bcpPermittedPackages: map[string][]string{
8697 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008698 "foo.bar",
8699 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008700 "bcp_lib2": []string{
8701 "foo.bar",
8702 },
8703 },
8704 },
8705 {
8706 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8707 expectedError: "",
8708 bp: `
8709 java_library {
8710 name: "bcp_lib_restricted",
8711 srcs: ["lib1/src/*.java"],
8712 apex_available: ["myapex"],
8713 permitted_packages: ["foo.bar"],
8714 sdk_version: "none",
8715 min_sdk_version: "29",
8716 system_modules: "none",
8717 }
8718 java_library {
8719 name: "bcp_lib_unrestricted",
8720 srcs: ["lib2/src/*.java"],
8721 apex_available: ["myapex"],
8722 permitted_packages: ["foo.bar", "bar.baz"],
8723 sdk_version: "none",
8724 min_sdk_version: "29",
8725 system_modules: "none",
8726 }
8727 apex {
8728 name: "myapex",
8729 key: "myapex.key",
8730 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8731 updatable: true,
8732 min_sdk_version: "29",
8733 }
8734 `,
8735 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8736 bcpPermittedPackages: map[string][]string{
8737 "bcp_lib1_non_updateable": []string{
8738 "foo.bar",
8739 },
8740 // 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 +01008741 },
8742 },
8743 }
8744 for _, tc := range testcases {
8745 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008746 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8747 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008748 })
8749 }
8750}
8751
Jiyong Park62304bb2020-04-13 16:19:48 +09008752func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008753 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008754 apex {
8755 name: "myapex",
8756 key: "myapex.key",
8757 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008758 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008759 }
8760
8761 apex_key {
8762 name: "myapex.key",
8763 public_key: "testkey.avbpubkey",
8764 private_key: "testkey.pem",
8765 }
8766
8767 cc_library {
8768 name: "mylib",
8769 srcs: ["mylib.cpp"],
8770 system_shared_libs: [],
8771 stl: "none",
8772 stubs: {
8773 versions: ["1"],
8774 },
8775 apex_available: ["myapex"],
8776 }
8777
8778 cc_library {
8779 name: "myprivlib",
8780 srcs: ["mylib.cpp"],
8781 system_shared_libs: [],
8782 stl: "none",
8783 apex_available: ["myapex"],
8784 }
8785
8786
8787 cc_test {
8788 name: "mytest",
8789 gtest: false,
8790 srcs: ["mylib.cpp"],
8791 system_shared_libs: [],
8792 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008793 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008794 test_for: ["myapex"]
8795 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008796
8797 cc_library {
8798 name: "mytestlib",
8799 srcs: ["mylib.cpp"],
8800 system_shared_libs: [],
8801 shared_libs: ["mylib", "myprivlib"],
8802 stl: "none",
8803 test_for: ["myapex"],
8804 }
8805
8806 cc_benchmark {
8807 name: "mybench",
8808 srcs: ["mylib.cpp"],
8809 system_shared_libs: [],
8810 shared_libs: ["mylib", "myprivlib"],
8811 stl: "none",
8812 test_for: ["myapex"],
8813 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008814 `)
8815
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008816 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008817 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008818 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8819 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8820 }
8821
8822 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008823 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008824 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8825 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8826 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8827}
Jiyong Park46a512f2020-12-04 18:02:13 +09008828
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008829func TestIndirectTestFor(t *testing.T) {
8830 ctx := testApex(t, `
8831 apex {
8832 name: "myapex",
8833 key: "myapex.key",
8834 native_shared_libs: ["mylib", "myprivlib"],
8835 updatable: false,
8836 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008837
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008838 apex_key {
8839 name: "myapex.key",
8840 public_key: "testkey.avbpubkey",
8841 private_key: "testkey.pem",
8842 }
8843
8844 cc_library {
8845 name: "mylib",
8846 srcs: ["mylib.cpp"],
8847 system_shared_libs: [],
8848 stl: "none",
8849 stubs: {
8850 versions: ["1"],
8851 },
8852 apex_available: ["myapex"],
8853 }
8854
8855 cc_library {
8856 name: "myprivlib",
8857 srcs: ["mylib.cpp"],
8858 system_shared_libs: [],
8859 stl: "none",
8860 shared_libs: ["mylib"],
8861 apex_available: ["myapex"],
8862 }
8863
8864 cc_library {
8865 name: "mytestlib",
8866 srcs: ["mylib.cpp"],
8867 system_shared_libs: [],
8868 shared_libs: ["myprivlib"],
8869 stl: "none",
8870 test_for: ["myapex"],
8871 }
8872 `)
8873
8874 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008875 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008876 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8877 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8878 }
8879
8880 // The platform variant of mytestlib links to the platform variant of the
8881 // internal myprivlib.
8882 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8883
8884 // The platform variant of myprivlib links to the platform variant of mylib
8885 // and bypasses its stubs.
8886 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 +09008887}
8888
Martin Stjernholmec009002021-03-27 15:18:31 +00008889func TestTestForForLibInOtherApex(t *testing.T) {
8890 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8891 _ = testApex(t, `
8892 apex {
8893 name: "com.android.art",
8894 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008895 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008896 updatable: false,
8897 }
8898
8899 apex {
8900 name: "com.android.art.debug",
8901 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008902 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008903 updatable: false,
8904 }
8905
8906 apex_key {
8907 name: "myapex.key",
8908 public_key: "testkey.avbpubkey",
8909 private_key: "testkey.pem",
8910 }
8911
8912 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008913 name: "libnativebridge",
8914 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008915 system_shared_libs: [],
8916 stl: "none",
8917 stubs: {
8918 versions: ["1"],
8919 },
8920 apex_available: ["com.android.art", "com.android.art.debug"],
8921 }
8922
8923 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008924 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008925 srcs: ["mylib.cpp"],
8926 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008927 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008928 stl: "none",
8929 apex_available: ["com.android.art.debug"],
8930 test_for: ["com.android.art"],
8931 }
8932 `,
8933 android.MockFS{
8934 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8935 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8936 }.AddToFixture())
8937}
8938
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008939// TODO(jungjw): Move this to proptools
8940func intPtr(i int) *int {
8941 return &i
8942}
8943
8944func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008945 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008946 apex_set {
8947 name: "myapex",
8948 set: "myapex.apks",
8949 filename: "foo_v2.apex",
8950 overrides: ["foo"],
8951 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008952 `,
8953 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8954 variables.Platform_sdk_version = intPtr(30)
8955 }),
8956 android.FixtureModifyConfig(func(config android.Config) {
8957 config.Targets[android.Android] = []android.Target{
8958 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8959 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8960 }
8961 }),
8962 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008963
Paul Duffin24704672021-04-06 16:09:30 +01008964 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008965
8966 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008967 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008968 actual := extractedApex.Args["abis"]
8969 expected := "ARMEABI_V7A,ARM64_V8A"
8970 if actual != expected {
8971 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8972 }
8973 actual = extractedApex.Args["sdk-version"]
8974 expected = "30"
8975 if actual != expected {
8976 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8977 }
8978
Paul Duffin6717d882021-06-15 19:09:41 +01008979 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008980 a := m.Module().(*ApexSet)
8981 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008982 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008983 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8984 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8985 }
8986}
8987
Anton Hansson805e0a52022-11-25 14:06:46 +00008988func TestApexSet_NativeBridge(t *testing.T) {
8989 ctx := testApex(t, `
8990 apex_set {
8991 name: "myapex",
8992 set: "myapex.apks",
8993 filename: "foo_v2.apex",
8994 overrides: ["foo"],
8995 }
8996 `,
8997 android.FixtureModifyConfig(func(config android.Config) {
8998 config.Targets[android.Android] = []android.Target{
8999 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9000 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9001 }
9002 }),
9003 )
9004
9005 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
9006
9007 // Check extract_apks tool parameters. No native bridge arch expected
9008 extractedApex := m.Output("extracted/myapex.apks")
9009 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9010}
9011
Jiyong Park7d95a512020-05-10 15:16:24 +09009012func TestNoStaticLinkingToStubsLib(t *testing.T) {
9013 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9014 apex {
9015 name: "myapex",
9016 key: "myapex.key",
9017 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009018 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009019 }
9020
9021 apex_key {
9022 name: "myapex.key",
9023 public_key: "testkey.avbpubkey",
9024 private_key: "testkey.pem",
9025 }
9026
9027 cc_library {
9028 name: "mylib",
9029 srcs: ["mylib.cpp"],
9030 static_libs: ["otherlib"],
9031 system_shared_libs: [],
9032 stl: "none",
9033 apex_available: [ "myapex" ],
9034 }
9035
9036 cc_library {
9037 name: "otherlib",
9038 srcs: ["mylib.cpp"],
9039 system_shared_libs: [],
9040 stl: "none",
9041 stubs: {
9042 versions: ["1", "2", "3"],
9043 },
9044 apex_available: [ "myapex" ],
9045 }
9046 `)
9047}
9048
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009049func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009050 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009051 apex {
9052 name: "myapex",
9053 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009054 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009055 custom_sign_tool: "sign_myapex",
9056 }
9057
9058 apex_key {
9059 name: "myapex.key",
9060 public_key: "testkey.avbpubkey",
9061 private_key: "testkey.pem",
9062 }
9063 `)
9064
9065 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9066 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
9067 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"`)
9068}
9069
9070func TestApexKeysTxtOverrides(t *testing.T) {
9071 ctx := testApex(t, `
9072 apex {
9073 name: "myapex",
9074 key: "myapex.key",
9075 updatable: false,
9076 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009077 }
9078
9079 apex_key {
9080 name: "myapex.key",
9081 public_key: "testkey.avbpubkey",
9082 private_key: "testkey.pem",
9083 }
9084
9085 prebuilt_apex {
9086 name: "myapex",
9087 prefer: true,
9088 arch: {
9089 arm64: {
9090 src: "myapex-arm64.apex",
9091 },
9092 arm: {
9093 src: "myapex-arm.apex",
9094 },
9095 },
9096 }
9097
9098 apex_set {
9099 name: "myapex_set",
9100 set: "myapex.apks",
9101 filename: "myapex_set.apex",
9102 overrides: ["myapex"],
9103 }
9104 `)
9105
9106 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9107 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
9108 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 +09009109 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 +09009110}
9111
Jooyung Han938b5932020-06-20 12:47:47 +09009112func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009113 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009114 apex {
9115 name: "myapex",
9116 key: "myapex.key",
9117 apps: ["app"],
9118 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009119 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009120 }
9121
9122 apex_key {
9123 name: "myapex.key",
9124 public_key: "testkey.avbpubkey",
9125 private_key: "testkey.pem",
9126 }
9127
9128 android_app {
9129 name: "app",
9130 srcs: ["foo/bar/MyClass.java"],
9131 package_name: "foo",
9132 sdk_version: "none",
9133 system_modules: "none",
9134 apex_available: [ "myapex" ],
9135 }
9136 `, withFiles(map[string][]byte{
9137 "sub/Android.bp": []byte(`
9138 override_apex {
9139 name: "override_myapex",
9140 base: "myapex",
9141 apps: ["override_app"],
9142 allowed_files: ":allowed",
9143 }
9144 // Overridable "path" property should be referenced indirectly
9145 filegroup {
9146 name: "allowed",
9147 srcs: ["allowed.txt"],
9148 }
9149 override_android_app {
9150 name: "override_app",
9151 base: "app",
9152 package_name: "bar",
9153 }
9154 `),
9155 }))
9156
9157 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
9158 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9159 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9160 }
9161
9162 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
9163 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9164 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9165 }
9166}
9167
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009168func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009169 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009170 apex {
9171 name: "myapex",
9172 key: "myapex.key",
9173 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009174 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009175 }
9176
9177 apex_key {
9178 name: "myapex.key",
9179 public_key: "testkey.avbpubkey",
9180 private_key: "testkey.pem",
9181 }
9182
9183 cc_library {
9184 name: "mylib",
9185 srcs: ["mylib.cpp"],
9186 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009187 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009188 },
9189 apex_available: ["myapex"],
9190 }
9191
9192 cc_prebuilt_library_shared {
9193 name: "mylib",
9194 prefer: false,
9195 srcs: ["prebuilt.so"],
9196 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009197 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009198 },
9199 apex_available: ["myapex"],
9200 }
9201 `)
9202}
9203
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009204func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009205 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009206 apex {
9207 name: "myapex",
9208 key: "myapex.key",
9209 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009210 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009211 }
9212 apex_key {
9213 name: "myapex.key",
9214 public_key: "testkey.avbpubkey",
9215 private_key: "testkey.pem",
9216 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009217 `,
9218 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9219 variables.CompressedApex = proptools.BoolPtr(true)
9220 }),
9221 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009222
9223 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
9224 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9225
9226 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
9227 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9228
9229 // Make sure output of bundle is .capex
9230 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9231 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9232
9233 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009234 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009235 var builder strings.Builder
9236 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9237 androidMk := builder.String()
9238 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9239}
9240
Martin Stjernholm2856c662020-12-02 15:03:42 +00009241func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009242 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009243 apex {
9244 name: "myapex",
9245 key: "myapex.key",
9246 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009247 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009248 }
9249
9250 apex_key {
9251 name: "myapex.key",
9252 public_key: "testkey.avbpubkey",
9253 private_key: "testkey.pem",
9254 }
9255
9256 cc_library {
9257 name: "mylib",
9258 srcs: ["mylib.cpp"],
9259 apex_available: ["myapex"],
9260 shared_libs: ["otherlib"],
9261 system_shared_libs: [],
9262 }
9263
9264 cc_library {
9265 name: "otherlib",
9266 srcs: ["mylib.cpp"],
9267 stubs: {
9268 versions: ["current"],
9269 },
9270 }
9271
9272 cc_prebuilt_library_shared {
9273 name: "otherlib",
9274 prefer: true,
9275 srcs: ["prebuilt.so"],
9276 stubs: {
9277 versions: ["current"],
9278 },
9279 }
9280 `)
9281
9282 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009283 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009284 var builder strings.Builder
9285 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9286 androidMk := builder.String()
9287
9288 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9289 // a thing there.
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009290 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 +00009291}
9292
Jiyong Parke3867542020-12-03 17:28:25 +09009293func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009294 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009295 apex {
9296 name: "myapex",
9297 key: "myapex.key",
9298 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009299 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009300 }
9301
9302 apex_key {
9303 name: "myapex.key",
9304 public_key: "testkey.avbpubkey",
9305 private_key: "testkey.pem",
9306 }
9307
9308 cc_library {
9309 name: "mylib",
9310 srcs: ["mylib.cpp"],
9311 system_shared_libs: [],
9312 stl: "none",
9313 apex_available: ["myapex"],
9314 shared_libs: ["mylib2"],
9315 target: {
9316 apex: {
9317 exclude_shared_libs: ["mylib2"],
9318 },
9319 },
9320 }
9321
9322 cc_library {
9323 name: "mylib2",
9324 srcs: ["mylib.cpp"],
9325 system_shared_libs: [],
9326 stl: "none",
9327 }
9328 `)
9329
9330 // Check if mylib is linked to mylib2 for the non-apex target
9331 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9332 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9333
9334 // Make sure that the link doesn't occur for the apex target
9335 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9336 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9337
9338 // It shouldn't appear in the copy cmd as well.
9339 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
9340 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9341}
9342
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009343func TestPrebuiltStubLibDep(t *testing.T) {
9344 bpBase := `
9345 apex {
9346 name: "myapex",
9347 key: "myapex.key",
9348 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009349 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009350 }
9351 apex_key {
9352 name: "myapex.key",
9353 public_key: "testkey.avbpubkey",
9354 private_key: "testkey.pem",
9355 }
9356 cc_library {
9357 name: "mylib",
9358 srcs: ["mylib.cpp"],
9359 apex_available: ["myapex"],
9360 shared_libs: ["stublib"],
9361 system_shared_libs: [],
9362 }
9363 apex {
9364 name: "otherapex",
9365 enabled: %s,
9366 key: "myapex.key",
9367 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009368 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009369 }
9370 `
9371
9372 stublibSourceBp := `
9373 cc_library {
9374 name: "stublib",
9375 srcs: ["mylib.cpp"],
9376 apex_available: ["otherapex"],
9377 system_shared_libs: [],
9378 stl: "none",
9379 stubs: {
9380 versions: ["1"],
9381 },
9382 }
9383 `
9384
9385 stublibPrebuiltBp := `
9386 cc_prebuilt_library_shared {
9387 name: "stublib",
9388 srcs: ["prebuilt.so"],
9389 apex_available: ["otherapex"],
9390 stubs: {
9391 versions: ["1"],
9392 },
9393 %s
9394 }
9395 `
9396
9397 tests := []struct {
9398 name string
9399 stublibBp string
9400 usePrebuilt bool
9401 modNames []string // Modules to collect AndroidMkEntries for
9402 otherApexEnabled []string
9403 }{
9404 {
9405 name: "only_source",
9406 stublibBp: stublibSourceBp,
9407 usePrebuilt: false,
9408 modNames: []string{"stublib"},
9409 otherApexEnabled: []string{"true", "false"},
9410 },
9411 {
9412 name: "source_preferred",
9413 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9414 usePrebuilt: false,
9415 modNames: []string{"stublib", "prebuilt_stublib"},
9416 otherApexEnabled: []string{"true", "false"},
9417 },
9418 {
9419 name: "prebuilt_preferred",
9420 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9421 usePrebuilt: true,
9422 modNames: []string{"stublib", "prebuilt_stublib"},
9423 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9424 },
9425 {
9426 name: "only_prebuilt",
9427 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9428 usePrebuilt: true,
9429 modNames: []string{"stublib"},
9430 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9431 },
9432 }
9433
9434 for _, test := range tests {
9435 t.Run(test.name, func(t *testing.T) {
9436 for _, otherApexEnabled := range test.otherApexEnabled {
9437 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009438 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009439
9440 type modAndMkEntries struct {
9441 mod *cc.Module
9442 mkEntries android.AndroidMkEntries
9443 }
9444 entries := []*modAndMkEntries{}
9445
9446 // Gather shared lib modules that are installable
9447 for _, modName := range test.modNames {
9448 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9449 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9450 continue
9451 }
9452 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009453 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009454 continue
9455 }
Colin Crossaa255532020-07-03 13:18:24 -07009456 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009457 if ent.Disabled {
9458 continue
9459 }
9460 entries = append(entries, &modAndMkEntries{
9461 mod: mod,
9462 mkEntries: ent,
9463 })
9464 }
9465 }
9466 }
9467
9468 var entry *modAndMkEntries = nil
9469 for _, ent := range entries {
9470 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9471 if entry != nil {
9472 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9473 } else {
9474 entry = ent
9475 }
9476 }
9477 }
9478
9479 if entry == nil {
9480 t.Errorf("AndroidMk entry for \"stublib\" missing")
9481 } else {
9482 isPrebuilt := entry.mod.Prebuilt() != nil
9483 if isPrebuilt != test.usePrebuilt {
9484 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9485 }
9486 if !entry.mod.IsStubs() {
9487 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9488 }
9489 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9490 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9491 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009492 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009493 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009494 if !android.InList(expected, cflags) {
9495 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9496 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009497 }
9498 })
9499 }
9500 })
9501 }
9502}
9503
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009504func TestHostApexInHostOnlyBuild(t *testing.T) {
9505 testApex(t, `
9506 apex {
9507 name: "myapex",
9508 host_supported: true,
9509 key: "myapex.key",
9510 updatable: false,
9511 payload_type: "zip",
9512 }
9513 apex_key {
9514 name: "myapex.key",
9515 public_key: "testkey.avbpubkey",
9516 private_key: "testkey.pem",
9517 }
9518 `,
9519 android.FixtureModifyConfig(func(config android.Config) {
9520 // We may not have device targets in all builds, e.g. in
9521 // prebuilts/build-tools/build-prebuilts.sh
9522 config.Targets[android.Android] = []android.Target{}
9523 }))
9524}
9525
Colin Crossc33e5212021-05-25 18:16:02 -07009526func TestApexJavaCoverage(t *testing.T) {
9527 bp := `
9528 apex {
9529 name: "myapex",
9530 key: "myapex.key",
9531 java_libs: ["mylib"],
9532 bootclasspath_fragments: ["mybootclasspathfragment"],
9533 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9534 updatable: false,
9535 }
9536
9537 apex_key {
9538 name: "myapex.key",
9539 public_key: "testkey.avbpubkey",
9540 private_key: "testkey.pem",
9541 }
9542
9543 java_library {
9544 name: "mylib",
9545 srcs: ["mylib.java"],
9546 apex_available: ["myapex"],
9547 compile_dex: true,
9548 }
9549
9550 bootclasspath_fragment {
9551 name: "mybootclasspathfragment",
9552 contents: ["mybootclasspathlib"],
9553 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009554 hidden_api: {
9555 split_packages: ["*"],
9556 },
Colin Crossc33e5212021-05-25 18:16:02 -07009557 }
9558
9559 java_library {
9560 name: "mybootclasspathlib",
9561 srcs: ["mybootclasspathlib.java"],
9562 apex_available: ["myapex"],
9563 compile_dex: true,
9564 }
9565
9566 systemserverclasspath_fragment {
9567 name: "mysystemserverclasspathfragment",
9568 contents: ["mysystemserverclasspathlib"],
9569 apex_available: ["myapex"],
9570 }
9571
9572 java_library {
9573 name: "mysystemserverclasspathlib",
9574 srcs: ["mysystemserverclasspathlib.java"],
9575 apex_available: ["myapex"],
9576 compile_dex: true,
9577 }
9578 `
9579
9580 result := android.GroupFixturePreparers(
9581 PrepareForTestWithApexBuildComponents,
9582 prepareForTestWithMyapex,
9583 java.PrepareForTestWithJavaDefaultModules,
9584 android.PrepareForTestWithAndroidBuildComponents,
9585 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009586 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9587 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009588 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009589 ).RunTest(t)
9590
9591 // Make sure jacoco ran on both mylib and mybootclasspathlib
9592 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9593 t.Errorf("Failed to find jacoco rule for mylib")
9594 }
9595 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9596 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9597 }
9598 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9599 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9600 }
9601}
9602
Jiyong Park192600a2021-08-03 07:52:17 +00009603func TestProhibitStaticExecutable(t *testing.T) {
9604 testApexError(t, `executable mybin is static`, `
9605 apex {
9606 name: "myapex",
9607 key: "myapex.key",
9608 binaries: ["mybin"],
9609 min_sdk_version: "29",
9610 }
9611
9612 apex_key {
9613 name: "myapex.key",
9614 public_key: "testkey.avbpubkey",
9615 private_key: "testkey.pem",
9616 }
9617
9618 cc_binary {
9619 name: "mybin",
9620 srcs: ["mylib.cpp"],
9621 relative_install_path: "foo/bar",
9622 static_executable: true,
9623 system_shared_libs: [],
9624 stl: "none",
9625 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009626 min_sdk_version: "29",
9627 }
9628 `)
9629
9630 testApexError(t, `executable mybin.rust is static`, `
9631 apex {
9632 name: "myapex",
9633 key: "myapex.key",
9634 binaries: ["mybin.rust"],
9635 min_sdk_version: "29",
9636 }
9637
9638 apex_key {
9639 name: "myapex.key",
9640 public_key: "testkey.avbpubkey",
9641 private_key: "testkey.pem",
9642 }
9643
9644 rust_binary {
9645 name: "mybin.rust",
9646 srcs: ["foo.rs"],
9647 static_executable: true,
9648 apex_available: ["myapex"],
9649 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009650 }
9651 `)
9652}
9653
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009654func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9655 ctx := testApex(t, `
9656 apex {
9657 name: "myapex",
9658 key: "myapex.key",
9659 updatable: false,
9660 java_libs: ["foo"],
9661 }
9662
9663 apex_key {
9664 name: "myapex.key",
9665 public_key: "testkey.avbpubkey",
9666 private_key: "testkey.pem",
9667 }
9668
9669 java_library {
9670 name: "foo",
9671 srcs: ["foo.java"],
9672 apex_available: ["myapex"],
9673 installable: true,
9674 }
9675 `,
9676 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9677 )
9678
9679 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9680 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9681 var builder strings.Builder
9682 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9683 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009684 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 +00009685}
9686
9687func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9688 ctx := testApex(t, `
9689 prebuilt_apex {
9690 name: "myapex",
9691 arch: {
9692 arm64: {
9693 src: "myapex-arm64.apex",
9694 },
9695 arm: {
9696 src: "myapex-arm.apex",
9697 },
9698 },
9699 exported_java_libs: ["foo"],
9700 }
9701
9702 java_import {
9703 name: "foo",
9704 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009705 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009706 }
9707 `,
9708 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9709 )
9710
9711 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9712 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9713 mainModuleEntries := entriesList[0]
9714 android.AssertArrayString(t,
9715 "LOCAL_REQUIRED_MODULES",
9716 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9717 []string{
9718 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9719 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9720 })
9721}
9722
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009723func TestAndroidMk_RequiredModules(t *testing.T) {
9724 ctx := testApex(t, `
9725 apex {
9726 name: "myapex",
9727 key: "myapex.key",
9728 updatable: false,
9729 java_libs: ["foo"],
9730 required: ["otherapex"],
9731 }
9732
9733 apex {
9734 name: "otherapex",
9735 key: "myapex.key",
9736 updatable: false,
9737 java_libs: ["foo"],
9738 required: ["otherapex"],
9739 }
9740
9741 apex_key {
9742 name: "myapex.key",
9743 public_key: "testkey.avbpubkey",
9744 private_key: "testkey.pem",
9745 }
9746
9747 java_library {
9748 name: "foo",
9749 srcs: ["foo.java"],
9750 apex_available: ["myapex", "otherapex"],
9751 installable: true,
9752 }
9753 `)
9754
9755 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9756 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9757 var builder strings.Builder
9758 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9759 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009760 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009761}
9762
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009763func TestAndroidMk_RequiredDeps(t *testing.T) {
9764 ctx := testApex(t, `
9765 apex {
9766 name: "myapex",
9767 key: "myapex.key",
9768 updatable: false,
9769 }
9770
9771 apex_key {
9772 name: "myapex.key",
9773 public_key: "testkey.avbpubkey",
9774 private_key: "testkey.pem",
9775 }
9776 `)
9777
9778 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009779 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009780 data := android.AndroidMkDataForTest(t, ctx, bundle)
9781 var builder strings.Builder
9782 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9783 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009784 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009785
9786 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009787 flattenedBundle.makeModulesToInstall = append(flattenedBundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009788 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9789 var flattenedBuilder strings.Builder
9790 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9791 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009792 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009793}
9794
Jooyung Hana6d36672022-02-24 13:58:07 +09009795func TestApexOutputFileProducer(t *testing.T) {
9796 for _, tc := range []struct {
9797 name string
9798 ref string
9799 expected_data []string
9800 }{
9801 {
9802 name: "test_using_output",
9803 ref: ":myapex",
9804 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9805 },
9806 {
9807 name: "test_using_apex",
9808 ref: ":myapex{.apex}",
9809 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9810 },
9811 } {
9812 t.Run(tc.name, func(t *testing.T) {
9813 ctx := testApex(t, `
9814 apex {
9815 name: "myapex",
9816 key: "myapex.key",
9817 compressible: true,
9818 updatable: false,
9819 }
9820
9821 apex_key {
9822 name: "myapex.key",
9823 public_key: "testkey.avbpubkey",
9824 private_key: "testkey.pem",
9825 }
9826
9827 java_test {
9828 name: "`+tc.name+`",
9829 srcs: ["a.java"],
9830 data: ["`+tc.ref+`"],
9831 }
9832 `,
9833 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9834 variables.CompressedApex = proptools.BoolPtr(true)
9835 }))
9836 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9837 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9838 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9839 })
9840 }
9841}
9842
satayev758968a2021-12-06 11:42:40 +00009843func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9844 preparer := android.GroupFixturePreparers(
9845 PrepareForTestWithApexBuildComponents,
9846 prepareForTestWithMyapex,
9847 java.PrepareForTestWithJavaSdkLibraryFiles,
9848 java.PrepareForTestWithJavaDefaultModules,
9849 android.PrepareForTestWithAndroidBuildComponents,
9850 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9851 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9852 )
9853
9854 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9855 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9856 preparer.RunTestWithBp(t, `
9857 apex {
9858 name: "myapex",
9859 key: "myapex.key",
9860 bootclasspath_fragments: ["mybootclasspathfragment"],
9861 min_sdk_version: "30",
9862 updatable: false,
9863 }
9864
9865 apex_key {
9866 name: "myapex.key",
9867 public_key: "testkey.avbpubkey",
9868 private_key: "testkey.pem",
9869 }
9870
9871 bootclasspath_fragment {
9872 name: "mybootclasspathfragment",
9873 contents: ["mybootclasspathlib"],
9874 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009875 hidden_api: {
9876 split_packages: ["*"],
9877 },
satayev758968a2021-12-06 11:42:40 +00009878 }
9879
9880 java_sdk_library {
9881 name: "mybootclasspathlib",
9882 srcs: ["mybootclasspathlib.java"],
9883 apex_available: ["myapex"],
9884 compile_dex: true,
9885 unsafe_ignore_missing_latest_api: true,
9886 min_sdk_version: "31",
9887 static_libs: ["util"],
9888 }
9889
9890 java_library {
9891 name: "util",
9892 srcs: ["a.java"],
9893 apex_available: ["myapex"],
9894 min_sdk_version: "31",
9895 static_libs: ["another_util"],
9896 }
9897
9898 java_library {
9899 name: "another_util",
9900 srcs: ["a.java"],
9901 min_sdk_version: "31",
9902 apex_available: ["myapex"],
9903 }
9904 `)
9905 })
9906
9907 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9908 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9909 preparer.RunTestWithBp(t, `
9910 apex {
9911 name: "myapex",
9912 key: "myapex.key",
9913 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9914 min_sdk_version: "30",
9915 updatable: false,
9916 }
9917
9918 apex_key {
9919 name: "myapex.key",
9920 public_key: "testkey.avbpubkey",
9921 private_key: "testkey.pem",
9922 }
9923
9924 systemserverclasspath_fragment {
9925 name: "mysystemserverclasspathfragment",
9926 contents: ["mysystemserverclasspathlib"],
9927 apex_available: ["myapex"],
9928 }
9929
9930 java_sdk_library {
9931 name: "mysystemserverclasspathlib",
9932 srcs: ["mysystemserverclasspathlib.java"],
9933 apex_available: ["myapex"],
9934 compile_dex: true,
9935 min_sdk_version: "32",
9936 unsafe_ignore_missing_latest_api: true,
9937 static_libs: ["util"],
9938 }
9939
9940 java_library {
9941 name: "util",
9942 srcs: ["a.java"],
9943 apex_available: ["myapex"],
9944 min_sdk_version: "31",
9945 static_libs: ["another_util"],
9946 }
9947
9948 java_library {
9949 name: "another_util",
9950 srcs: ["a.java"],
9951 min_sdk_version: "31",
9952 apex_available: ["myapex"],
9953 }
9954 `)
9955 })
9956
9957 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9958 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9959 RunTestWithBp(t, `
9960 apex {
9961 name: "myapex",
9962 key: "myapex.key",
9963 bootclasspath_fragments: ["mybootclasspathfragment"],
9964 min_sdk_version: "30",
9965 updatable: false,
9966 }
9967
9968 apex_key {
9969 name: "myapex.key",
9970 public_key: "testkey.avbpubkey",
9971 private_key: "testkey.pem",
9972 }
9973
9974 bootclasspath_fragment {
9975 name: "mybootclasspathfragment",
9976 contents: ["mybootclasspathlib"],
9977 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009978 hidden_api: {
9979 split_packages: ["*"],
9980 },
satayev758968a2021-12-06 11:42:40 +00009981 }
9982
9983 java_sdk_library {
9984 name: "mybootclasspathlib",
9985 srcs: ["mybootclasspathlib.java"],
9986 apex_available: ["myapex"],
9987 compile_dex: true,
9988 unsafe_ignore_missing_latest_api: true,
9989 }
9990 `)
9991 })
9992
9993 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9994 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9995 RunTestWithBp(t, `
9996 apex {
9997 name: "myapex",
9998 key: "myapex.key",
9999 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10000 min_sdk_version: "30",
10001 updatable: false,
10002 }
10003
10004 apex_key {
10005 name: "myapex.key",
10006 public_key: "testkey.avbpubkey",
10007 private_key: "testkey.pem",
10008 }
10009
10010 systemserverclasspath_fragment {
10011 name: "mysystemserverclasspathfragment",
10012 contents: ["mysystemserverclasspathlib"],
10013 apex_available: ["myapex"],
10014 }
10015
10016 java_sdk_library {
10017 name: "mysystemserverclasspathlib",
10018 srcs: ["mysystemserverclasspathlib.java"],
10019 apex_available: ["myapex"],
10020 compile_dex: true,
10021 unsafe_ignore_missing_latest_api: true,
10022 }
10023 `)
10024 })
10025}
10026
Jiakai Zhang6decef92022-01-12 17:56:19 +000010027// Verifies that the APEX depends on all the Make modules in the list.
10028func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10029 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10030 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010031 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010032 }
10033}
10034
10035// Verifies that the APEX does not depend on any of the Make modules in the list.
10036func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10037 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10038 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010039 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010040 }
10041}
10042
Cole Faust1021ccd2023-02-26 21:15:25 -080010043// TODO(b/193460475): Re-enable this test
10044//func TestApexStrictUpdtabilityLint(t *testing.T) {
10045// bpTemplate := `
10046// apex {
10047// name: "myapex",
10048// key: "myapex.key",
10049// java_libs: ["myjavalib"],
10050// updatable: %v,
10051// min_sdk_version: "29",
10052// }
10053// apex_key {
10054// name: "myapex.key",
10055// }
10056// java_library {
10057// name: "myjavalib",
10058// srcs: ["MyClass.java"],
10059// apex_available: [ "myapex" ],
10060// lint: {
10061// strict_updatability_linting: %v,
10062// },
10063// sdk_version: "current",
10064// min_sdk_version: "29",
10065// }
10066// `
10067// fs := android.MockFS{
10068// "lint-baseline.xml": nil,
10069// }
10070//
10071// testCases := []struct {
10072// testCaseName string
10073// apexUpdatable bool
10074// javaStrictUpdtabilityLint bool
10075// lintFileExists bool
10076// disallowedFlagExpected bool
10077// }{
10078// {
10079// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10080// apexUpdatable: true,
10081// javaStrictUpdtabilityLint: true,
10082// lintFileExists: false,
10083// disallowedFlagExpected: false,
10084// },
10085// {
10086// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10087// apexUpdatable: false,
10088// javaStrictUpdtabilityLint: false,
10089// lintFileExists: true,
10090// disallowedFlagExpected: false,
10091// },
10092// {
10093// testCaseName: "non-updatable apex respects strict updatability of javalib",
10094// apexUpdatable: false,
10095// javaStrictUpdtabilityLint: true,
10096// lintFileExists: true,
10097// disallowedFlagExpected: true,
10098// },
10099// {
10100// testCaseName: "updatable apex sets strict updatability of javalib to true",
10101// apexUpdatable: true,
10102// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10103// lintFileExists: true,
10104// disallowedFlagExpected: true,
10105// },
10106// }
10107//
10108// for _, testCase := range testCases {
10109// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10110// fixtures := []android.FixturePreparer{}
10111// if testCase.lintFileExists {
10112// fixtures = append(fixtures, fs.AddToFixture())
10113// }
10114//
10115// result := testApex(t, bp, fixtures...)
10116// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10117// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10118// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10119//
10120// if disallowedFlagActual != testCase.disallowedFlagExpected {
10121// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10122// }
10123// }
10124//}
10125//
10126//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10127// bp := `
10128// apex {
10129// name: "myapex",
10130// key: "myapex.key",
10131// java_libs: ["myjavalib"],
10132// updatable: true,
10133// min_sdk_version: "29",
10134// }
10135// apex_key {
10136// name: "myapex.key",
10137// }
10138// java_library {
10139// name: "myjavalib",
10140// srcs: ["MyClass.java"],
10141// apex_available: [ "myapex" ],
10142// sdk_version: "current",
10143// min_sdk_version: "29",
10144// }
10145// `
10146//
10147// testCases := []struct {
10148// testCaseName string
10149// moduleDirectory string
10150// disallowedFlagExpected bool
10151// }{
10152// {
10153// testCaseName: "lintable module defined outside libcore",
10154// moduleDirectory: "",
10155// disallowedFlagExpected: true,
10156// },
10157// {
10158// testCaseName: "lintable module defined in libcore root directory",
10159// moduleDirectory: "libcore/",
10160// disallowedFlagExpected: false,
10161// },
10162// {
10163// testCaseName: "lintable module defined in libcore child directory",
10164// moduleDirectory: "libcore/childdir/",
10165// disallowedFlagExpected: true,
10166// },
10167// }
10168//
10169// for _, testCase := range testCases {
10170// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10171// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10172// result := testApex(t, "", lintFileCreator, bpFileCreator)
10173// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10174// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10175// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10176// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10177//
10178// if disallowedFlagActual != testCase.disallowedFlagExpected {
10179// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10180// }
10181// }
10182//}
10183//
10184//// checks transtive deps of an apex coming from bootclasspath_fragment
10185//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10186// bp := `
10187// apex {
10188// name: "myapex",
10189// key: "myapex.key",
10190// bootclasspath_fragments: ["mybootclasspathfragment"],
10191// updatable: true,
10192// min_sdk_version: "29",
10193// }
10194// apex_key {
10195// name: "myapex.key",
10196// }
10197// bootclasspath_fragment {
10198// name: "mybootclasspathfragment",
10199// contents: ["myjavalib"],
10200// apex_available: ["myapex"],
10201// hidden_api: {
10202// split_packages: ["*"],
10203// },
10204// }
10205// java_library {
10206// name: "myjavalib",
10207// srcs: ["MyClass.java"],
10208// apex_available: [ "myapex" ],
10209// sdk_version: "current",
10210// min_sdk_version: "29",
10211// compile_dex: true,
10212// }
10213// `
10214// fs := android.MockFS{
10215// "lint-baseline.xml": nil,
10216// }
10217//
10218// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10219// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10220// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10221// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10222// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10223// }
10224//}
Spandan Das66773252022-01-15 00:23:18 +000010225
Spandan Das42e89502022-05-06 22:12:55 +000010226// updatable apexes should propagate updatable=true to its apps
10227func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10228 bp := `
10229 apex {
10230 name: "myapex",
10231 key: "myapex.key",
10232 updatable: %v,
10233 apps: [
10234 "myapp",
10235 ],
10236 min_sdk_version: "30",
10237 }
10238 apex_key {
10239 name: "myapex.key",
10240 }
10241 android_app {
10242 name: "myapp",
10243 updatable: %v,
10244 apex_available: [
10245 "myapex",
10246 ],
10247 sdk_version: "current",
10248 min_sdk_version: "30",
10249 }
10250 `
10251 testCases := []struct {
10252 name string
10253 apex_is_updatable_bp bool
10254 app_is_updatable_bp bool
10255 app_is_updatable_expected bool
10256 }{
10257 {
10258 name: "Non-updatable apex respects updatable property of non-updatable app",
10259 apex_is_updatable_bp: false,
10260 app_is_updatable_bp: false,
10261 app_is_updatable_expected: false,
10262 },
10263 {
10264 name: "Non-updatable apex respects updatable property of updatable app",
10265 apex_is_updatable_bp: false,
10266 app_is_updatable_bp: true,
10267 app_is_updatable_expected: true,
10268 },
10269 {
10270 name: "Updatable apex respects updatable property of updatable app",
10271 apex_is_updatable_bp: true,
10272 app_is_updatable_bp: true,
10273 app_is_updatable_expected: true,
10274 },
10275 {
10276 name: "Updatable apex sets updatable=true on non-updatable app",
10277 apex_is_updatable_bp: true,
10278 app_is_updatable_bp: false,
10279 app_is_updatable_expected: true,
10280 },
10281 }
10282 for _, testCase := range testCases {
10283 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10284 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10285 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10286 }
10287}
10288
Kiyoung Kim487689e2022-07-26 09:48:22 +090010289func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10290 bp := `
10291 apex {
10292 name: "myapex",
10293 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010294 native_shared_libs: ["libbaz"],
10295 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010296 min_sdk_version: "29",
10297 }
10298 apex_key {
10299 name: "myapex.key",
10300 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010301 cc_binary {
10302 name: "binfoo",
10303 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010304 apex_available: ["myapex"],
10305 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010306 recovery_available: false,
10307 }
10308 cc_library {
10309 name: "libbar",
10310 srcs: ["libbar.cc"],
10311 stubs: {
10312 symbol_file: "libbar.map.txt",
10313 versions: [
10314 "29",
10315 ],
10316 },
10317 }
10318 cc_library {
10319 name: "libbaz",
10320 srcs: ["libbaz.cc"],
10321 apex_available: ["myapex"],
10322 min_sdk_version: "29",
10323 stubs: {
10324 symbol_file: "libbaz.map.txt",
10325 versions: [
10326 "29",
10327 ],
10328 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010329 }
10330 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010331 name: "libbar",
10332 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010333 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010334 variants: ["apex.29"],
10335 }
10336 cc_api_variant {
10337 name: "libbar",
10338 variant: "apex",
10339 version: "29",
10340 src: "libbar_apex_29.so",
10341 }
10342 cc_api_library {
10343 name: "libbaz",
10344 src: "libbaz_stub.so",
10345 min_sdk_version: "29",
10346 variants: ["apex.29"],
10347 }
10348 cc_api_variant {
10349 name: "libbaz",
10350 variant: "apex",
10351 version: "29",
10352 src: "libbaz_apex_29.so",
10353 }
10354 cc_api_library {
10355 name: "libqux",
10356 src: "libqux_stub.so",
10357 min_sdk_version: "29",
10358 variants: ["apex.29"],
10359 }
10360 cc_api_variant {
10361 name: "libqux",
10362 variant: "apex",
10363 version: "29",
10364 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010365 }
10366 api_imports {
10367 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010368 apex_shared_libs: [
10369 "libbar",
10370 "libbaz",
10371 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010372 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010373 }
10374 `
10375 result := testApex(t, bp)
10376
10377 hasDep := func(m android.Module, wantDep android.Module) bool {
10378 t.Helper()
10379 var found bool
10380 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10381 if dep == wantDep {
10382 found = true
10383 }
10384 })
10385 return found
10386 }
10387
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010388 // Library defines stubs and cc_api_library should be used with cc_api_library
10389 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10390 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10391 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010392
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010393 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10394 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010395
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010396 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10397 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10398 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10399 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10400
10401 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10402 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10403 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10404 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10405 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10406
10407 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10408 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10409 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10410
10411 // cc_api_library defined without original library should be linked with cc_api_library
10412 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10413 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10414 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10415}
10416
10417func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10418 bp := `
10419 apex {
10420 name: "myapex",
10421 key: "myapex.key",
10422 native_shared_libs: ["libbar"],
10423 min_sdk_version: "29",
10424 }
10425 apex_key {
10426 name: "myapex.key",
10427 }
10428 cc_binary {
10429 name: "binfoo",
10430 shared_libs: ["libbar"],
10431 recovery_available: false,
10432 }
10433 cc_library {
10434 name: "libbar",
10435 srcs: ["libbar.cc"],
10436 apex_available: ["myapex"],
10437 min_sdk_version: "29",
10438 stubs: {
10439 symbol_file: "libbar.map.txt",
10440 versions: [
10441 "29",
10442 ],
10443 },
10444 }
10445 cc_api_library {
10446 name: "libbar",
10447 src: "libbar_stub.so",
10448 variants: ["apex.29"],
10449 }
10450 cc_api_variant {
10451 name: "libbar",
10452 variant: "apex",
10453 version: "29",
10454 src: "libbar_apex_29.so",
10455 }
10456 api_imports {
10457 name: "api_imports",
10458 apex_shared_libs: [
10459 "libbar",
10460 ],
10461 }
10462 `
10463
10464 result := testApex(t, bp)
10465
10466 hasDep := func(m android.Module, wantDep android.Module) bool {
10467 t.Helper()
10468 var found bool
10469 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10470 if dep == wantDep {
10471 found = true
10472 }
10473 })
10474 return found
10475 }
10476
10477 // Library defines stubs and cc_api_library should be used with cc_api_library
10478 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10479 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10480 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10481
10482 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10483 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10484
10485 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10486 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10487 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10488 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010489}
Dennis Shend4f5d932023-01-31 20:27:21 +000010490
10491func TestTrimmedApex(t *testing.T) {
10492 bp := `
10493 apex {
10494 name: "myapex",
10495 key: "myapex.key",
10496 native_shared_libs: ["libfoo","libbaz"],
10497 min_sdk_version: "29",
10498 trim_against: "mydcla",
10499 }
10500 apex {
10501 name: "mydcla",
10502 key: "myapex.key",
10503 native_shared_libs: ["libfoo","libbar"],
10504 min_sdk_version: "29",
10505 file_contexts: ":myapex-file_contexts",
10506 dynamic_common_lib_apex: true,
10507 }
10508 apex_key {
10509 name: "myapex.key",
10510 }
10511 cc_library {
10512 name: "libfoo",
10513 shared_libs: ["libc"],
10514 apex_available: ["myapex","mydcla"],
10515 min_sdk_version: "29",
10516 }
10517 cc_library {
10518 name: "libbar",
10519 shared_libs: ["libc"],
10520 apex_available: ["myapex","mydcla"],
10521 min_sdk_version: "29",
10522 }
10523 cc_library {
10524 name: "libbaz",
10525 shared_libs: ["libc"],
10526 apex_available: ["myapex","mydcla"],
10527 min_sdk_version: "29",
10528 }
10529 cc_api_library {
10530 name: "libc",
10531 src: "libc.so",
10532 min_sdk_version: "29",
10533 recovery_available: true,
10534 }
10535 api_imports {
10536 name: "api_imports",
10537 shared_libs: [
10538 "libc",
10539 ],
10540 header_libs: [],
10541 }
10542 `
10543 ctx := testApex(t, bp)
10544 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10545 apexRule := module.MaybeRule("apexRule")
10546 if apexRule.Rule == nil {
10547 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10548 }
10549
10550 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
10551 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
10552 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10553 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10554 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10555 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10556}
Jingwen Chendea7a642023-03-28 11:30:50 +000010557
10558func TestCannedFsConfig(t *testing.T) {
10559 ctx := testApex(t, `
10560 apex {
10561 name: "myapex",
10562 key: "myapex.key",
10563 updatable: false,
10564 }
10565
10566 apex_key {
10567 name: "myapex.key",
10568 public_key: "testkey.avbpubkey",
10569 private_key: "testkey.pem",
10570 }`)
10571 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10572 generateFsRule := mod.Rule("generateFsConfig")
10573 cmd := generateFsRule.RuleParams.Command
10574
10575 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10576}
10577
10578func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10579 ctx := testApex(t, `
10580 apex {
10581 name: "myapex",
10582 key: "myapex.key",
10583 canned_fs_config: "my_config",
10584 updatable: false,
10585 }
10586
10587 apex_key {
10588 name: "myapex.key",
10589 public_key: "testkey.avbpubkey",
10590 private_key: "testkey.pem",
10591 }`)
10592 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10593 generateFsRule := mod.Rule("generateFsConfig")
10594 cmd := generateFsRule.RuleParams.Command
10595
10596 // Ensure that canned_fs_config has "cat my_config" at the end
10597 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10598}
Spandan Das20fce2d2023-04-12 17:21:39 +000010599
10600func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10601 testCases := []struct {
10602 desc string
10603 hasStubs bool
10604 apexAvailable string
10605 expectedError string
10606 }{
10607 {
10608 desc: "non-stub library can have multiple apex_available",
10609 hasStubs: false,
10610 apexAvailable: `["myapex", "otherapex"]`,
10611 },
10612 {
10613 desc: "stub library should not be available to anyapex",
10614 hasStubs: true,
10615 apexAvailable: `["//apex_available:anyapex"]`,
10616 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10617 },
10618 {
10619 desc: "stub library should not be available to multiple apexes",
10620 hasStubs: true,
10621 apexAvailable: `["myapex", "otherapex"]`,
10622 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10623 },
10624 {
10625 desc: "stub library can be available to a core apex and a test apex",
10626 hasStubs: true,
10627 apexAvailable: `["myapex", "test_myapex"]`,
10628 },
10629 }
10630 bpTemplate := `
10631 cc_library {
10632 name: "libfoo",
10633 %v
10634 apex_available: %v,
10635 }
10636 apex {
10637 name: "myapex",
10638 key: "apex.key",
10639 updatable: false,
10640 native_shared_libs: ["libfoo"],
10641 }
10642 apex {
10643 name: "otherapex",
10644 key: "apex.key",
10645 updatable: false,
10646 }
10647 apex_test {
10648 name: "test_myapex",
10649 key: "apex.key",
10650 updatable: false,
10651 native_shared_libs: ["libfoo"],
10652 }
10653 apex_key {
10654 name: "apex.key",
10655 }
10656 `
10657 for _, tc := range testCases {
10658 stubs := ""
10659 if tc.hasStubs {
10660 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10661 }
10662 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10663 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10664 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10665 })
10666 if tc.expectedError == "" {
10667 testApex(t, bp, mockFsFixturePreparer)
10668 } else {
10669 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10670 }
10671 }
10672}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010673
10674func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10675 context := android.GroupFixturePreparers(
10676 android.PrepareForIntegrationTestWithAndroid,
10677 cc.PrepareForIntegrationTestWithCc,
10678 PrepareForTestWithApexBuildComponents,
10679 prepareForTestWithMyapex,
10680 filesystem.PrepareForTestWithFilesystemBuildComponents,
10681 )
10682 result := context.RunTestWithBp(t, `
10683 android_system_image {
10684 name: "myfilesystem",
10685 deps: [
10686 "libfoo",
10687 ],
10688 linker_config_src: "linker.config.json",
10689 }
10690
10691 cc_library {
10692 name: "libfoo",
10693 shared_libs: [
10694 "libbar",
10695 ],
10696 stl: "none",
10697 }
10698
10699 cc_library {
10700 name: "libbar",
10701 stl: "none",
10702 apex_available: ["myapex"],
10703 }
10704
10705 apex {
10706 name: "myapex",
10707 native_shared_libs: ["libbar"],
10708 key: "myapex.key",
10709 updatable: false,
10710 }
10711
10712 apex_key {
10713 name: "myapex.key",
10714 public_key: "testkey.avbpubkey",
10715 private_key: "testkey.pem",
10716 }
10717 `)
10718
10719 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10720 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10721 inputs.Strings(),
10722 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10723}