blob: e6581cf318cb42596936e88344103c1250d3977b [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"],
Vinh Tran4eeb2a92023-08-14 13:29:30 -0400393 rustlibs: ["libfoo.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900394 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
Jooyung Hana0503a52023-08-23 13:12:50 +0900521 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").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
Jooyung Hana0503a52023-08-23 13:12:50 +0900524 ab := ctx.ModuleForTests("myapex", "android_common_myapex").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.
Jooyung Hana0503a52023-08-23 13:12:50 +0900536 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/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
Jooyung Hana0503a52023-08-23 13:12:50 +0900598 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex").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
Jooyung Hana0503a52023-08-23 13:12:50 +0900604 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex").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 Hana0503a52023-08-23 13:12:50 +0900681 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []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
Jooyung Hana0503a52023-08-23 13:12:50 +0900708 module := ctx.ModuleForTests("myapex", "android_common_myapex")
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 {
Jooyung Hana0503a52023-08-23 13:12:50 +0900779 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400780 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) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900789 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900790 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900791 if vendor {
792 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900793 }
794 ctx := testApex(t, `
795 apex {
796 name: "myapex",
797 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900798 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900799 `+prop+`
800 }
801
802 apex_key {
803 name: "myapex.key",
804 public_key: "testkey.avbpubkey",
805 private_key: "testkey.pem",
806 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900807 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900808
Jooyung Hana0503a52023-08-23 13:12:50 +0900809 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900810 if vendor {
811 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
812 rule.RuleParams.Command,
813 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900814 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900815 android.AssertStringDoesContain(t, "should force-label as system_file",
816 rule.RuleParams.Command,
817 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900818 }
819 }
820}
821
Jiyong Park25fc6a92018-11-18 18:02:45 +0900822func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800823 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900824 apex {
825 name: "myapex",
826 key: "myapex.key",
827 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900828 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000829 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900830 }
831
832 apex_key {
833 name: "myapex.key",
834 public_key: "testkey.avbpubkey",
835 private_key: "testkey.pem",
836 }
837
838 cc_library {
839 name: "mylib",
840 srcs: ["mylib.cpp"],
841 shared_libs: ["mylib2", "mylib3"],
842 system_shared_libs: [],
843 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000844 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900845 }
846
847 cc_library {
848 name: "mylib2",
849 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900850 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900851 system_shared_libs: [],
852 stl: "none",
853 stubs: {
854 versions: ["1", "2", "3"],
855 },
856 }
857
858 cc_library {
859 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900860 srcs: ["mylib.cpp"],
861 shared_libs: ["mylib4"],
862 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900863 stl: "none",
864 stubs: {
865 versions: ["10", "11", "12"],
866 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000867 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900868 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900869
870 cc_library {
871 name: "mylib4",
872 srcs: ["mylib.cpp"],
873 system_shared_libs: [],
874 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000875 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900876 }
Jiyong Park105dc322021-06-11 17:22:09 +0900877
878 rust_binary {
879 name: "foo.rust",
880 srcs: ["foo.rs"],
881 shared_libs: ["libfoo.shared_from_rust"],
882 prefer_rlib: true,
883 apex_available: ["myapex"],
884 }
885
886 cc_library_shared {
887 name: "libfoo.shared_from_rust",
888 srcs: ["mylib.cpp"],
889 system_shared_libs: [],
890 stl: "none",
891 stubs: {
892 versions: ["10", "11", "12"],
893 },
894 }
895
Jiyong Park25fc6a92018-11-18 18:02:45 +0900896 `)
897
Jooyung Hana0503a52023-08-23 13:12:50 +0900898 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900899 copyCmds := apexRule.Args["copy_commands"]
900
901 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800902 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900903
904 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800905 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900906
907 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800908 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900909
Colin Crossaede88c2020-08-11 12:17:01 -0700910 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900911
912 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900913 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900914 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900915 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900916
917 // 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 -0700918 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700920 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900921
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700922 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
923 // is replaced by sharing of "cFlags" in cc/builder.go.
924 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
925 // module variable representing "cflags". So it was not detected by ensureNotContains.
926 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
927 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
928 // including the original cflags's "-include mylib.h".
929 //
Jiyong Park64379952018-12-13 18:37:29 +0900930 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700931 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
932 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900933
Jiyong Park85cc35a2022-07-17 11:30:47 +0900934 // Ensure that genstub for platform-provided lib is invoked with --systemapi
935 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
936 // Ensure that genstub for apex-provided lib is invoked with --apex
937 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900938
Jooyung Hana0503a52023-08-23 13:12:50 +0900939 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900940 "lib64/mylib.so",
941 "lib64/mylib3.so",
942 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900943 "bin/foo.rust",
944 "lib64/libc++.so", // by the implicit dependency from foo.rust
945 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900946 })
Jiyong Park105dc322021-06-11 17:22:09 +0900947
948 // Ensure that stub dependency from a rust module is not included
949 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
950 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -0700951 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +0900952 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
953 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900954
Jooyung Hana0503a52023-08-23 13:12:50 +0900955 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +0900956 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900957}
958
Jiyong Park1bc84122021-06-22 20:23:05 +0900959func TestApexCanUsePrivateApis(t *testing.T) {
960 ctx := testApex(t, `
961 apex {
962 name: "myapex",
963 key: "myapex.key",
964 native_shared_libs: ["mylib"],
965 binaries: ["foo.rust"],
966 updatable: false,
967 platform_apis: true,
968 }
969
970 apex_key {
971 name: "myapex.key",
972 public_key: "testkey.avbpubkey",
973 private_key: "testkey.pem",
974 }
975
976 cc_library {
977 name: "mylib",
978 srcs: ["mylib.cpp"],
979 shared_libs: ["mylib2"],
980 system_shared_libs: [],
981 stl: "none",
982 apex_available: [ "myapex" ],
983 }
984
985 cc_library {
986 name: "mylib2",
987 srcs: ["mylib.cpp"],
988 cflags: ["-include mylib.h"],
989 system_shared_libs: [],
990 stl: "none",
991 stubs: {
992 versions: ["1", "2", "3"],
993 },
994 }
995
996 rust_binary {
997 name: "foo.rust",
998 srcs: ["foo.rs"],
999 shared_libs: ["libfoo.shared_from_rust"],
1000 prefer_rlib: true,
1001 apex_available: ["myapex"],
1002 }
1003
1004 cc_library_shared {
1005 name: "libfoo.shared_from_rust",
1006 srcs: ["mylib.cpp"],
1007 system_shared_libs: [],
1008 stl: "none",
1009 stubs: {
1010 versions: ["10", "11", "12"],
1011 },
1012 }
1013 `)
1014
Jooyung Hana0503a52023-08-23 13:12:50 +09001015 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001016 copyCmds := apexRule.Args["copy_commands"]
1017
1018 // Ensure that indirect stubs dep is not included
1019 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1020 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1021
1022 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1023 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001024 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001025 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1026 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001027 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001028 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1029 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1030}
1031
Colin Cross7812fd32020-09-25 12:35:10 -07001032func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1033 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001034 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001035 apex {
1036 name: "myapex",
1037 key: "myapex.key",
1038 native_shared_libs: ["mylib", "mylib3"],
1039 min_sdk_version: "29",
1040 }
1041
1042 apex_key {
1043 name: "myapex.key",
1044 public_key: "testkey.avbpubkey",
1045 private_key: "testkey.pem",
1046 }
1047
1048 cc_library {
1049 name: "mylib",
1050 srcs: ["mylib.cpp"],
1051 shared_libs: ["mylib2", "mylib3"],
1052 system_shared_libs: [],
1053 stl: "none",
1054 apex_available: [ "myapex" ],
1055 min_sdk_version: "28",
1056 }
1057
1058 cc_library {
1059 name: "mylib2",
1060 srcs: ["mylib.cpp"],
1061 cflags: ["-include mylib.h"],
1062 system_shared_libs: [],
1063 stl: "none",
1064 stubs: {
1065 versions: ["28", "29", "30", "current"],
1066 },
1067 min_sdk_version: "28",
1068 }
1069
1070 cc_library {
1071 name: "mylib3",
1072 srcs: ["mylib.cpp"],
1073 shared_libs: ["mylib4"],
1074 system_shared_libs: [],
1075 stl: "none",
1076 stubs: {
1077 versions: ["28", "29", "30", "current"],
1078 },
1079 apex_available: [ "myapex" ],
1080 min_sdk_version: "28",
1081 }
1082
1083 cc_library {
1084 name: "mylib4",
1085 srcs: ["mylib.cpp"],
1086 system_shared_libs: [],
1087 stl: "none",
1088 apex_available: [ "myapex" ],
1089 min_sdk_version: "28",
1090 }
1091 `)
1092
Jooyung Hana0503a52023-08-23 13:12:50 +09001093 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001094 copyCmds := apexRule.Args["copy_commands"]
1095
1096 // Ensure that direct non-stubs dep is always included
1097 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1098
1099 // Ensure that indirect stubs dep is not included
1100 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1101
1102 // Ensure that direct stubs dep is included
1103 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1104
1105 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1106
Jiyong Park55549df2021-02-26 23:57:23 +09001107 // Ensure that mylib is linking with the latest version of stub for mylib2
1108 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001109 // ... and not linking to the non-stub (impl) variant of mylib2
1110 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1111
1112 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1113 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1114 // .. and not linking to the stubs variant of mylib3
1115 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1116
1117 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001118 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001119 ensureNotContains(t, mylib2Cflags, "-include ")
1120
Jiyong Park85cc35a2022-07-17 11:30:47 +09001121 // Ensure that genstub is invoked with --systemapi
1122 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001123
Jooyung Hana0503a52023-08-23 13:12:50 +09001124 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001125 "lib64/mylib.so",
1126 "lib64/mylib3.so",
1127 "lib64/mylib4.so",
1128 })
1129}
1130
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001131func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1132 t.Parallel()
1133 // myapex (Z)
1134 // mylib -----------------.
1135 // |
1136 // otherapex (29) |
1137 // libstub's versions: 29 Z current
1138 // |
1139 // <platform> |
1140 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001141 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001142 apex {
1143 name: "myapex",
1144 key: "myapex.key",
1145 native_shared_libs: ["mylib"],
1146 min_sdk_version: "Z", // non-final
1147 }
1148
1149 cc_library {
1150 name: "mylib",
1151 srcs: ["mylib.cpp"],
1152 shared_libs: ["libstub"],
1153 apex_available: ["myapex"],
1154 min_sdk_version: "Z",
1155 }
1156
1157 apex_key {
1158 name: "myapex.key",
1159 public_key: "testkey.avbpubkey",
1160 private_key: "testkey.pem",
1161 }
1162
1163 apex {
1164 name: "otherapex",
1165 key: "myapex.key",
1166 native_shared_libs: ["libstub"],
1167 min_sdk_version: "29",
1168 }
1169
1170 cc_library {
1171 name: "libstub",
1172 srcs: ["mylib.cpp"],
1173 stubs: {
1174 versions: ["29", "Z", "current"],
1175 },
1176 apex_available: ["otherapex"],
1177 min_sdk_version: "29",
1178 }
1179
1180 // platform module depending on libstub from otherapex should use the latest stub("current")
1181 cc_library {
1182 name: "libplatform",
1183 srcs: ["mylib.cpp"],
1184 shared_libs: ["libstub"],
1185 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001186 `,
1187 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1188 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1189 variables.Platform_sdk_final = proptools.BoolPtr(false)
1190 variables.Platform_version_active_codenames = []string{"Z"}
1191 }),
1192 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001193
Jiyong Park55549df2021-02-26 23:57:23 +09001194 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001195 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001196 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001197 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001198 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001199
1200 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1201 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1202 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1203 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1204 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1205}
1206
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001207func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001208 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001209 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001210 name: "myapex2",
1211 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001212 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001213 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001214 }
1215
1216 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001217 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001218 public_key: "testkey.avbpubkey",
1219 private_key: "testkey.pem",
1220 }
1221
1222 cc_library {
1223 name: "mylib",
1224 srcs: ["mylib.cpp"],
1225 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001226 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001227 system_shared_libs: [],
1228 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001229 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001230 }
1231
1232 cc_library {
1233 name: "libfoo",
1234 srcs: ["mylib.cpp"],
1235 shared_libs: ["libbar"],
1236 system_shared_libs: [],
1237 stl: "none",
1238 stubs: {
1239 versions: ["10", "20", "30"],
1240 },
1241 }
1242
1243 cc_library {
1244 name: "libbar",
1245 srcs: ["mylib.cpp"],
1246 system_shared_libs: [],
1247 stl: "none",
1248 }
1249
Jiyong Park678c8812020-02-07 17:25:49 +09001250 cc_library_static {
1251 name: "libbaz",
1252 srcs: ["mylib.cpp"],
1253 system_shared_libs: [],
1254 stl: "none",
1255 apex_available: [ "myapex2" ],
1256 }
1257
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001258 `)
1259
Jooyung Hana0503a52023-08-23 13:12:50 +09001260 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001261 copyCmds := apexRule.Args["copy_commands"]
1262
1263 // Ensure that direct non-stubs dep is always included
1264 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1265
1266 // Ensure that indirect stubs dep is not included
1267 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1268
1269 // Ensure that dependency of stubs is not included
1270 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1271
Colin Crossaede88c2020-08-11 12:17:01 -07001272 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001273
1274 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001275 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001276 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001277 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001278
Jiyong Park3ff16992019-12-27 14:11:47 +09001279 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001280
1281 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1282 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001283
Jooyung Hana0503a52023-08-23 13:12:50 +09001284 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001285 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001286
Jooyung Hana0503a52023-08-23 13:12:50 +09001287 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001288 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001289}
1290
Jooyung Hand3639552019-08-09 12:57:43 +09001291func TestApexWithRuntimeLibsDependency(t *testing.T) {
1292 /*
1293 myapex
1294 |
1295 v (runtime_libs)
1296 mylib ------+------> libfoo [provides stub]
1297 |
1298 `------> libbar
1299 */
Colin Cross1c460562021-02-16 17:55:47 -08001300 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001301 apex {
1302 name: "myapex",
1303 key: "myapex.key",
1304 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001305 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001306 }
1307
1308 apex_key {
1309 name: "myapex.key",
1310 public_key: "testkey.avbpubkey",
1311 private_key: "testkey.pem",
1312 }
1313
1314 cc_library {
1315 name: "mylib",
1316 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001317 static_libs: ["libstatic"],
1318 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001319 runtime_libs: ["libfoo", "libbar"],
1320 system_shared_libs: [],
1321 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001322 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001323 }
1324
1325 cc_library {
1326 name: "libfoo",
1327 srcs: ["mylib.cpp"],
1328 system_shared_libs: [],
1329 stl: "none",
1330 stubs: {
1331 versions: ["10", "20", "30"],
1332 },
1333 }
1334
1335 cc_library {
1336 name: "libbar",
1337 srcs: ["mylib.cpp"],
1338 system_shared_libs: [],
1339 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001340 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001341 }
1342
Liz Kammer5f108fa2023-05-11 14:33:17 -04001343 cc_library {
1344 name: "libstatic",
1345 srcs: ["mylib.cpp"],
1346 system_shared_libs: [],
1347 stl: "none",
1348 apex_available: [ "myapex" ],
1349 runtime_libs: ["libstatic_to_runtime"],
1350 }
1351
1352 cc_library {
1353 name: "libshared",
1354 srcs: ["mylib.cpp"],
1355 system_shared_libs: [],
1356 stl: "none",
1357 apex_available: [ "myapex" ],
1358 runtime_libs: ["libshared_to_runtime"],
1359 }
1360
1361 cc_library {
1362 name: "libstatic_to_runtime",
1363 srcs: ["mylib.cpp"],
1364 system_shared_libs: [],
1365 stl: "none",
1366 apex_available: [ "myapex" ],
1367 }
1368
1369 cc_library {
1370 name: "libshared_to_runtime",
1371 srcs: ["mylib.cpp"],
1372 system_shared_libs: [],
1373 stl: "none",
1374 apex_available: [ "myapex" ],
1375 }
Jooyung Hand3639552019-08-09 12:57:43 +09001376 `)
1377
Jooyung Hana0503a52023-08-23 13:12:50 +09001378 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001379 copyCmds := apexRule.Args["copy_commands"]
1380
1381 // Ensure that direct non-stubs dep is always included
1382 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1383
1384 // Ensure that indirect stubs dep is not included
1385 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1386
1387 // Ensure that runtime_libs dep in included
1388 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001389 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1390 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1391
1392 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001393
Jooyung Hana0503a52023-08-23 13:12:50 +09001394 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001395 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1396 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001397}
1398
Paul Duffina02cae32021-03-09 01:44:06 +00001399var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1400 cc.PrepareForTestWithCcBuildComponents,
1401 PrepareForTestWithApexBuildComponents,
1402 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001403 apex {
1404 name: "com.android.runtime",
1405 key: "com.android.runtime.key",
1406 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001407 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001408 }
1409
1410 apex_key {
1411 name: "com.android.runtime.key",
1412 public_key: "testkey.avbpubkey",
1413 private_key: "testkey.pem",
1414 }
Paul Duffina02cae32021-03-09 01:44:06 +00001415 `),
1416 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1417)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001418
Paul Duffina02cae32021-03-09 01:44:06 +00001419func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001420 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001421 cc_library {
1422 name: "libc",
1423 no_libcrt: true,
1424 nocrt: true,
1425 stl: "none",
1426 system_shared_libs: [],
1427 stubs: { versions: ["1"] },
1428 apex_available: ["com.android.runtime"],
1429
1430 sanitize: {
1431 hwaddress: true,
1432 }
1433 }
1434
1435 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001436 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001437 no_libcrt: true,
1438 nocrt: true,
1439 stl: "none",
1440 system_shared_libs: [],
1441 srcs: [""],
1442 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001443 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001444
1445 sanitize: {
1446 never: true,
1447 },
Spandan Das4de7b492023-05-05 21:13:01 +00001448 apex_available: [
1449 "//apex_available:anyapex",
1450 "//apex_available:platform",
1451 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001452 } `)
1453 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001454
Jooyung Hana0503a52023-08-23 13:12:50 +09001455 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001456 "lib64/bionic/libc.so",
1457 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1458 })
1459
Colin Cross4c4c1be2022-02-10 11:41:18 -08001460 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001461
1462 installed := hwasan.Description("install libclang_rt.hwasan")
1463 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1464
1465 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1466 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1467 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1468}
1469
1470func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001471 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001472 prepareForTestOfRuntimeApexWithHwasan,
1473 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1474 variables.SanitizeDevice = []string{"hwaddress"}
1475 }),
1476 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001477 cc_library {
1478 name: "libc",
1479 no_libcrt: true,
1480 nocrt: true,
1481 stl: "none",
1482 system_shared_libs: [],
1483 stubs: { versions: ["1"] },
1484 apex_available: ["com.android.runtime"],
1485 }
1486
1487 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001488 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001489 no_libcrt: true,
1490 nocrt: true,
1491 stl: "none",
1492 system_shared_libs: [],
1493 srcs: [""],
1494 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001495 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001496
1497 sanitize: {
1498 never: true,
1499 },
Spandan Das4de7b492023-05-05 21:13:01 +00001500 apex_available: [
1501 "//apex_available:anyapex",
1502 "//apex_available:platform",
1503 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001504 }
Paul Duffina02cae32021-03-09 01:44:06 +00001505 `)
1506 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001507
Jooyung Hana0503a52023-08-23 13:12:50 +09001508 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001509 "lib64/bionic/libc.so",
1510 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1511 })
1512
Colin Cross4c4c1be2022-02-10 11:41:18 -08001513 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001514
1515 installed := hwasan.Description("install libclang_rt.hwasan")
1516 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1517
1518 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1519 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1520 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1521}
1522
Jooyung Han61b66e92020-03-21 14:21:46 +00001523func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1524 testcases := []struct {
1525 name string
1526 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001527 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001528 shouldLink string
1529 shouldNotLink []string
1530 }{
1531 {
Jiyong Park55549df2021-02-26 23:57:23 +09001532 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001533 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001534 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001535 shouldLink: "current",
1536 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001537 },
1538 {
Jiyong Park55549df2021-02-26 23:57:23 +09001539 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001540 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001541 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001542 shouldLink: "current",
1543 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001544 },
1545 }
1546 for _, tc := range testcases {
1547 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001548 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001549 apex {
1550 name: "myapex",
1551 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001552 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001553 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001554 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001555 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001556
Jooyung Han61b66e92020-03-21 14:21:46 +00001557 apex_key {
1558 name: "myapex.key",
1559 public_key: "testkey.avbpubkey",
1560 private_key: "testkey.pem",
1561 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001562
Jooyung Han61b66e92020-03-21 14:21:46 +00001563 cc_library {
1564 name: "mylib",
1565 srcs: ["mylib.cpp"],
1566 vendor_available: true,
1567 shared_libs: ["libbar"],
1568 system_shared_libs: [],
1569 stl: "none",
1570 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001571 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001572 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001573
Jooyung Han61b66e92020-03-21 14:21:46 +00001574 cc_library {
1575 name: "libbar",
1576 srcs: ["mylib.cpp"],
1577 system_shared_libs: [],
1578 stl: "none",
1579 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001580 llndk: {
1581 symbol_file: "libbar.map.txt",
1582 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001583 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001584 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001585 withUnbundledBuild,
1586 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001587
Jooyung Han61b66e92020-03-21 14:21:46 +00001588 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001589 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001590 "lib64/mylib.so",
1591 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001592
Jooyung Han61b66e92020-03-21 14:21:46 +00001593 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001594 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001595 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1596 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001597
Steven Moreland2c4000c2021-04-27 02:08:49 +00001598 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1599 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001600 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001601 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001602 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001603
Steven Moreland2c4000c2021-04-27 02:08:49 +00001604 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001605 ver := tc.shouldLink
1606 if tc.shouldLink == "current" {
1607 ver = strconv.Itoa(android.FutureApiLevelInt)
1608 }
1609 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001610 })
1611 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001612}
1613
Jiyong Park25fc6a92018-11-18 18:02:45 +09001614func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001615 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001616 apex {
1617 name: "myapex",
1618 key: "myapex.key",
1619 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001620 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001621 }
1622
1623 apex_key {
1624 name: "myapex.key",
1625 public_key: "testkey.avbpubkey",
1626 private_key: "testkey.pem",
1627 }
1628
1629 cc_library {
1630 name: "mylib",
1631 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001632 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001633 shared_libs: ["libdl#27"],
1634 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001635 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001636 }
1637
1638 cc_library_shared {
1639 name: "mylib_shared",
1640 srcs: ["mylib.cpp"],
1641 shared_libs: ["libdl#27"],
1642 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001643 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001644 }
1645
1646 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001647 name: "libBootstrap",
1648 srcs: ["mylib.cpp"],
1649 stl: "none",
1650 bootstrap: true,
1651 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001652 `)
1653
Jooyung Hana0503a52023-08-23 13:12:50 +09001654 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001655 copyCmds := apexRule.Args["copy_commands"]
1656
1657 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001658 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001659 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1660 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001661
1662 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001663 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001664
Colin Crossaede88c2020-08-11 12:17:01 -07001665 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1666 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1667 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001668
1669 // For dependency to libc
1670 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001671 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001672 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001673 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001674 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001675 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1676 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001677
1678 // For dependency to libm
1679 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001680 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001681 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001682 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001683 // ... and is not compiling with the stub
1684 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1685 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1686
1687 // For dependency to libdl
1688 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001689 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001690 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001691 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1692 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001693 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001694 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001695 // ... Cflags from stub is correctly exported to mylib
1696 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1697 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001698
1699 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001700 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1701 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1702 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1703 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001704}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001705
Jooyung Han749dc692020-04-15 11:03:39 +09001706func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001707 // there are three links between liba --> libz.
1708 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001709 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001710 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001711 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001712 apex {
1713 name: "myapex",
1714 key: "myapex.key",
1715 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001716 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001717 }
1718
1719 apex {
1720 name: "otherapex",
1721 key: "myapex.key",
1722 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001723 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001724 }
1725
1726 apex_key {
1727 name: "myapex.key",
1728 public_key: "testkey.avbpubkey",
1729 private_key: "testkey.pem",
1730 }
1731
1732 cc_library {
1733 name: "libx",
1734 shared_libs: ["liba"],
1735 system_shared_libs: [],
1736 stl: "none",
1737 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001738 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001739 }
1740
1741 cc_library {
1742 name: "liby",
1743 shared_libs: ["liba"],
1744 system_shared_libs: [],
1745 stl: "none",
1746 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001747 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001748 }
1749
1750 cc_library {
1751 name: "liba",
1752 shared_libs: ["libz"],
1753 system_shared_libs: [],
1754 stl: "none",
1755 apex_available: [
1756 "//apex_available:anyapex",
1757 "//apex_available:platform",
1758 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001759 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001760 }
1761
1762 cc_library {
1763 name: "libz",
1764 system_shared_libs: [],
1765 stl: "none",
1766 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001767 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001768 },
1769 }
Jooyung Han749dc692020-04-15 11:03:39 +09001770 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001771
1772 expectLink := func(from, from_variant, to, to_variant string) {
1773 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1774 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1775 }
1776 expectNoLink := func(from, from_variant, to, to_variant string) {
1777 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1778 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1779 }
1780 // platform liba is linked to non-stub version
1781 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001782 // liba in myapex is linked to current
1783 expectLink("liba", "shared_apex29", "libz", "shared_current")
1784 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001785 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001786 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001787 // liba in otherapex is linked to current
1788 expectLink("liba", "shared_apex30", "libz", "shared_current")
1789 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001790 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1791 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001792}
1793
Jooyung Hanaed150d2020-04-02 01:41:41 +09001794func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001795 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001796 apex {
1797 name: "myapex",
1798 key: "myapex.key",
1799 native_shared_libs: ["libx"],
1800 min_sdk_version: "R",
1801 }
1802
1803 apex_key {
1804 name: "myapex.key",
1805 public_key: "testkey.avbpubkey",
1806 private_key: "testkey.pem",
1807 }
1808
1809 cc_library {
1810 name: "libx",
1811 shared_libs: ["libz"],
1812 system_shared_libs: [],
1813 stl: "none",
1814 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001815 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001816 }
1817
1818 cc_library {
1819 name: "libz",
1820 system_shared_libs: [],
1821 stl: "none",
1822 stubs: {
1823 versions: ["29", "R"],
1824 },
1825 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001826 `,
1827 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1828 variables.Platform_version_active_codenames = []string{"R"}
1829 }),
1830 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001831
1832 expectLink := func(from, from_variant, to, to_variant string) {
1833 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1834 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1835 }
1836 expectNoLink := func(from, from_variant, to, to_variant string) {
1837 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1838 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1839 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001840 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1841 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001842 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1843 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001844}
1845
Jooyung Han4c4da062021-06-23 10:23:16 +09001846func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1847 testApex(t, `
1848 apex {
1849 name: "myapex",
1850 key: "myapex.key",
1851 java_libs: ["libx"],
1852 min_sdk_version: "S",
1853 }
1854
1855 apex_key {
1856 name: "myapex.key",
1857 public_key: "testkey.avbpubkey",
1858 private_key: "testkey.pem",
1859 }
1860
1861 java_library {
1862 name: "libx",
1863 srcs: ["a.java"],
1864 apex_available: [ "myapex" ],
1865 sdk_version: "current",
1866 min_sdk_version: "S", // should be okay
1867 }
1868 `,
1869 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1870 variables.Platform_version_active_codenames = []string{"S"}
1871 variables.Platform_sdk_codename = proptools.StringPtr("S")
1872 }),
1873 )
1874}
1875
Jooyung Han749dc692020-04-15 11:03:39 +09001876func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001877 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001878 apex {
1879 name: "myapex",
1880 key: "myapex.key",
1881 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001882 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001883 }
1884
1885 apex_key {
1886 name: "myapex.key",
1887 public_key: "testkey.avbpubkey",
1888 private_key: "testkey.pem",
1889 }
1890
1891 cc_library {
1892 name: "libx",
1893 shared_libs: ["libz"],
1894 system_shared_libs: [],
1895 stl: "none",
1896 apex_available: [ "myapex" ],
1897 }
1898
1899 cc_library {
1900 name: "libz",
1901 system_shared_libs: [],
1902 stl: "none",
1903 stubs: {
1904 versions: ["1", "2"],
1905 },
1906 }
1907 `)
1908
1909 expectLink := func(from, from_variant, to, to_variant string) {
1910 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1911 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1912 }
1913 expectNoLink := func(from, from_variant, to, to_variant string) {
1914 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1915 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1916 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001917 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001918 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001919 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001920 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001921}
1922
Jooyung Handfc864c2023-03-20 18:19:07 +09001923func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001924 ctx := testApex(t, `
1925 apex {
1926 name: "myapex",
1927 key: "myapex.key",
1928 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001929 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001930 vendor: true,
1931 min_sdk_version: "29",
1932 }
1933
1934 apex_key {
1935 name: "myapex.key",
1936 public_key: "testkey.avbpubkey",
1937 private_key: "testkey.pem",
1938 }
1939
1940 cc_library {
1941 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001942 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001943 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001944 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001945 shared_libs: ["libbar"],
1946 }
1947
1948 cc_library {
1949 name: "libbar",
1950 stubs: { versions: ["29", "30"] },
1951 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09001952 }
1953 `)
1954
1955 vendorVariant := "android_vendor.29_arm64_armv8-a"
1956
Jooyung Handfc864c2023-03-20 18:19:07 +09001957 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
1958
1959 // Ensure that mylib links with "current" LLNDK
1960 libFlags := names(mylib.Rule("ld").Args["libFlags"])
1961 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
1962
1963 // Ensure that mylib is targeting 29
1964 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
1965 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
1966
1967 // Ensure that the correct variant of crtbegin_so is used.
1968 crtBegin := mylib.Rule("ld").Args["crtBegin"]
1969 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09001970
1971 // Ensure that the crtbegin_so used by the APEX is targeting 29
1972 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1973 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1974}
1975
Jooyung Han4495f842023-04-25 16:39:59 +09001976func TestTrackAllowedDeps(t *testing.T) {
1977 ctx := testApex(t, `
1978 apex {
1979 name: "myapex",
1980 key: "myapex.key",
1981 updatable: true,
1982 native_shared_libs: [
1983 "mylib",
1984 "yourlib",
1985 ],
1986 min_sdk_version: "29",
1987 }
1988
1989 apex {
1990 name: "myapex2",
1991 key: "myapex.key",
1992 updatable: false,
1993 native_shared_libs: ["yourlib"],
1994 }
1995
1996 apex_key {
1997 name: "myapex.key",
1998 public_key: "testkey.avbpubkey",
1999 private_key: "testkey.pem",
2000 }
2001
2002 cc_library {
2003 name: "mylib",
2004 srcs: ["mylib.cpp"],
2005 shared_libs: ["libbar"],
2006 min_sdk_version: "29",
2007 apex_available: ["myapex"],
2008 }
2009
2010 cc_library {
2011 name: "libbar",
2012 stubs: { versions: ["29", "30"] },
2013 }
2014
2015 cc_library {
2016 name: "yourlib",
2017 srcs: ["mylib.cpp"],
2018 min_sdk_version: "29",
2019 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2020 }
2021 `, withFiles(android.MockFS{
2022 "packages/modules/common/build/allowed_deps.txt": nil,
2023 }))
2024
2025 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2026 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2027 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002028 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002029 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002030 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002031
Jooyung Hana0503a52023-08-23 13:12:50 +09002032 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han4495f842023-04-25 16:39:59 +09002033 flatlist := strings.Split(myapex.Output("depsinfo/flatlist.txt").BuildParams.Args["content"], "\\n")
2034 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2035 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2036 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2037 flatlist, "mylib:(minSdkVersion:29)")
2038 android.AssertStringListContains(t, "track platform-available lib",
2039 flatlist, "yourlib(minSdkVersion:29)")
2040}
2041
2042func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2043 ctx := testApex(t, `
2044 apex {
2045 name: "myapex",
2046 key: "myapex.key",
2047 updatable: true,
2048 min_sdk_version: "29",
2049 }
2050
2051 apex_key {
2052 name: "myapex.key",
2053 public_key: "testkey.avbpubkey",
2054 private_key: "testkey.pem",
2055 }
2056 `)
2057 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2058 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2059 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2060 }
2061}
2062
Jooyung Han03b51852020-02-26 22:45:42 +09002063func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002064 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002065 apex {
2066 name: "myapex",
2067 key: "myapex.key",
2068 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002069 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002070 }
2071
2072 apex_key {
2073 name: "myapex.key",
2074 public_key: "testkey.avbpubkey",
2075 private_key: "testkey.pem",
2076 }
2077
2078 cc_library {
2079 name: "libx",
2080 system_shared_libs: [],
2081 stl: "none",
2082 apex_available: [ "myapex" ],
2083 stubs: {
2084 versions: ["1", "2"],
2085 },
2086 }
2087
2088 cc_library {
2089 name: "libz",
2090 shared_libs: ["libx"],
2091 system_shared_libs: [],
2092 stl: "none",
2093 }
2094 `)
2095
2096 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002097 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002098 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2099 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2100 }
2101 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002102 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002103 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2104 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2105 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002106 expectLink("libz", "shared", "libx", "shared_current")
2107 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002108 expectNoLink("libz", "shared", "libz", "shared_1")
2109 expectNoLink("libz", "shared", "libz", "shared")
2110}
2111
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002112var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2113 func(variables android.FixtureProductVariables) {
2114 variables.SanitizeDevice = []string{"hwaddress"}
2115 },
2116)
2117
Jooyung Han75568392020-03-20 04:29:24 +09002118func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002119 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002120 apex {
2121 name: "myapex",
2122 key: "myapex.key",
2123 native_shared_libs: ["libx"],
2124 min_sdk_version: "29",
2125 }
2126
2127 apex_key {
2128 name: "myapex.key",
2129 public_key: "testkey.avbpubkey",
2130 private_key: "testkey.pem",
2131 }
2132
2133 cc_library {
2134 name: "libx",
2135 shared_libs: ["libbar"],
2136 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002137 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002138 }
2139
2140 cc_library {
2141 name: "libbar",
2142 stubs: {
2143 versions: ["29", "30"],
2144 },
2145 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002146 `,
2147 prepareForTestWithSantitizeHwaddress,
2148 )
Jooyung Han03b51852020-02-26 22:45:42 +09002149 expectLink := func(from, from_variant, to, to_variant string) {
2150 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2151 libFlags := ld.Args["libFlags"]
2152 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2153 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002154 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002155}
2156
Jooyung Han75568392020-03-20 04:29:24 +09002157func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002158 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002159 apex {
2160 name: "myapex",
2161 key: "myapex.key",
2162 native_shared_libs: ["libx"],
2163 min_sdk_version: "29",
2164 }
2165
2166 apex_key {
2167 name: "myapex.key",
2168 public_key: "testkey.avbpubkey",
2169 private_key: "testkey.pem",
2170 }
2171
2172 cc_library {
2173 name: "libx",
2174 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002175 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002176 }
Jooyung Han75568392020-03-20 04:29:24 +09002177 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002178
2179 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002180 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002181 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002182 // note that platform variant is not.
2183 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002184 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002185}
2186
Jooyung Han749dc692020-04-15 11:03:39 +09002187func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2188 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002189 apex {
2190 name: "myapex",
2191 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002192 native_shared_libs: ["mylib"],
2193 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002194 }
2195
2196 apex_key {
2197 name: "myapex.key",
2198 public_key: "testkey.avbpubkey",
2199 private_key: "testkey.pem",
2200 }
Jooyung Han749dc692020-04-15 11:03:39 +09002201
2202 cc_library {
2203 name: "mylib",
2204 srcs: ["mylib.cpp"],
2205 system_shared_libs: [],
2206 stl: "none",
2207 apex_available: [
2208 "myapex",
2209 ],
2210 min_sdk_version: "30",
2211 }
2212 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002213
2214 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2215 apex {
2216 name: "myapex",
2217 key: "myapex.key",
2218 native_shared_libs: ["libfoo.ffi"],
2219 min_sdk_version: "29",
2220 }
2221
2222 apex_key {
2223 name: "myapex.key",
2224 public_key: "testkey.avbpubkey",
2225 private_key: "testkey.pem",
2226 }
2227
2228 rust_ffi_shared {
2229 name: "libfoo.ffi",
2230 srcs: ["foo.rs"],
2231 crate_name: "foo",
2232 apex_available: [
2233 "myapex",
2234 ],
2235 min_sdk_version: "30",
2236 }
2237 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002238
2239 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2240 apex {
2241 name: "myapex",
2242 key: "myapex.key",
2243 java_libs: ["libfoo"],
2244 min_sdk_version: "29",
2245 }
2246
2247 apex_key {
2248 name: "myapex.key",
2249 public_key: "testkey.avbpubkey",
2250 private_key: "testkey.pem",
2251 }
2252
2253 java_import {
2254 name: "libfoo",
2255 jars: ["libfoo.jar"],
2256 apex_available: [
2257 "myapex",
2258 ],
2259 min_sdk_version: "30",
2260 }
2261 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002262
2263 // Skip check for modules compiling against core API surface
2264 testApex(t, `
2265 apex {
2266 name: "myapex",
2267 key: "myapex.key",
2268 java_libs: ["libfoo"],
2269 min_sdk_version: "29",
2270 }
2271
2272 apex_key {
2273 name: "myapex.key",
2274 public_key: "testkey.avbpubkey",
2275 private_key: "testkey.pem",
2276 }
2277
2278 java_library {
2279 name: "libfoo",
2280 srcs: ["Foo.java"],
2281 apex_available: [
2282 "myapex",
2283 ],
2284 // Compile against core API surface
2285 sdk_version: "core_current",
2286 min_sdk_version: "30",
2287 }
2288 `)
2289
Jooyung Han749dc692020-04-15 11:03:39 +09002290}
2291
2292func TestApexMinSdkVersion_Okay(t *testing.T) {
2293 testApex(t, `
2294 apex {
2295 name: "myapex",
2296 key: "myapex.key",
2297 native_shared_libs: ["libfoo"],
2298 java_libs: ["libbar"],
2299 min_sdk_version: "29",
2300 }
2301
2302 apex_key {
2303 name: "myapex.key",
2304 public_key: "testkey.avbpubkey",
2305 private_key: "testkey.pem",
2306 }
2307
2308 cc_library {
2309 name: "libfoo",
2310 srcs: ["mylib.cpp"],
2311 shared_libs: ["libfoo_dep"],
2312 apex_available: ["myapex"],
2313 min_sdk_version: "29",
2314 }
2315
2316 cc_library {
2317 name: "libfoo_dep",
2318 srcs: ["mylib.cpp"],
2319 apex_available: ["myapex"],
2320 min_sdk_version: "29",
2321 }
2322
2323 java_library {
2324 name: "libbar",
2325 sdk_version: "current",
2326 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002327 static_libs: [
2328 "libbar_dep",
2329 "libbar_import_dep",
2330 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002331 apex_available: ["myapex"],
2332 min_sdk_version: "29",
2333 }
2334
2335 java_library {
2336 name: "libbar_dep",
2337 sdk_version: "current",
2338 srcs: ["a.java"],
2339 apex_available: ["myapex"],
2340 min_sdk_version: "29",
2341 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002342
2343 java_import {
2344 name: "libbar_import_dep",
2345 jars: ["libbar.jar"],
2346 apex_available: ["myapex"],
2347 min_sdk_version: "29",
2348 }
Jooyung Han03b51852020-02-26 22:45:42 +09002349 `)
2350}
2351
Colin Cross8ca61c12022-10-06 21:00:14 -07002352func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2353 // Tests that an apex dependency with min_sdk_version higher than the
2354 // min_sdk_version of the apex is allowed as long as the dependency's
2355 // min_sdk_version is less than or equal to the api level that the
2356 // architecture was introduced in. In this case, arm64 didn't exist
2357 // until api level 21, so the arm64 code will never need to run on
2358 // an api level 20 device, even if other architectures of the apex
2359 // will.
2360 testApex(t, `
2361 apex {
2362 name: "myapex",
2363 key: "myapex.key",
2364 native_shared_libs: ["libfoo"],
2365 min_sdk_version: "20",
2366 }
2367
2368 apex_key {
2369 name: "myapex.key",
2370 public_key: "testkey.avbpubkey",
2371 private_key: "testkey.pem",
2372 }
2373
2374 cc_library {
2375 name: "libfoo",
2376 srcs: ["mylib.cpp"],
2377 apex_available: ["myapex"],
2378 min_sdk_version: "21",
2379 stl: "none",
2380 }
2381 `)
2382}
2383
Artur Satayev8cf899a2020-04-15 17:29:42 +01002384func TestJavaStableSdkVersion(t *testing.T) {
2385 testCases := []struct {
2386 name string
2387 expectedError string
2388 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002389 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002390 }{
2391 {
2392 name: "Non-updatable apex with non-stable dep",
2393 bp: `
2394 apex {
2395 name: "myapex",
2396 java_libs: ["myjar"],
2397 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002398 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002399 }
2400 apex_key {
2401 name: "myapex.key",
2402 public_key: "testkey.avbpubkey",
2403 private_key: "testkey.pem",
2404 }
2405 java_library {
2406 name: "myjar",
2407 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002408 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002409 apex_available: ["myapex"],
2410 }
2411 `,
2412 },
2413 {
2414 name: "Updatable apex with stable dep",
2415 bp: `
2416 apex {
2417 name: "myapex",
2418 java_libs: ["myjar"],
2419 key: "myapex.key",
2420 updatable: true,
2421 min_sdk_version: "29",
2422 }
2423 apex_key {
2424 name: "myapex.key",
2425 public_key: "testkey.avbpubkey",
2426 private_key: "testkey.pem",
2427 }
2428 java_library {
2429 name: "myjar",
2430 srcs: ["foo/bar/MyClass.java"],
2431 sdk_version: "current",
2432 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002433 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002434 }
2435 `,
2436 },
2437 {
2438 name: "Updatable apex with non-stable dep",
2439 expectedError: "cannot depend on \"myjar\"",
2440 bp: `
2441 apex {
2442 name: "myapex",
2443 java_libs: ["myjar"],
2444 key: "myapex.key",
2445 updatable: true,
2446 }
2447 apex_key {
2448 name: "myapex.key",
2449 public_key: "testkey.avbpubkey",
2450 private_key: "testkey.pem",
2451 }
2452 java_library {
2453 name: "myjar",
2454 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002455 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002456 apex_available: ["myapex"],
2457 }
2458 `,
2459 },
2460 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002461 name: "Updatable apex with non-stable legacy core platform dep",
2462 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2463 bp: `
2464 apex {
2465 name: "myapex",
2466 java_libs: ["myjar-uses-legacy"],
2467 key: "myapex.key",
2468 updatable: true,
2469 }
2470 apex_key {
2471 name: "myapex.key",
2472 public_key: "testkey.avbpubkey",
2473 private_key: "testkey.pem",
2474 }
2475 java_library {
2476 name: "myjar-uses-legacy",
2477 srcs: ["foo/bar/MyClass.java"],
2478 sdk_version: "core_platform",
2479 apex_available: ["myapex"],
2480 }
2481 `,
2482 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2483 },
2484 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002485 name: "Updatable apex with non-stable transitive dep",
2486 // This is not actually detecting that the transitive dependency is unstable, rather it is
2487 // detecting that the transitive dependency is building against a wider API surface than the
2488 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002489 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002490 bp: `
2491 apex {
2492 name: "myapex",
2493 java_libs: ["myjar"],
2494 key: "myapex.key",
2495 updatable: true,
2496 }
2497 apex_key {
2498 name: "myapex.key",
2499 public_key: "testkey.avbpubkey",
2500 private_key: "testkey.pem",
2501 }
2502 java_library {
2503 name: "myjar",
2504 srcs: ["foo/bar/MyClass.java"],
2505 sdk_version: "current",
2506 apex_available: ["myapex"],
2507 static_libs: ["transitive-jar"],
2508 }
2509 java_library {
2510 name: "transitive-jar",
2511 srcs: ["foo/bar/MyClass.java"],
2512 sdk_version: "core_platform",
2513 apex_available: ["myapex"],
2514 }
2515 `,
2516 },
2517 }
2518
2519 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002520 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2521 continue
2522 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002523 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002524 errorHandler := android.FixtureExpectsNoErrors
2525 if test.expectedError != "" {
2526 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002527 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002528 android.GroupFixturePreparers(
2529 java.PrepareForTestWithJavaDefaultModules,
2530 PrepareForTestWithApexBuildComponents,
2531 prepareForTestWithMyapex,
2532 android.OptionalFixturePreparer(test.preparer),
2533 ).
2534 ExtendWithErrorHandler(errorHandler).
2535 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002536 })
2537 }
2538}
2539
Jooyung Han749dc692020-04-15 11:03:39 +09002540func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2541 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2542 apex {
2543 name: "myapex",
2544 key: "myapex.key",
2545 native_shared_libs: ["mylib"],
2546 min_sdk_version: "29",
2547 }
2548
2549 apex_key {
2550 name: "myapex.key",
2551 public_key: "testkey.avbpubkey",
2552 private_key: "testkey.pem",
2553 }
2554
2555 cc_library {
2556 name: "mylib",
2557 srcs: ["mylib.cpp"],
2558 shared_libs: ["mylib2"],
2559 system_shared_libs: [],
2560 stl: "none",
2561 apex_available: [
2562 "myapex",
2563 ],
2564 min_sdk_version: "29",
2565 }
2566
2567 // indirect part of the apex
2568 cc_library {
2569 name: "mylib2",
2570 srcs: ["mylib.cpp"],
2571 system_shared_libs: [],
2572 stl: "none",
2573 apex_available: [
2574 "myapex",
2575 ],
2576 min_sdk_version: "30",
2577 }
2578 `)
2579}
2580
2581func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2582 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2583 apex {
2584 name: "myapex",
2585 key: "myapex.key",
2586 apps: ["AppFoo"],
2587 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002588 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002589 }
2590
2591 apex_key {
2592 name: "myapex.key",
2593 public_key: "testkey.avbpubkey",
2594 private_key: "testkey.pem",
2595 }
2596
2597 android_app {
2598 name: "AppFoo",
2599 srcs: ["foo/bar/MyClass.java"],
2600 sdk_version: "current",
2601 min_sdk_version: "29",
2602 system_modules: "none",
2603 stl: "none",
2604 static_libs: ["bar"],
2605 apex_available: [ "myapex" ],
2606 }
2607
2608 java_library {
2609 name: "bar",
2610 sdk_version: "current",
2611 srcs: ["a.java"],
2612 apex_available: [ "myapex" ],
2613 }
2614 `)
2615}
2616
2617func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002618 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002619 apex {
2620 name: "myapex",
2621 key: "myapex.key",
2622 native_shared_libs: ["mylib"],
2623 min_sdk_version: "29",
2624 }
2625
2626 apex_key {
2627 name: "myapex.key",
2628 public_key: "testkey.avbpubkey",
2629 private_key: "testkey.pem",
2630 }
2631
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002632 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002633 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2634 cc_library {
2635 name: "mylib",
2636 srcs: ["mylib.cpp"],
2637 shared_libs: ["mylib2"],
2638 system_shared_libs: [],
2639 stl: "none",
2640 apex_available: ["myapex", "otherapex"],
2641 min_sdk_version: "29",
2642 }
2643
2644 cc_library {
2645 name: "mylib2",
2646 srcs: ["mylib.cpp"],
2647 system_shared_libs: [],
2648 stl: "none",
2649 apex_available: ["otherapex"],
2650 stubs: { versions: ["29", "30"] },
2651 min_sdk_version: "30",
2652 }
2653
2654 apex {
2655 name: "otherapex",
2656 key: "myapex.key",
2657 native_shared_libs: ["mylib", "mylib2"],
2658 min_sdk_version: "30",
2659 }
2660 `)
2661 expectLink := func(from, from_variant, to, to_variant string) {
2662 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2663 libFlags := ld.Args["libFlags"]
2664 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2665 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002666 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002667 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002668}
2669
Jooyung Haned124c32021-01-26 11:43:46 +09002670func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002671 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2672 func(variables android.FixtureProductVariables) {
2673 variables.Platform_sdk_codename = proptools.StringPtr("S")
2674 variables.Platform_version_active_codenames = []string{"S"}
2675 },
2676 )
Jooyung Haned124c32021-01-26 11:43:46 +09002677 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2678 apex {
2679 name: "myapex",
2680 key: "myapex.key",
2681 native_shared_libs: ["libfoo"],
2682 min_sdk_version: "S",
2683 }
2684 apex_key {
2685 name: "myapex.key",
2686 public_key: "testkey.avbpubkey",
2687 private_key: "testkey.pem",
2688 }
2689 cc_library {
2690 name: "libfoo",
2691 shared_libs: ["libbar"],
2692 apex_available: ["myapex"],
2693 min_sdk_version: "29",
2694 }
2695 cc_library {
2696 name: "libbar",
2697 apex_available: ["myapex"],
2698 }
2699 `, withSAsActiveCodeNames)
2700}
2701
2702func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002703 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2704 variables.Platform_sdk_codename = proptools.StringPtr("S")
2705 variables.Platform_version_active_codenames = []string{"S", "T"}
2706 })
Colin Cross1c460562021-02-16 17:55:47 -08002707 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002708 apex {
2709 name: "myapex",
2710 key: "myapex.key",
2711 native_shared_libs: ["libfoo"],
2712 min_sdk_version: "S",
2713 }
2714 apex_key {
2715 name: "myapex.key",
2716 public_key: "testkey.avbpubkey",
2717 private_key: "testkey.pem",
2718 }
2719 cc_library {
2720 name: "libfoo",
2721 shared_libs: ["libbar"],
2722 apex_available: ["myapex"],
2723 min_sdk_version: "S",
2724 }
2725 cc_library {
2726 name: "libbar",
2727 stubs: {
2728 symbol_file: "libbar.map.txt",
2729 versions: ["30", "S", "T"],
2730 },
2731 }
2732 `, withSAsActiveCodeNames)
2733
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002734 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002735 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2736 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002737 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002738}
2739
Jiyong Park7c2ee712018-12-07 00:42:25 +09002740func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002741 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002742 apex {
2743 name: "myapex",
2744 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002745 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002746 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002747 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002748 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002749 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002750 }
2751
2752 apex_key {
2753 name: "myapex.key",
2754 public_key: "testkey.avbpubkey",
2755 private_key: "testkey.pem",
2756 }
2757
2758 prebuilt_etc {
2759 name: "myetc",
2760 src: "myprebuilt",
2761 sub_dir: "foo/bar",
2762 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002763
2764 cc_library {
2765 name: "mylib",
2766 srcs: ["mylib.cpp"],
2767 relative_install_path: "foo/bar",
2768 system_shared_libs: [],
2769 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002770 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002771 }
2772
2773 cc_binary {
2774 name: "mybin",
2775 srcs: ["mylib.cpp"],
2776 relative_install_path: "foo/bar",
2777 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002778 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002779 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002780 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002781
2782 rust_binary {
2783 name: "mybin.rust",
2784 srcs: ["foo.rs"],
2785 relative_install_path: "rust_subdir",
2786 apex_available: [ "myapex" ],
2787 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002788 `)
2789
Jooyung Hana0503a52023-08-23 13:12:50 +09002790 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002791 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002792
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002793 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002794 ensureContains(t, cmd, "/etc ")
2795 ensureContains(t, cmd, "/etc/foo ")
2796 ensureContains(t, cmd, "/etc/foo/bar ")
2797 ensureContains(t, cmd, "/lib64 ")
2798 ensureContains(t, cmd, "/lib64/foo ")
2799 ensureContains(t, cmd, "/lib64/foo/bar ")
2800 ensureContains(t, cmd, "/lib ")
2801 ensureContains(t, cmd, "/lib/foo ")
2802 ensureContains(t, cmd, "/lib/foo/bar ")
2803 ensureContains(t, cmd, "/bin ")
2804 ensureContains(t, cmd, "/bin/foo ")
2805 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002806 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002807}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002808
Jooyung Han35155c42020-02-06 17:33:20 +09002809func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002810 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002811 apex {
2812 name: "myapex",
2813 key: "myapex.key",
2814 multilib: {
2815 both: {
2816 native_shared_libs: ["mylib"],
2817 binaries: ["mybin"],
2818 },
2819 },
2820 compile_multilib: "both",
2821 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002822 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002823 }
2824
2825 apex_key {
2826 name: "myapex.key",
2827 public_key: "testkey.avbpubkey",
2828 private_key: "testkey.pem",
2829 }
2830
2831 cc_library {
2832 name: "mylib",
2833 relative_install_path: "foo/bar",
2834 system_shared_libs: [],
2835 stl: "none",
2836 apex_available: [ "myapex" ],
2837 native_bridge_supported: true,
2838 }
2839
2840 cc_binary {
2841 name: "mybin",
2842 relative_install_path: "foo/bar",
2843 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002844 stl: "none",
2845 apex_available: [ "myapex" ],
2846 native_bridge_supported: true,
2847 compile_multilib: "both", // default is "first" for binary
2848 multilib: {
2849 lib64: {
2850 suffix: "64",
2851 },
2852 },
2853 }
2854 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09002855 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09002856 "bin/foo/bar/mybin",
2857 "bin/foo/bar/mybin64",
2858 "bin/arm/foo/bar/mybin",
2859 "bin/arm64/foo/bar/mybin64",
2860 "lib/foo/bar/mylib.so",
2861 "lib/arm/foo/bar/mylib.so",
2862 "lib64/foo/bar/mylib.so",
2863 "lib64/arm64/foo/bar/mylib.so",
2864 })
2865}
2866
Jooyung Han85d61762020-06-24 23:50:26 +09002867func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002868 result := android.GroupFixturePreparers(
2869 prepareForApexTest,
2870 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2871 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002872 apex {
2873 name: "myapex",
2874 key: "myapex.key",
2875 binaries: ["mybin"],
2876 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002877 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002878 }
2879 apex_key {
2880 name: "myapex.key",
2881 public_key: "testkey.avbpubkey",
2882 private_key: "testkey.pem",
2883 }
2884 cc_binary {
2885 name: "mybin",
2886 vendor: true,
2887 shared_libs: ["libfoo"],
2888 }
2889 cc_library {
2890 name: "libfoo",
2891 proprietary: true,
2892 }
2893 `)
2894
Jooyung Hana0503a52023-08-23 13:12:50 +09002895 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002896 "bin/mybin",
2897 "lib64/libfoo.so",
2898 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2899 "lib64/libc++.so",
2900 })
2901
Jooyung Hana0503a52023-08-23 13:12:50 +09002902 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08002903 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002904 name := apexBundle.BaseModuleName()
2905 prefix := "TARGET_"
2906 var builder strings.Builder
2907 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002908 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002909 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002910 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002911
Jooyung Hana0503a52023-08-23 13:12:50 +09002912 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002913 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2914 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002915}
2916
Jooyung Hanc5a96762022-02-04 11:54:50 +09002917func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2918 testApexError(t, `Trying to include a VNDK library`, `
2919 apex {
2920 name: "myapex",
2921 key: "myapex.key",
2922 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2923 vendor: true,
2924 use_vndk_as_stable: true,
2925 updatable: false,
2926 }
2927 apex_key {
2928 name: "myapex.key",
2929 public_key: "testkey.avbpubkey",
2930 private_key: "testkey.pem",
2931 }`)
2932}
2933
Jooyung Handf78e212020-07-22 15:54:47 +09002934func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002935 // myapex myapex2
2936 // | |
2937 // mybin ------. mybin2
2938 // \ \ / |
2939 // (stable) .---\--------` |
2940 // \ / \ |
2941 // \ / \ /
2942 // libvndk libvendor
2943 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002944 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002945 apex {
2946 name: "myapex",
2947 key: "myapex.key",
2948 binaries: ["mybin"],
2949 vendor: true,
2950 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002951 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002952 }
2953 apex_key {
2954 name: "myapex.key",
2955 public_key: "testkey.avbpubkey",
2956 private_key: "testkey.pem",
2957 }
2958 cc_binary {
2959 name: "mybin",
2960 vendor: true,
2961 shared_libs: ["libvndk", "libvendor"],
2962 }
2963 cc_library {
2964 name: "libvndk",
2965 vndk: {
2966 enabled: true,
2967 },
2968 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002969 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002970 }
2971 cc_library {
2972 name: "libvendor",
2973 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002974 stl: "none",
2975 }
2976 apex {
2977 name: "myapex2",
2978 key: "myapex.key",
2979 binaries: ["mybin2"],
2980 vendor: true,
2981 use_vndk_as_stable: false,
2982 updatable: false,
2983 }
2984 cc_binary {
2985 name: "mybin2",
2986 vendor: true,
2987 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002988 }
Kiyoung Kim8269cee2023-07-26 12:39:19 +09002989 `,
2990 android.FixtureModifyConfig(func(config android.Config) {
2991 config.TestProductVariables.KeepVndk = proptools.BoolPtr(true)
2992 }),
2993 )
Jooyung Handf78e212020-07-22 15:54:47 +09002994
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002995 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002996
Jooyung Han91f92032022-02-04 12:36:33 +09002997 for _, tc := range []struct {
2998 name string
2999 apexName string
3000 moduleName string
3001 moduleVariant string
3002 libs []string
3003 contents []string
3004 requireVndkNamespace bool
3005 }{
3006 {
3007 name: "use_vndk_as_stable",
3008 apexName: "myapex",
3009 moduleName: "mybin",
3010 moduleVariant: vendorVariant + "_apex10000",
3011 libs: []string{
3012 // should link with vendor variants of VNDK libs(libvndk/libc++)
3013 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3014 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3015 // unstable Vendor libs as APEX variant
3016 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3017 },
3018 contents: []string{
3019 "bin/mybin",
3020 "lib64/libvendor.so",
3021 // VNDK libs (libvndk/libc++) are not included
3022 },
3023 requireVndkNamespace: true,
3024 },
3025 {
3026 name: "!use_vndk_as_stable",
3027 apexName: "myapex2",
3028 moduleName: "mybin2",
3029 moduleVariant: vendorVariant + "_myapex2",
3030 libs: []string{
3031 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3032 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3033 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3034 // unstable vendor libs have "merged" APEX variants
3035 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3036 },
3037 contents: []string{
3038 "bin/mybin2",
3039 "lib64/libvendor.so",
3040 // VNDK libs are included as well
3041 "lib64/libvndk.so",
3042 "lib64/libc++.so",
3043 },
3044 requireVndkNamespace: false,
3045 },
3046 } {
3047 t.Run(tc.name, func(t *testing.T) {
3048 // Check linked libs
3049 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3050 libs := names(ldRule.Args["libFlags"])
3051 for _, lib := range tc.libs {
3052 ensureListContains(t, libs, lib)
3053 }
3054 // Check apex contents
Jooyung Hana0503a52023-08-23 13:12:50 +09003055 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName, tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003056
Jooyung Han91f92032022-02-04 12:36:33 +09003057 // Check "requireNativeLibs"
Jooyung Hana0503a52023-08-23 13:12:50 +09003058 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName).Rule("apexManifestRule")
Jooyung Han91f92032022-02-04 12:36:33 +09003059 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3060 if tc.requireVndkNamespace {
3061 ensureListContains(t, requireNativeLibs, ":vndk")
3062 } else {
3063 ensureListNotContains(t, requireNativeLibs, ":vndk")
3064 }
3065 })
3066 }
Jooyung Handf78e212020-07-22 15:54:47 +09003067}
3068
Justin Yun13decfb2021-03-08 19:25:55 +09003069func TestProductVariant(t *testing.T) {
3070 ctx := testApex(t, `
3071 apex {
3072 name: "myapex",
3073 key: "myapex.key",
3074 updatable: false,
3075 product_specific: true,
3076 binaries: ["foo"],
3077 }
3078
3079 apex_key {
3080 name: "myapex.key",
3081 public_key: "testkey.avbpubkey",
3082 private_key: "testkey.pem",
3083 }
3084
3085 cc_binary {
3086 name: "foo",
3087 product_available: true,
3088 apex_available: ["myapex"],
3089 srcs: ["foo.cpp"],
3090 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003091 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003092
3093 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003094 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003095 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3096 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3097 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3098 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3099}
3100
Jooyung Han8e5685d2020-09-21 11:02:57 +09003101func TestApex_withPrebuiltFirmware(t *testing.T) {
3102 testCases := []struct {
3103 name string
3104 additionalProp string
3105 }{
3106 {"system apex with prebuilt_firmware", ""},
3107 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3108 }
3109 for _, tc := range testCases {
3110 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003111 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003112 apex {
3113 name: "myapex",
3114 key: "myapex.key",
3115 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003116 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003117 `+tc.additionalProp+`
3118 }
3119 apex_key {
3120 name: "myapex.key",
3121 public_key: "testkey.avbpubkey",
3122 private_key: "testkey.pem",
3123 }
3124 prebuilt_firmware {
3125 name: "myfirmware",
3126 src: "myfirmware.bin",
3127 filename_from_src: true,
3128 `+tc.additionalProp+`
3129 }
3130 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003131 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003132 "etc/firmware/myfirmware.bin",
3133 })
3134 })
3135 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003136}
3137
Jooyung Hanefb184e2020-06-25 17:14:25 +09003138func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003139 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003140 apex {
3141 name: "myapex",
3142 key: "myapex.key",
3143 vendor: true,
3144 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003145 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003146 }
3147
3148 apex_key {
3149 name: "myapex.key",
3150 public_key: "testkey.avbpubkey",
3151 private_key: "testkey.pem",
3152 }
3153
3154 cc_library {
3155 name: "mylib",
3156 vendor_available: true,
3157 }
3158 `)
3159
Jooyung Hana0503a52023-08-23 13:12:50 +09003160 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003161 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003162 name := apexBundle.BaseModuleName()
3163 prefix := "TARGET_"
3164 var builder strings.Builder
3165 data.Custom(&builder, name, prefix, "", data)
3166 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003167 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003168}
3169
Jooyung Han2ed99d02020-06-24 23:26:26 +09003170func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003171 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003172 apex {
3173 name: "myapex",
3174 key: "myapex.key",
3175 vintf_fragments: ["fragment.xml"],
3176 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003177 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003178 }
3179 apex_key {
3180 name: "myapex.key",
3181 public_key: "testkey.avbpubkey",
3182 private_key: "testkey.pem",
3183 }
3184 cc_binary {
3185 name: "mybin",
3186 }
3187 `)
3188
Jooyung Hana0503a52023-08-23 13:12:50 +09003189 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003190 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003191 name := apexBundle.BaseModuleName()
3192 prefix := "TARGET_"
3193 var builder strings.Builder
3194 data.Custom(&builder, name, prefix, "", data)
3195 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003196 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003197 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003198}
3199
Jiyong Park16e91a02018-12-20 18:18:08 +09003200func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003201 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003202 apex {
3203 name: "myapex",
3204 key: "myapex.key",
3205 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003206 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003207 }
3208
3209 apex_key {
3210 name: "myapex.key",
3211 public_key: "testkey.avbpubkey",
3212 private_key: "testkey.pem",
3213 }
3214
3215 cc_library {
3216 name: "mylib",
3217 srcs: ["mylib.cpp"],
3218 system_shared_libs: [],
3219 stl: "none",
3220 stubs: {
3221 versions: ["1", "2", "3"],
3222 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003223 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003224 }
3225
3226 cc_binary {
3227 name: "not_in_apex",
3228 srcs: ["mylib.cpp"],
3229 static_libs: ["mylib"],
3230 static_executable: true,
3231 system_shared_libs: [],
3232 stl: "none",
3233 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003234 `)
3235
Colin Cross7113d202019-11-20 16:39:12 -08003236 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003237
3238 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003239 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003240}
Jiyong Park9335a262018-12-24 11:31:58 +09003241
3242func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003243 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003244 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003245 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003246 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003247 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003248 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003249 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003250 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003251 }
3252
3253 cc_library {
3254 name: "mylib",
3255 srcs: ["mylib.cpp"],
3256 system_shared_libs: [],
3257 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003258 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003259 }
3260
3261 apex_key {
3262 name: "myapex.key",
3263 public_key: "testkey.avbpubkey",
3264 private_key: "testkey.pem",
3265 }
3266
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003267 android_app_certificate {
3268 name: "myapex.certificate",
3269 certificate: "testkey",
3270 }
3271
3272 android_app_certificate {
3273 name: "myapex.certificate.override",
3274 certificate: "testkey.override",
3275 }
3276
Jiyong Park9335a262018-12-24 11:31:58 +09003277 `)
3278
3279 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003280 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003281
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003282 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3283 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003284 "vendor/foo/devkeys/testkey.avbpubkey")
3285 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003286 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3287 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003288 "vendor/foo/devkeys/testkey.pem")
3289 }
3290
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003291 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003292 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003293 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003294 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003295 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003296 }
3297}
Jiyong Park58e364a2019-01-19 19:24:06 +09003298
Jooyung Hanf121a652019-12-17 14:30:11 +09003299func TestCertificate(t *testing.T) {
3300 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003301 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003302 apex {
3303 name: "myapex",
3304 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003305 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003306 }
3307 apex_key {
3308 name: "myapex.key",
3309 public_key: "testkey.avbpubkey",
3310 private_key: "testkey.pem",
3311 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003312 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003313 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3314 if actual := rule.Args["certificates"]; actual != expected {
3315 t.Errorf("certificates should be %q, not %q", expected, actual)
3316 }
3317 })
3318 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003319 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003320 apex {
3321 name: "myapex_keytest",
3322 key: "myapex.key",
3323 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003324 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003325 }
3326 apex_key {
3327 name: "myapex.key",
3328 public_key: "testkey.avbpubkey",
3329 private_key: "testkey.pem",
3330 }
3331 android_app_certificate {
3332 name: "myapex.certificate.override",
3333 certificate: "testkey.override",
3334 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003335 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003336 expected := "testkey.override.x509.pem testkey.override.pk8"
3337 if actual := rule.Args["certificates"]; actual != expected {
3338 t.Errorf("certificates should be %q, not %q", expected, actual)
3339 }
3340 })
3341 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003342 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003343 apex {
3344 name: "myapex",
3345 key: "myapex.key",
3346 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003347 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003348 }
3349 apex_key {
3350 name: "myapex.key",
3351 public_key: "testkey.avbpubkey",
3352 private_key: "testkey.pem",
3353 }
3354 android_app_certificate {
3355 name: "myapex.certificate",
3356 certificate: "testkey",
3357 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003358 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003359 expected := "testkey.x509.pem testkey.pk8"
3360 if actual := rule.Args["certificates"]; actual != expected {
3361 t.Errorf("certificates should be %q, not %q", expected, actual)
3362 }
3363 })
3364 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003365 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003366 apex {
3367 name: "myapex_keytest",
3368 key: "myapex.key",
3369 file_contexts: ":myapex-file_contexts",
3370 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003371 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003372 }
3373 apex_key {
3374 name: "myapex.key",
3375 public_key: "testkey.avbpubkey",
3376 private_key: "testkey.pem",
3377 }
3378 android_app_certificate {
3379 name: "myapex.certificate.override",
3380 certificate: "testkey.override",
3381 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003382 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003383 expected := "testkey.override.x509.pem testkey.override.pk8"
3384 if actual := rule.Args["certificates"]; actual != expected {
3385 t.Errorf("certificates should be %q, not %q", expected, actual)
3386 }
3387 })
3388 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003389 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003390 apex {
3391 name: "myapex",
3392 key: "myapex.key",
3393 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003394 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003395 }
3396 apex_key {
3397 name: "myapex.key",
3398 public_key: "testkey.avbpubkey",
3399 private_key: "testkey.pem",
3400 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003401 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003402 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3403 if actual := rule.Args["certificates"]; actual != expected {
3404 t.Errorf("certificates should be %q, not %q", expected, actual)
3405 }
3406 })
3407 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003408 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003409 apex {
3410 name: "myapex_keytest",
3411 key: "myapex.key",
3412 file_contexts: ":myapex-file_contexts",
3413 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003414 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003415 }
3416 apex_key {
3417 name: "myapex.key",
3418 public_key: "testkey.avbpubkey",
3419 private_key: "testkey.pem",
3420 }
3421 android_app_certificate {
3422 name: "myapex.certificate.override",
3423 certificate: "testkey.override",
3424 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003425 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003426 expected := "testkey.override.x509.pem testkey.override.pk8"
3427 if actual := rule.Args["certificates"]; actual != expected {
3428 t.Errorf("certificates should be %q, not %q", expected, actual)
3429 }
3430 })
3431}
3432
Jiyong Park58e364a2019-01-19 19:24:06 +09003433func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003434 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003435 apex {
3436 name: "myapex",
3437 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003438 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003439 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003440 }
3441
3442 apex {
3443 name: "otherapex",
3444 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003445 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003446 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003447 }
3448
3449 apex_key {
3450 name: "myapex.key",
3451 public_key: "testkey.avbpubkey",
3452 private_key: "testkey.pem",
3453 }
3454
3455 cc_library {
3456 name: "mylib",
3457 srcs: ["mylib.cpp"],
3458 system_shared_libs: [],
3459 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003460 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003461 "myapex",
3462 "otherapex",
3463 ],
Jooyung Han24282772020-03-21 23:20:55 +09003464 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003465 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003466 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003467 cc_library {
3468 name: "mylib2",
3469 srcs: ["mylib.cpp"],
3470 system_shared_libs: [],
3471 stl: "none",
3472 apex_available: [
3473 "myapex",
3474 "otherapex",
3475 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003476 static_libs: ["mylib3"],
3477 recovery_available: true,
3478 min_sdk_version: "29",
3479 }
3480 cc_library {
3481 name: "mylib3",
3482 srcs: ["mylib.cpp"],
3483 system_shared_libs: [],
3484 stl: "none",
3485 apex_available: [
3486 "myapex",
3487 "otherapex",
3488 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003489 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003490 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003491 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003492 `)
3493
Jooyung Hanc87a0592020-03-02 17:44:33 +09003494 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003495 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003496 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003497
Vinh Tranf9754732023-01-19 22:41:46 -05003498 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003499 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003500 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003501
Vinh Tranf9754732023-01-19 22:41:46 -05003502 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003503 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003504 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003505
Colin Crossaede88c2020-08-11 12:17:01 -07003506 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3507 // each variant defines additional macros to distinguish which apex variant it is built for
3508
3509 // non-APEX variant does not have __ANDROID_APEX__ defined
3510 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3511 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3512
Vinh Tranf9754732023-01-19 22:41:46 -05003513 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003514 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3515 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003516
Jooyung Hanc87a0592020-03-02 17:44:33 +09003517 // non-APEX variant does not have __ANDROID_APEX__ defined
3518 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3519 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3520
Vinh Tranf9754732023-01-19 22:41:46 -05003521 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003522 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003523 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003524}
Jiyong Park7e636d02019-01-28 16:16:54 +09003525
3526func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003527 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003528 apex {
3529 name: "myapex",
3530 key: "myapex.key",
3531 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003532 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003533 }
3534
3535 apex_key {
3536 name: "myapex.key",
3537 public_key: "testkey.avbpubkey",
3538 private_key: "testkey.pem",
3539 }
3540
3541 cc_library_headers {
3542 name: "mylib_headers",
3543 export_include_dirs: ["my_include"],
3544 system_shared_libs: [],
3545 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003546 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003547 }
3548
3549 cc_library {
3550 name: "mylib",
3551 srcs: ["mylib.cpp"],
3552 system_shared_libs: [],
3553 stl: "none",
3554 header_libs: ["mylib_headers"],
3555 export_header_lib_headers: ["mylib_headers"],
3556 stubs: {
3557 versions: ["1", "2", "3"],
3558 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003559 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003560 }
3561
3562 cc_library {
3563 name: "otherlib",
3564 srcs: ["mylib.cpp"],
3565 system_shared_libs: [],
3566 stl: "none",
3567 shared_libs: ["mylib"],
3568 }
3569 `)
3570
Colin Cross7113d202019-11-20 16:39:12 -08003571 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003572
3573 // Ensure that the include path of the header lib is exported to 'otherlib'
3574 ensureContains(t, cFlags, "-Imy_include")
3575}
Alex Light9670d332019-01-29 18:07:33 -08003576
Jiyong Park7cd10e32020-01-14 09:22:18 +09003577type fileInApex struct {
3578 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003579 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003580 isLink bool
3581}
3582
Jooyung Han1724d582022-12-21 10:17:44 +09003583func (f fileInApex) String() string {
3584 return f.src + ":" + f.path
3585}
3586
3587func (f fileInApex) match(expectation string) bool {
3588 parts := strings.Split(expectation, ":")
3589 if len(parts) == 1 {
3590 match, _ := path.Match(parts[0], f.path)
3591 return match
3592 }
3593 if len(parts) == 2 {
3594 matchSrc, _ := path.Match(parts[0], f.src)
3595 matchDst, _ := path.Match(parts[1], f.path)
3596 return matchSrc && matchDst
3597 }
3598 panic("invalid expected file specification: " + expectation)
3599}
3600
Jooyung Hana57af4a2020-01-23 05:36:59 +00003601func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003602 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003603 module := ctx.ModuleForTests(moduleName, variant)
3604 apexRule := module.MaybeRule("apexRule")
3605 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003606 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003607 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003608 for _, cmd := range strings.Split(copyCmds, "&&") {
3609 cmd = strings.TrimSpace(cmd)
3610 if cmd == "" {
3611 continue
3612 }
3613 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003614 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003615 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003616 switch terms[0] {
3617 case "mkdir":
3618 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003619 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003620 t.Fatal("copyCmds contains invalid cp command", cmd)
3621 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003622 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003623 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003624 isLink = false
3625 case "ln":
3626 if len(terms) != 3 && len(terms) != 4 {
3627 // ln LINK TARGET or ln -s LINK TARGET
3628 t.Fatal("copyCmds contains invalid ln command", cmd)
3629 }
3630 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003631 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003632 isLink = true
3633 default:
3634 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3635 }
3636 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003637 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003638 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003639 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003640 }
Jooyung Han1724d582022-12-21 10:17:44 +09003641 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003642 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003643 }
3644 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003645 return ret
3646}
3647
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003648func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003649 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003650 var failed bool
3651 var surplus []string
3652 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003653 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003654 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003655 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003656 if file.match(expected) {
3657 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003658 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003659 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003660 }
3661 }
Jooyung Han1724d582022-12-21 10:17:44 +09003662 if !matchFound {
3663 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003664 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003665 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003666
Jooyung Han31c470b2019-10-18 16:26:59 +09003667 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003668 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003669 t.Log("surplus files", surplus)
3670 failed = true
3671 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003672
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003673 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003674 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003675 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003676 if !filesMatched[expected] {
3677 missing = append(missing, expected)
3678 }
3679 }
3680 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003681 t.Log("missing files", missing)
3682 failed = true
3683 }
3684 if failed {
3685 t.Fail()
3686 }
3687}
3688
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003689func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3690 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3691}
3692
3693func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3694 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3695 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3696 if deapexer.Output != nil {
3697 outputs = append(outputs, deapexer.Output.String())
3698 }
3699 for _, output := range deapexer.ImplicitOutputs {
3700 outputs = append(outputs, output.String())
3701 }
3702 actualFiles := make([]fileInApex, 0, len(outputs))
3703 for _, output := range outputs {
3704 dir := "/deapexer/"
3705 pos := strings.LastIndex(output, dir)
3706 if pos == -1 {
3707 t.Fatal("Unknown deapexer output ", output)
3708 }
3709 path := output[pos+len(dir):]
3710 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3711 }
3712 assertFileListEquals(t, files, actualFiles)
3713}
3714
Jooyung Han344d5432019-08-23 11:17:39 +09003715func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003716 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003717 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003718 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003719 "etc/llndk.libraries.29.txt",
3720 "etc/vndkcore.libraries.29.txt",
3721 "etc/vndksp.libraries.29.txt",
3722 "etc/vndkprivate.libraries.29.txt",
3723 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003724 }
3725 testCases := []struct {
3726 vndkVersion string
3727 expectedFiles []string
3728 }{
3729 {
3730 vndkVersion: "current",
3731 expectedFiles: append(commonFiles,
3732 "lib/libvndk.so",
3733 "lib/libvndksp.so",
3734 "lib64/libvndk.so",
3735 "lib64/libvndksp.so"),
3736 },
3737 {
3738 vndkVersion: "",
3739 expectedFiles: append(commonFiles,
3740 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3741 "lib/libvndksp.so",
3742 "lib64/libvndksp.so"),
3743 },
3744 }
3745 for _, tc := range testCases {
3746 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3747 ctx := testApex(t, `
3748 apex_vndk {
3749 name: "com.android.vndk.current",
3750 key: "com.android.vndk.current.key",
3751 updatable: false,
3752 }
3753
3754 apex_key {
3755 name: "com.android.vndk.current.key",
3756 public_key: "testkey.avbpubkey",
3757 private_key: "testkey.pem",
3758 }
3759
3760 cc_library {
3761 name: "libvndk",
3762 srcs: ["mylib.cpp"],
3763 vendor_available: true,
3764 product_available: true,
3765 vndk: {
3766 enabled: true,
3767 },
3768 system_shared_libs: [],
3769 stl: "none",
3770 apex_available: [ "com.android.vndk.current" ],
3771 }
3772
3773 cc_library {
3774 name: "libvndksp",
3775 srcs: ["mylib.cpp"],
3776 vendor_available: true,
3777 product_available: true,
3778 vndk: {
3779 enabled: true,
3780 support_system_process: true,
3781 },
3782 system_shared_libs: [],
3783 stl: "none",
3784 apex_available: [ "com.android.vndk.current" ],
3785 }
3786
3787 // VNDK-Ext should not cause any problems
3788
3789 cc_library {
3790 name: "libvndk.ext",
3791 srcs: ["mylib2.cpp"],
3792 vendor: true,
3793 vndk: {
3794 enabled: true,
3795 extends: "libvndk",
3796 },
3797 system_shared_libs: [],
3798 stl: "none",
3799 }
3800
3801 cc_library {
3802 name: "libvndksp.ext",
3803 srcs: ["mylib2.cpp"],
3804 vendor: true,
3805 vndk: {
3806 enabled: true,
3807 support_system_process: true,
3808 extends: "libvndksp",
3809 },
3810 system_shared_libs: [],
3811 stl: "none",
3812 }
3813 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3814 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
Kiyoung Kima2d6dee2023-08-11 10:14:43 +09003815 variables.KeepVndk = proptools.BoolPtr(true)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003816 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003817 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", tc.expectedFiles)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003818 })
3819 }
Jooyung Han344d5432019-08-23 11:17:39 +09003820}
3821
3822func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003823 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003824 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003825 name: "com.android.vndk.current",
3826 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003827 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003828 }
3829
3830 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003831 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003832 public_key: "testkey.avbpubkey",
3833 private_key: "testkey.pem",
3834 }
3835
3836 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003837 name: "libvndk",
3838 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003839 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003840 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003841 vndk: {
3842 enabled: true,
3843 },
3844 system_shared_libs: [],
3845 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003846 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003847 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003848
3849 cc_prebuilt_library_shared {
3850 name: "libvndk.arm",
3851 srcs: ["libvndk.arm.so"],
3852 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003853 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003854 vndk: {
3855 enabled: true,
3856 },
3857 enabled: false,
3858 arch: {
3859 arm: {
3860 enabled: true,
3861 },
3862 },
3863 system_shared_libs: [],
3864 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003865 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003866 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003867 `+vndkLibrariesTxtFiles("current"),
3868 withFiles(map[string][]byte{
3869 "libvndk.so": nil,
3870 "libvndk.arm.so": nil,
3871 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003872 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003873 "lib/libvndk.so",
3874 "lib/libvndk.arm.so",
3875 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003876 "lib/libc++.so",
3877 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003878 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003879 })
Jooyung Han344d5432019-08-23 11:17:39 +09003880}
3881
Jooyung Han39edb6c2019-11-06 16:53:07 +09003882func vndkLibrariesTxtFiles(vers ...string) (result string) {
3883 for _, v := range vers {
3884 if v == "current" {
Justin Yund5784122023-10-25 13:25:32 +09003885 for _, txt := range []string{"vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003886 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003887 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003888 name: "` + txt + `.libraries.txt",
Justin Yund5784122023-10-25 13:25:32 +09003889 insert_vndk_version: true,
Jooyung Han39edb6c2019-11-06 16:53:07 +09003890 }
3891 `
3892 }
Justin Yund5784122023-10-25 13:25:32 +09003893 result += `
3894 llndk_libraries_txt {
3895 name: "llndk.libraries.txt",
3896 }
3897 llndk_libraries_txt_for_apex {
3898 name: "llndk.libraries.txt.apex",
3899 stem: "llndk.libraries.txt",
3900 insert_vndk_version: true,
3901 }
3902 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003903 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003904 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003905 result += `
3906 prebuilt_etc {
3907 name: "` + txt + `.libraries.` + v + `.txt",
3908 src: "dummy.txt",
3909 }
3910 `
3911 }
3912 }
3913 }
3914 return
3915}
3916
Jooyung Han344d5432019-08-23 11:17:39 +09003917func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003918 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003919 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003920 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003921 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003922 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003923 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003924 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003925 }
3926
3927 apex_key {
3928 name: "myapex.key",
3929 public_key: "testkey.avbpubkey",
3930 private_key: "testkey.pem",
3931 }
3932
Jooyung Han31c470b2019-10-18 16:26:59 +09003933 vndk_prebuilt_shared {
3934 name: "libvndk27",
3935 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003936 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003937 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003938 vndk: {
3939 enabled: true,
3940 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003941 target_arch: "arm64",
3942 arch: {
3943 arm: {
3944 srcs: ["libvndk27_arm.so"],
3945 },
3946 arm64: {
3947 srcs: ["libvndk27_arm64.so"],
3948 },
3949 },
Colin Cross2807f002021-03-02 10:15:29 -08003950 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003951 }
3952
3953 vndk_prebuilt_shared {
3954 name: "libvndk27",
3955 version: "27",
3956 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003957 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003958 vndk: {
3959 enabled: true,
3960 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003961 target_arch: "x86_64",
3962 arch: {
3963 x86: {
3964 srcs: ["libvndk27_x86.so"],
3965 },
3966 x86_64: {
3967 srcs: ["libvndk27_x86_64.so"],
3968 },
3969 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003970 }
3971 `+vndkLibrariesTxtFiles("27"),
3972 withFiles(map[string][]byte{
3973 "libvndk27_arm.so": nil,
3974 "libvndk27_arm64.so": nil,
3975 "libvndk27_x86.so": nil,
3976 "libvndk27_x86_64.so": nil,
3977 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003978
Jooyung Hana0503a52023-08-23 13:12:50 +09003979 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003980 "lib/libvndk27_arm.so",
3981 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003982 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003983 })
Jooyung Han344d5432019-08-23 11:17:39 +09003984}
3985
Jooyung Han90eee022019-10-01 20:02:42 +09003986func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003987 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003988 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003989 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003990 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003991 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003992 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003993 }
3994 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003995 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003996 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003997 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003998 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003999 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004000 }
4001 apex_key {
4002 name: "myapex.key",
4003 public_key: "testkey.avbpubkey",
4004 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004005 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004006
4007 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004008 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004009 apexManifestRule := module.Rule("apexManifestRule")
4010 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004011 }
4012
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004013 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004014 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004015}
4016
Jooyung Han344d5432019-08-23 11:17:39 +09004017func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004018 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004019 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004020 name: "com.android.vndk.current",
4021 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004022 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004023 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004024 }
4025
4026 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004027 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004028 public_key: "testkey.avbpubkey",
4029 private_key: "testkey.pem",
4030 }
4031
4032 cc_library {
4033 name: "libvndk",
4034 srcs: ["mylib.cpp"],
4035 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004036 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004037 native_bridge_supported: true,
4038 host_supported: true,
4039 vndk: {
4040 enabled: true,
4041 },
4042 system_shared_libs: [],
4043 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004044 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004045 }
Colin Cross2807f002021-03-02 10:15:29 -08004046 `+vndkLibrariesTxtFiles("current"),
4047 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004048
Jooyung Hana0503a52023-08-23 13:12:50 +09004049 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004050 "lib/libvndk.so",
4051 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004052 "lib/libc++.so",
4053 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004054 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004055 })
Jooyung Han344d5432019-08-23 11:17:39 +09004056}
4057
4058func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004059 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004060 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004061 name: "com.android.vndk.current",
4062 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004063 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004064 native_bridge_supported: true,
4065 }
4066
4067 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004068 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004069 public_key: "testkey.avbpubkey",
4070 private_key: "testkey.pem",
4071 }
4072
4073 cc_library {
4074 name: "libvndk",
4075 srcs: ["mylib.cpp"],
4076 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004077 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004078 native_bridge_supported: true,
4079 host_supported: true,
4080 vndk: {
4081 enabled: true,
4082 },
4083 system_shared_libs: [],
4084 stl: "none",
4085 }
4086 `)
4087}
4088
Jooyung Han31c470b2019-10-18 16:26:59 +09004089func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004090 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004091 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004092 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004093 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004094 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004095 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004096 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004097 }
4098
4099 apex_key {
4100 name: "myapex.key",
4101 public_key: "testkey.avbpubkey",
4102 private_key: "testkey.pem",
4103 }
4104
4105 vndk_prebuilt_shared {
4106 name: "libvndk27",
4107 version: "27",
4108 target_arch: "arm",
4109 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004110 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004111 vndk: {
4112 enabled: true,
4113 },
4114 arch: {
4115 arm: {
4116 srcs: ["libvndk27.so"],
4117 }
4118 },
4119 }
4120
4121 vndk_prebuilt_shared {
4122 name: "libvndk27",
4123 version: "27",
4124 target_arch: "arm",
4125 binder32bit: true,
4126 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004127 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004128 vndk: {
4129 enabled: true,
4130 },
4131 arch: {
4132 arm: {
4133 srcs: ["libvndk27binder32.so"],
4134 }
4135 },
Colin Cross2807f002021-03-02 10:15:29 -08004136 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004137 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004138 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004139 withFiles(map[string][]byte{
4140 "libvndk27.so": nil,
4141 "libvndk27binder32.so": nil,
4142 }),
4143 withBinder32bit,
4144 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004145 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004146 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4147 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004148 },
4149 }),
4150 )
4151
Jooyung Hana0503a52023-08-23 13:12:50 +09004152 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004153 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004154 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004155 })
4156}
4157
Jooyung Han45a96772020-06-15 14:59:42 +09004158func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004159 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004160 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004161 name: "com.android.vndk.current",
4162 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004163 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004164 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004165 }
4166
4167 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004168 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004169 public_key: "testkey.avbpubkey",
4170 private_key: "testkey.pem",
4171 }
4172
4173 cc_library {
4174 name: "libz",
4175 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004176 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004177 vndk: {
4178 enabled: true,
4179 },
4180 stubs: {
4181 symbol_file: "libz.map.txt",
4182 versions: ["30"],
4183 }
4184 }
4185 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4186 "libz.map.txt": nil,
4187 }))
4188
Jooyung Hana0503a52023-08-23 13:12:50 +09004189 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004190 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4191 ensureListEmpty(t, provideNativeLibs)
Jooyung Hana0503a52023-08-23 13:12:50 +09004192 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han1724d582022-12-21 10:17:44 +09004193 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4194 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4195 "*/*",
4196 })
Jooyung Han45a96772020-06-15 14:59:42 +09004197}
4198
Jooyung Hane3f02812023-05-08 13:54:50 +09004199func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4200 ctx := testApex(t, "",
4201 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4202 variables.DeviceVndkVersion = proptools.StringPtr("27")
4203 }),
4204 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4205 cc.RegisterVendorSnapshotModules(ctx)
4206 }),
4207 withFiles(map[string][]byte{
4208 "vendor/foo/Android.bp": []byte(`
4209 apex {
4210 name: "myapex",
4211 binaries: ["foo"],
4212 key: "myapex.key",
4213 min_sdk_version: "27",
4214 vendor: true,
4215 }
4216
4217 cc_binary {
4218 name: "foo",
4219 vendor: true,
4220 srcs: ["abc.cpp"],
4221 shared_libs: [
4222 "libllndk",
4223 "libvndk",
4224 ],
4225 nocrt: true,
4226 system_shared_libs: [],
4227 min_sdk_version: "27",
4228 }
4229
4230 apex_key {
4231 name: "myapex.key",
4232 public_key: "testkey.avbpubkey",
4233 private_key: "testkey.pem",
4234 }
4235 `),
4236 // Simulate VNDK prebuilts with vendor_snapshot
4237 "prebuilts/vndk/Android.bp": []byte(`
4238 vndk_prebuilt_shared {
4239 name: "libllndk",
4240 version: "27",
4241 vendor_available: true,
4242 product_available: true,
4243 target_arch: "arm64",
4244 arch: {
4245 arm64: {
4246 srcs: ["libllndk.so"],
4247 },
4248 },
4249 }
4250
4251 vndk_prebuilt_shared {
4252 name: "libvndk",
4253 version: "27",
4254 vendor_available: true,
4255 product_available: true,
4256 target_arch: "arm64",
4257 arch: {
4258 arm64: {
4259 srcs: ["libvndk.so"],
4260 },
4261 },
4262 vndk: {
4263 enabled: true,
4264 },
4265 min_sdk_version: "27",
4266 }
4267
4268 vndk_prebuilt_shared {
4269 name: "libc++",
4270 version: "27",
4271 target_arch: "arm64",
4272 vendor_available: true,
4273 product_available: true,
4274 vndk: {
4275 enabled: true,
4276 support_system_process: true,
4277 },
4278 arch: {
4279 arm64: {
4280 srcs: ["libc++.so"],
4281 },
4282 },
4283 min_sdk_version: "apex_inherit",
4284 }
4285
4286 vendor_snapshot {
4287 name: "vendor_snapshot",
4288 version: "27",
4289 arch: {
4290 arm64: {
4291 vndk_libs: [
4292 "libc++",
4293 "libllndk",
4294 "libvndk",
4295 ],
4296 static_libs: [
4297 "libc++demangle",
4298 "libclang_rt.builtins",
4299 "libunwind",
4300 ],
4301 },
4302 }
4303 }
4304
4305 vendor_snapshot_static {
4306 name: "libclang_rt.builtins",
4307 version: "27",
4308 target_arch: "arm64",
4309 vendor: true,
4310 arch: {
4311 arm64: {
4312 src: "libclang_rt.builtins-aarch64-android.a",
4313 },
4314 },
4315 }
4316
4317 vendor_snapshot_static {
4318 name: "libc++demangle",
4319 version: "27",
4320 target_arch: "arm64",
4321 compile_multilib: "64",
4322 vendor: true,
4323 arch: {
4324 arm64: {
4325 src: "libc++demangle.a",
4326 },
4327 },
4328 min_sdk_version: "apex_inherit",
4329 }
4330
4331 vendor_snapshot_static {
4332 name: "libunwind",
4333 version: "27",
4334 target_arch: "arm64",
4335 compile_multilib: "64",
4336 vendor: true,
4337 arch: {
4338 arm64: {
4339 src: "libunwind.a",
4340 },
4341 },
4342 min_sdk_version: "apex_inherit",
4343 }
4344 `),
4345 }))
4346
4347 // Should embed the prebuilt VNDK libraries in the apex
Jooyung Hana0503a52023-08-23 13:12:50 +09004348 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hane3f02812023-05-08 13:54:50 +09004349 "bin/foo",
4350 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4351 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4352 })
4353
4354 // Should link foo with prebuilt libraries (shared/static)
4355 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4356 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4357 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4358 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4359 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4360
4361 // Should declare the LLNDK library as a "required" external dependency
Jooyung Hana0503a52023-08-23 13:12:50 +09004362 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hane3f02812023-05-08 13:54:50 +09004363 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4364 ensureListContains(t, requireNativeLibs, "libllndk.so")
4365}
4366
Jooyung Hane1633032019-08-01 17:41:43 +09004367func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004368 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004369 apex {
4370 name: "myapex_nodep",
4371 key: "myapex.key",
4372 native_shared_libs: ["lib_nodep"],
4373 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004374 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004375 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004376 }
4377
4378 apex {
4379 name: "myapex_dep",
4380 key: "myapex.key",
4381 native_shared_libs: ["lib_dep"],
4382 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004383 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004384 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004385 }
4386
4387 apex {
4388 name: "myapex_provider",
4389 key: "myapex.key",
4390 native_shared_libs: ["libfoo"],
4391 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004392 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004393 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004394 }
4395
4396 apex {
4397 name: "myapex_selfcontained",
4398 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004399 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004400 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004401 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004402 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004403 }
4404
4405 apex_key {
4406 name: "myapex.key",
4407 public_key: "testkey.avbpubkey",
4408 private_key: "testkey.pem",
4409 }
4410
4411 cc_library {
4412 name: "lib_nodep",
4413 srcs: ["mylib.cpp"],
4414 system_shared_libs: [],
4415 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004416 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004417 }
4418
4419 cc_library {
4420 name: "lib_dep",
4421 srcs: ["mylib.cpp"],
4422 shared_libs: ["libfoo"],
4423 system_shared_libs: [],
4424 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004425 apex_available: [
4426 "myapex_dep",
4427 "myapex_provider",
4428 "myapex_selfcontained",
4429 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004430 }
4431
4432 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004433 name: "lib_dep_on_bar",
4434 srcs: ["mylib.cpp"],
4435 shared_libs: ["libbar"],
4436 system_shared_libs: [],
4437 stl: "none",
4438 apex_available: [
4439 "myapex_selfcontained",
4440 ],
4441 }
4442
4443
4444 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004445 name: "libfoo",
4446 srcs: ["mytest.cpp"],
4447 stubs: {
4448 versions: ["1"],
4449 },
4450 system_shared_libs: [],
4451 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004452 apex_available: [
4453 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004454 ],
4455 }
4456
4457 cc_library {
4458 name: "libbar",
4459 srcs: ["mytest.cpp"],
4460 stubs: {
4461 versions: ["1"],
4462 },
4463 system_shared_libs: [],
4464 stl: "none",
4465 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004466 "myapex_selfcontained",
4467 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004468 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004469
Jooyung Hane1633032019-08-01 17:41:43 +09004470 `)
4471
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004472 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004473 var provideNativeLibs, requireNativeLibs []string
4474
Jooyung Hana0503a52023-08-23 13:12:50 +09004475 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004476 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4477 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004478 ensureListEmpty(t, provideNativeLibs)
4479 ensureListEmpty(t, requireNativeLibs)
4480
Jooyung Hana0503a52023-08-23 13:12:50 +09004481 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004482 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4483 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004484 ensureListEmpty(t, provideNativeLibs)
4485 ensureListContains(t, requireNativeLibs, "libfoo.so")
4486
Jooyung Hana0503a52023-08-23 13:12:50 +09004487 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004488 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4489 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004490 ensureListContains(t, provideNativeLibs, "libfoo.so")
4491 ensureListEmpty(t, requireNativeLibs)
4492
Jooyung Hana0503a52023-08-23 13:12:50 +09004493 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004494 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4495 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004496 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004497 ensureListEmpty(t, requireNativeLibs)
4498}
4499
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004500func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4501 ctx := testApex(t, `
4502 apex {
4503 name: "myapex",
4504 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004505 native_shared_libs: ["mylib"],
4506 updatable: false,
4507 }
4508
4509 apex_key {
4510 name: "myapex.key",
4511 public_key: "testkey.avbpubkey",
4512 private_key: "testkey.pem",
4513 }
4514
4515 cc_library {
4516 name: "mylib",
4517 srcs: ["mylib.cpp"],
4518 system_shared_libs: [],
4519 stl: "none",
4520 apex_available: [
4521 "//apex_available:platform",
4522 "myapex",
4523 ],
4524 }
4525 `, android.FixtureMergeEnv(map[string]string{
4526 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4527 }))
4528
Jooyung Hana0503a52023-08-23 13:12:50 +09004529 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004530 apexManifestRule := module.Rule("apexManifestRule")
4531 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4532}
4533
Vinh Tran8f5310f2022-10-07 18:16:47 -04004534func TestCompileMultilibProp(t *testing.T) {
4535 testCases := []struct {
4536 compileMultiLibProp string
4537 containedLibs []string
4538 notContainedLibs []string
4539 }{
4540 {
4541 containedLibs: []string{
4542 "image.apex/lib64/mylib.so",
4543 "image.apex/lib/mylib.so",
4544 },
4545 compileMultiLibProp: `compile_multilib: "both",`,
4546 },
4547 {
4548 containedLibs: []string{"image.apex/lib64/mylib.so"},
4549 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4550 compileMultiLibProp: `compile_multilib: "first",`,
4551 },
4552 {
4553 containedLibs: []string{"image.apex/lib64/mylib.so"},
4554 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4555 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4556 },
4557 {
4558 containedLibs: []string{"image.apex/lib64/mylib.so"},
4559 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4560 compileMultiLibProp: `compile_multilib: "64",`,
4561 },
4562 {
4563 containedLibs: []string{"image.apex/lib/mylib.so"},
4564 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4565 compileMultiLibProp: `compile_multilib: "32",`,
4566 },
4567 }
4568 for _, testCase := range testCases {
4569 ctx := testApex(t, fmt.Sprintf(`
4570 apex {
4571 name: "myapex",
4572 key: "myapex.key",
4573 %s
4574 native_shared_libs: ["mylib"],
4575 updatable: false,
4576 }
4577 apex_key {
4578 name: "myapex.key",
4579 public_key: "testkey.avbpubkey",
4580 private_key: "testkey.pem",
4581 }
4582 cc_library {
4583 name: "mylib",
4584 srcs: ["mylib.cpp"],
4585 apex_available: [
4586 "//apex_available:platform",
4587 "myapex",
4588 ],
4589 }
4590 `, testCase.compileMultiLibProp),
4591 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004592 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004593 apexRule := module.Rule("apexRule")
4594 copyCmds := apexRule.Args["copy_commands"]
4595 for _, containedLib := range testCase.containedLibs {
4596 ensureContains(t, copyCmds, containedLib)
4597 }
4598 for _, notContainedLib := range testCase.notContainedLibs {
4599 ensureNotContains(t, copyCmds, notContainedLib)
4600 }
4601 }
4602}
4603
Alex Light0851b882019-02-07 13:20:53 -08004604func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004605 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004606 apex {
4607 name: "myapex",
4608 key: "myapex.key",
4609 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004610 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004611 }
4612
4613 apex_key {
4614 name: "myapex.key",
4615 public_key: "testkey.avbpubkey",
4616 private_key: "testkey.pem",
4617 }
4618
4619 cc_library {
4620 name: "mylib_common",
4621 srcs: ["mylib.cpp"],
4622 system_shared_libs: [],
4623 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004624 apex_available: [
4625 "//apex_available:platform",
4626 "myapex",
4627 ],
Alex Light0851b882019-02-07 13:20:53 -08004628 }
4629 `)
4630
Jooyung Hana0503a52023-08-23 13:12:50 +09004631 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004632 apexRule := module.Rule("apexRule")
4633 copyCmds := apexRule.Args["copy_commands"]
4634
4635 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4636 t.Log("Apex was a test apex!")
4637 t.Fail()
4638 }
4639 // Ensure that main rule creates an output
4640 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4641
4642 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004643 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004644
4645 // Ensure that both direct and indirect deps are copied into apex
4646 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4647
Colin Cross7113d202019-11-20 16:39:12 -08004648 // Ensure that the platform variant ends with _shared
4649 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004650
Colin Cross56a83212020-09-15 18:30:11 -07004651 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004652 t.Log("Found mylib_common not in any apex!")
4653 t.Fail()
4654 }
4655}
4656
4657func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004658 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004659 apex_test {
4660 name: "myapex",
4661 key: "myapex.key",
4662 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004663 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004664 }
4665
4666 apex_key {
4667 name: "myapex.key",
4668 public_key: "testkey.avbpubkey",
4669 private_key: "testkey.pem",
4670 }
4671
4672 cc_library {
4673 name: "mylib_common_test",
4674 srcs: ["mylib.cpp"],
4675 system_shared_libs: [],
4676 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004677 // TODO: remove //apex_available:platform
4678 apex_available: [
4679 "//apex_available:platform",
4680 "myapex",
4681 ],
Alex Light0851b882019-02-07 13:20:53 -08004682 }
4683 `)
4684
Jooyung Hana0503a52023-08-23 13:12:50 +09004685 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004686 apexRule := module.Rule("apexRule")
4687 copyCmds := apexRule.Args["copy_commands"]
4688
4689 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4690 t.Log("Apex was not a test apex!")
4691 t.Fail()
4692 }
4693 // Ensure that main rule creates an output
4694 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4695
4696 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004697 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004698
4699 // Ensure that both direct and indirect deps are copied into apex
4700 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4701
Colin Cross7113d202019-11-20 16:39:12 -08004702 // Ensure that the platform variant ends with _shared
4703 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004704}
4705
Alex Light9670d332019-01-29 18:07:33 -08004706func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004707 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004708 apex {
4709 name: "myapex",
4710 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004711 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004712 multilib: {
4713 first: {
4714 native_shared_libs: ["mylib_common"],
4715 }
4716 },
4717 target: {
4718 android: {
4719 multilib: {
4720 first: {
4721 native_shared_libs: ["mylib"],
4722 }
4723 }
4724 },
4725 host: {
4726 multilib: {
4727 first: {
4728 native_shared_libs: ["mylib2"],
4729 }
4730 }
4731 }
4732 }
4733 }
4734
4735 apex_key {
4736 name: "myapex.key",
4737 public_key: "testkey.avbpubkey",
4738 private_key: "testkey.pem",
4739 }
4740
4741 cc_library {
4742 name: "mylib",
4743 srcs: ["mylib.cpp"],
4744 system_shared_libs: [],
4745 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004746 // TODO: remove //apex_available:platform
4747 apex_available: [
4748 "//apex_available:platform",
4749 "myapex",
4750 ],
Alex Light9670d332019-01-29 18:07:33 -08004751 }
4752
4753 cc_library {
4754 name: "mylib_common",
4755 srcs: ["mylib.cpp"],
4756 system_shared_libs: [],
4757 stl: "none",
4758 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004759 // TODO: remove //apex_available:platform
4760 apex_available: [
4761 "//apex_available:platform",
4762 "myapex",
4763 ],
Alex Light9670d332019-01-29 18:07:33 -08004764 }
4765
4766 cc_library {
4767 name: "mylib2",
4768 srcs: ["mylib.cpp"],
4769 system_shared_libs: [],
4770 stl: "none",
4771 compile_multilib: "first",
4772 }
4773 `)
4774
Jooyung Hana0503a52023-08-23 13:12:50 +09004775 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004776 copyCmds := apexRule.Args["copy_commands"]
4777
4778 // Ensure that main rule creates an output
4779 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4780
4781 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004782 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4783 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4784 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004785
4786 // Ensure that both direct and indirect deps are copied into apex
4787 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4788 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4789 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4790
Colin Cross7113d202019-11-20 16:39:12 -08004791 // Ensure that the platform variant ends with _shared
4792 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4793 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4794 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004795}
Jiyong Park04480cf2019-02-06 00:16:29 +09004796
Jiyong Park59140302020-12-14 18:44:04 +09004797func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004798 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004799 apex {
4800 name: "myapex",
4801 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004802 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004803 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004804 arch: {
4805 arm64: {
4806 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004807 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004808 },
4809 x86_64: {
4810 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004811 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004812 },
4813 }
4814 }
4815
4816 apex_key {
4817 name: "myapex.key",
4818 public_key: "testkey.avbpubkey",
4819 private_key: "testkey.pem",
4820 }
4821
4822 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004823 name: "mylib.generic",
4824 srcs: ["mylib.cpp"],
4825 system_shared_libs: [],
4826 stl: "none",
4827 // TODO: remove //apex_available:platform
4828 apex_available: [
4829 "//apex_available:platform",
4830 "myapex",
4831 ],
4832 }
4833
4834 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004835 name: "mylib.arm64",
4836 srcs: ["mylib.cpp"],
4837 system_shared_libs: [],
4838 stl: "none",
4839 // TODO: remove //apex_available:platform
4840 apex_available: [
4841 "//apex_available:platform",
4842 "myapex",
4843 ],
4844 }
4845
4846 cc_library {
4847 name: "mylib.x64",
4848 srcs: ["mylib.cpp"],
4849 system_shared_libs: [],
4850 stl: "none",
4851 // TODO: remove //apex_available:platform
4852 apex_available: [
4853 "//apex_available:platform",
4854 "myapex",
4855 ],
4856 }
4857 `)
4858
Jooyung Hana0503a52023-08-23 13:12:50 +09004859 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004860 copyCmds := apexRule.Args["copy_commands"]
4861
4862 // Ensure that apex variant is created for the direct dep
4863 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004864 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004865 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4866
4867 // Ensure that both direct and indirect deps are copied into apex
4868 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4869 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4870}
4871
Jiyong Park04480cf2019-02-06 00:16:29 +09004872func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004873 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004874 apex {
4875 name: "myapex",
4876 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004877 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004878 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004879 }
4880
4881 apex_key {
4882 name: "myapex.key",
4883 public_key: "testkey.avbpubkey",
4884 private_key: "testkey.pem",
4885 }
4886
4887 sh_binary {
4888 name: "myscript",
4889 src: "mylib.cpp",
4890 filename: "myscript.sh",
4891 sub_dir: "script",
4892 }
4893 `)
4894
Jooyung Hana0503a52023-08-23 13:12:50 +09004895 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004896 copyCmds := apexRule.Args["copy_commands"]
4897
4898 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4899}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004900
Jooyung Han91df2082019-11-20 01:49:42 +09004901func TestApexInVariousPartition(t *testing.T) {
4902 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004903 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004904 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004905 {"", "system"},
4906 {"product_specific: true", "product"},
4907 {"soc_specific: true", "vendor"},
4908 {"proprietary: true", "vendor"},
4909 {"vendor: true", "vendor"},
4910 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004911 }
4912 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004913 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004914 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004915 apex {
4916 name: "myapex",
4917 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004918 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004919 `+tc.propName+`
4920 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004921
Jooyung Han91df2082019-11-20 01:49:42 +09004922 apex_key {
4923 name: "myapex.key",
4924 public_key: "testkey.avbpubkey",
4925 private_key: "testkey.pem",
4926 }
4927 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004928
Jooyung Hana0503a52023-08-23 13:12:50 +09004929 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004930 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004931 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004932 if actual != expected {
4933 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4934 }
Jooyung Han91df2082019-11-20 01:49:42 +09004935 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004936 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004937}
Jiyong Park67882562019-03-21 01:11:21 +09004938
Jooyung Han580eb4f2020-06-24 19:33:06 +09004939func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004940 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004941 apex {
4942 name: "myapex",
4943 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004944 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004945 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004946
Jooyung Han580eb4f2020-06-24 19:33:06 +09004947 apex_key {
4948 name: "myapex.key",
4949 public_key: "testkey.avbpubkey",
4950 private_key: "testkey.pem",
4951 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004952 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004953 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004954 rule := module.Output("file_contexts")
4955 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4956}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004957
Jooyung Han580eb4f2020-06-24 19:33:06 +09004958func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004959 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004960 apex {
4961 name: "myapex",
4962 key: "myapex.key",
4963 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004964 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004965 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004966
Jooyung Han580eb4f2020-06-24 19:33:06 +09004967 apex_key {
4968 name: "myapex.key",
4969 public_key: "testkey.avbpubkey",
4970 private_key: "testkey.pem",
4971 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004972 `, withFiles(map[string][]byte{
4973 "my_own_file_contexts": nil,
4974 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004975}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004976
Jooyung Han580eb4f2020-06-24 19:33:06 +09004977func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004978 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004979 apex {
4980 name: "myapex",
4981 key: "myapex.key",
4982 product_specific: true,
4983 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004984 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004985 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004986
Jooyung Han580eb4f2020-06-24 19:33:06 +09004987 apex_key {
4988 name: "myapex.key",
4989 public_key: "testkey.avbpubkey",
4990 private_key: "testkey.pem",
4991 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004992 `)
4993
Colin Cross1c460562021-02-16 17:55:47 -08004994 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004995 apex {
4996 name: "myapex",
4997 key: "myapex.key",
4998 product_specific: true,
4999 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005000 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005001 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005002
Jooyung Han580eb4f2020-06-24 19:33:06 +09005003 apex_key {
5004 name: "myapex.key",
5005 public_key: "testkey.avbpubkey",
5006 private_key: "testkey.pem",
5007 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005008 `, withFiles(map[string][]byte{
5009 "product_specific_file_contexts": nil,
5010 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005011 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005012 rule := module.Output("file_contexts")
5013 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5014}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005015
Jooyung Han580eb4f2020-06-24 19:33:06 +09005016func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005017 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005018 apex {
5019 name: "myapex",
5020 key: "myapex.key",
5021 product_specific: true,
5022 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005023 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005024 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005025
Jooyung Han580eb4f2020-06-24 19:33:06 +09005026 apex_key {
5027 name: "myapex.key",
5028 public_key: "testkey.avbpubkey",
5029 private_key: "testkey.pem",
5030 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005031
Jooyung Han580eb4f2020-06-24 19:33:06 +09005032 filegroup {
5033 name: "my-file-contexts",
5034 srcs: ["product_specific_file_contexts"],
5035 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005036 `, withFiles(map[string][]byte{
5037 "product_specific_file_contexts": nil,
5038 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005039 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005040 rule := module.Output("file_contexts")
5041 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005042}
5043
Jiyong Park67882562019-03-21 01:11:21 +09005044func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005045 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005046 apex_key {
5047 name: "myapex.key",
5048 public_key: ":my.avbpubkey",
5049 private_key: ":my.pem",
5050 product_specific: true,
5051 }
5052
5053 filegroup {
5054 name: "my.avbpubkey",
5055 srcs: ["testkey2.avbpubkey"],
5056 }
5057
5058 filegroup {
5059 name: "my.pem",
5060 srcs: ["testkey2.pem"],
5061 }
5062 `)
5063
5064 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5065 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005066 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005067 if actual_pubkey != expected_pubkey {
5068 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5069 }
5070 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005071 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005072 if actual_privkey != expected_privkey {
5073 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5074 }
5075}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005076
5077func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005078 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005079 prebuilt_apex {
5080 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005081 arch: {
5082 arm64: {
5083 src: "myapex-arm64.apex",
5084 },
5085 arm: {
5086 src: "myapex-arm.apex",
5087 },
5088 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005089 }
5090 `)
5091
Wei Li340ee8e2022-03-18 17:33:24 -07005092 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5093 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005094
Jiyong Parkc95714e2019-03-29 14:23:10 +09005095 expectedInput := "myapex-arm64.apex"
5096 if prebuilt.inputApex.String() != expectedInput {
5097 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5098 }
Wei Li340ee8e2022-03-18 17:33:24 -07005099 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5100 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5101 rule := testingModule.Rule("genProvenanceMetaData")
5102 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5103 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5104 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5105 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005106
5107 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5108 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005109}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005110
Paul Duffinc0609c62021-03-01 17:27:16 +00005111func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005112 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005113 prebuilt_apex {
5114 name: "myapex",
5115 }
5116 `)
5117}
5118
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005119func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005120 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005121 prebuilt_apex {
5122 name: "myapex",
5123 src: "myapex-arm.apex",
5124 filename: "notmyapex.apex",
5125 }
5126 `)
5127
Wei Li340ee8e2022-03-18 17:33:24 -07005128 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5129 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005130
5131 expected := "notmyapex.apex"
5132 if p.installFilename != expected {
5133 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5134 }
Wei Li340ee8e2022-03-18 17:33:24 -07005135 rule := testingModule.Rule("genProvenanceMetaData")
5136 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5137 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5138 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5139 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005140}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005141
Samiul Islam7c02e262021-09-08 17:48:28 +01005142func TestApexSetFilenameOverride(t *testing.T) {
5143 testApex(t, `
5144 apex_set {
5145 name: "com.company.android.myapex",
5146 apex_name: "com.android.myapex",
5147 set: "company-myapex.apks",
5148 filename: "com.company.android.myapex.apex"
5149 }
5150 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5151
5152 testApex(t, `
5153 apex_set {
5154 name: "com.company.android.myapex",
5155 apex_name: "com.android.myapex",
5156 set: "company-myapex.apks",
5157 filename: "com.company.android.myapex.capex"
5158 }
5159 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5160
5161 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5162 apex_set {
5163 name: "com.company.android.myapex",
5164 apex_name: "com.android.myapex",
5165 set: "company-myapex.apks",
5166 filename: "some-random-suffix"
5167 }
5168 `)
5169}
5170
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005171func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005172 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005173 prebuilt_apex {
5174 name: "myapex.prebuilt",
5175 src: "myapex-arm.apex",
5176 overrides: [
5177 "myapex",
5178 ],
5179 }
5180 `)
5181
Wei Li340ee8e2022-03-18 17:33:24 -07005182 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5183 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005184
5185 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005186 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005187 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005188 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005189 }
Wei Li340ee8e2022-03-18 17:33:24 -07005190 rule := testingModule.Rule("genProvenanceMetaData")
5191 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5192 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5193 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5194 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005195}
5196
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005197func TestPrebuiltApexName(t *testing.T) {
5198 testApex(t, `
5199 prebuilt_apex {
5200 name: "com.company.android.myapex",
5201 apex_name: "com.android.myapex",
5202 src: "company-myapex-arm.apex",
5203 }
5204 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5205
5206 testApex(t, `
5207 apex_set {
5208 name: "com.company.android.myapex",
5209 apex_name: "com.android.myapex",
5210 set: "company-myapex.apks",
5211 }
5212 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5213}
5214
5215func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5216 _ = android.GroupFixturePreparers(
5217 java.PrepareForTestWithJavaDefaultModules,
5218 PrepareForTestWithApexBuildComponents,
5219 android.FixtureWithRootAndroidBp(`
5220 platform_bootclasspath {
5221 name: "platform-bootclasspath",
5222 fragments: [
5223 {
5224 apex: "com.android.art",
5225 module: "art-bootclasspath-fragment",
5226 },
5227 ],
5228 }
5229
5230 prebuilt_apex {
5231 name: "com.company.android.art",
5232 apex_name: "com.android.art",
5233 src: "com.company.android.art-arm.apex",
5234 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5235 }
5236
5237 prebuilt_bootclasspath_fragment {
5238 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005239 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005240 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005241 hidden_api: {
5242 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5243 metadata: "my-bootclasspath-fragment/metadata.csv",
5244 index: "my-bootclasspath-fragment/index.csv",
5245 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5246 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5247 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005248 }
5249
5250 java_import {
5251 name: "core-oj",
5252 jars: ["prebuilt.jar"],
5253 }
5254 `),
5255 ).RunTest(t)
5256}
5257
Paul Duffin092153d2021-01-26 11:42:39 +00005258// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5259// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005260func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005261 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005262
Paul Duffin89886cb2021-02-05 16:44:03 +00005263 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005264 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005265 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005266 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005267 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005268 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005269 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5270 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5271 android.NormalizePathForTesting(dexJarBuildPath))
5272 }
5273
5274 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005275 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005276 // Make sure the import has been given the correct path to the dex jar.
5277 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5278 dexJarBuildPath := p.DexJarInstallPath()
5279 stem := android.RemoveOptionalPrebuiltPrefix(name)
5280 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5281 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5282 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005283 }
5284
Paul Duffin39853512021-02-26 11:09:39 +00005285 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005286 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005287 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005288 android.AssertArrayString(t, "Check if there is no source variant",
5289 []string{"android_common"},
5290 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005291 }
5292
5293 t.Run("prebuilt only", func(t *testing.T) {
5294 bp := `
5295 prebuilt_apex {
5296 name: "myapex",
5297 arch: {
5298 arm64: {
5299 src: "myapex-arm64.apex",
5300 },
5301 arm: {
5302 src: "myapex-arm.apex",
5303 },
5304 },
Paul Duffin39853512021-02-26 11:09:39 +00005305 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005306 }
5307
5308 java_import {
5309 name: "libfoo",
5310 jars: ["libfoo.jar"],
5311 }
Paul Duffin39853512021-02-26 11:09:39 +00005312
5313 java_sdk_library_import {
5314 name: "libbar",
5315 public: {
5316 jars: ["libbar.jar"],
5317 },
5318 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005319 `
5320
5321 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5322 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5323
Martin Stjernholm44825602021-09-17 01:44:12 +01005324 deapexerName := deapexerModuleName("myapex")
5325 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5326
Paul Duffinf6932af2021-02-26 18:21:56 +00005327 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005328 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005329 rule := deapexer.Rule("deapexer")
5330 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5331 t.Errorf("expected: %q, found: %q", expected, actual)
5332 }
5333
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005334 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005335 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005336 rule = prebuiltApex.Rule("android/soong/android.Cp")
5337 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5338 t.Errorf("expected: %q, found: %q", expected, actual)
5339 }
5340
Paul Duffin89886cb2021-02-05 16:44:03 +00005341 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005342 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005343
5344 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005345 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005346 })
5347
5348 t.Run("prebuilt with source preferred", func(t *testing.T) {
5349
5350 bp := `
5351 prebuilt_apex {
5352 name: "myapex",
5353 arch: {
5354 arm64: {
5355 src: "myapex-arm64.apex",
5356 },
5357 arm: {
5358 src: "myapex-arm.apex",
5359 },
5360 },
Paul Duffin39853512021-02-26 11:09:39 +00005361 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005362 }
5363
5364 java_import {
5365 name: "libfoo",
5366 jars: ["libfoo.jar"],
5367 }
5368
5369 java_library {
5370 name: "libfoo",
5371 }
Paul Duffin39853512021-02-26 11:09:39 +00005372
5373 java_sdk_library_import {
5374 name: "libbar",
5375 public: {
5376 jars: ["libbar.jar"],
5377 },
5378 }
5379
5380 java_sdk_library {
5381 name: "libbar",
5382 srcs: ["foo/bar/MyClass.java"],
5383 unsafe_ignore_missing_latest_api: true,
5384 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005385 `
5386
5387 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5388 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5389
Paul Duffin89886cb2021-02-05 16:44:03 +00005390 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005391 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005392 ensureNoSourceVariant(t, ctx, "libfoo")
5393
5394 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005395 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005396 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005397 })
5398
5399 t.Run("prebuilt preferred with source", func(t *testing.T) {
5400 bp := `
5401 prebuilt_apex {
5402 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005403 arch: {
5404 arm64: {
5405 src: "myapex-arm64.apex",
5406 },
5407 arm: {
5408 src: "myapex-arm.apex",
5409 },
5410 },
Paul Duffin39853512021-02-26 11:09:39 +00005411 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005412 }
5413
5414 java_import {
5415 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005416 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005417 jars: ["libfoo.jar"],
5418 }
5419
5420 java_library {
5421 name: "libfoo",
5422 }
Paul Duffin39853512021-02-26 11:09:39 +00005423
5424 java_sdk_library_import {
5425 name: "libbar",
5426 prefer: true,
5427 public: {
5428 jars: ["libbar.jar"],
5429 },
5430 }
5431
5432 java_sdk_library {
5433 name: "libbar",
5434 srcs: ["foo/bar/MyClass.java"],
5435 unsafe_ignore_missing_latest_api: true,
5436 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005437 `
5438
5439 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5440 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5441
Paul Duffin89886cb2021-02-05 16:44:03 +00005442 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005443 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005444 ensureNoSourceVariant(t, ctx, "libfoo")
5445
5446 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005447 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005448 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005449 })
5450}
5451
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005452func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005453 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005454 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005455 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5456 // is disabled.
5457 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5458 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005459
Paul Duffin37856732021-02-26 14:24:15 +00005460 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5461 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005462 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005463 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005464 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005465 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005466 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005467 foundLibfooJar = true
5468 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005469 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005470 }
5471 }
5472 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005473 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 +00005474 }
5475 }
5476
Paul Duffin40a3f652021-07-19 13:11:24 +01005477 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005478 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005479 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005480 var rule android.TestingBuildParams
5481
5482 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5483 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005484 }
5485
Paul Duffin40a3f652021-07-19 13:11:24 +01005486 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5487 t.Helper()
5488 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5489 var rule android.TestingBuildParams
5490
5491 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5492 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5493 }
5494
Paul Duffin89f570a2021-06-16 01:42:33 +01005495 fragment := java.ApexVariantReference{
5496 Apex: proptools.StringPtr("myapex"),
5497 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5498 }
5499
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005500 t.Run("prebuilt only", func(t *testing.T) {
5501 bp := `
5502 prebuilt_apex {
5503 name: "myapex",
5504 arch: {
5505 arm64: {
5506 src: "myapex-arm64.apex",
5507 },
5508 arm: {
5509 src: "myapex-arm.apex",
5510 },
5511 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005512 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5513 }
5514
5515 prebuilt_bootclasspath_fragment {
5516 name: "my-bootclasspath-fragment",
5517 contents: ["libfoo", "libbar"],
5518 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005519 hidden_api: {
5520 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5521 metadata: "my-bootclasspath-fragment/metadata.csv",
5522 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005523 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5524 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5525 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005526 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005527 }
5528
5529 java_import {
5530 name: "libfoo",
5531 jars: ["libfoo.jar"],
5532 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005533 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005534 }
Paul Duffin37856732021-02-26 14:24:15 +00005535
5536 java_sdk_library_import {
5537 name: "libbar",
5538 public: {
5539 jars: ["libbar.jar"],
5540 },
5541 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005542 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005543 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005544 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005545 `
5546
Paul Duffin89f570a2021-06-16 01:42:33 +01005547 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005548 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5549 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005550
Paul Duffin537ea3d2021-05-14 10:38:00 +01005551 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005552 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005553 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005554 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005555 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005556 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005557 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005558 })
5559
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005560 t.Run("apex_set only", func(t *testing.T) {
5561 bp := `
5562 apex_set {
5563 name: "myapex",
5564 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005565 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005566 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005567 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5568 }
5569
5570 java_import {
5571 name: "myjavalib",
5572 jars: ["myjavalib.jar"],
5573 apex_available: ["myapex"],
5574 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005575 }
5576
5577 prebuilt_bootclasspath_fragment {
5578 name: "my-bootclasspath-fragment",
5579 contents: ["libfoo", "libbar"],
5580 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005581 hidden_api: {
5582 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5583 metadata: "my-bootclasspath-fragment/metadata.csv",
5584 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005585 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5586 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5587 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005588 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005589 }
5590
Liz Kammer2dc72442023-04-20 10:10:48 -04005591 prebuilt_systemserverclasspath_fragment {
5592 name: "my-systemserverclasspath-fragment",
5593 contents: ["libbaz"],
5594 apex_available: ["myapex"],
5595 }
5596
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005597 java_import {
5598 name: "libfoo",
5599 jars: ["libfoo.jar"],
5600 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005601 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005602 }
5603
5604 java_sdk_library_import {
5605 name: "libbar",
5606 public: {
5607 jars: ["libbar.jar"],
5608 },
5609 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005610 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005611 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005612 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005613
5614 java_sdk_library_import {
5615 name: "libbaz",
5616 public: {
5617 jars: ["libbaz.jar"],
5618 },
5619 apex_available: ["myapex"],
5620 shared_library: false,
5621 permitted_packages: ["baz"],
5622 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005623 `
5624
Paul Duffin89f570a2021-06-16 01:42:33 +01005625 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005626 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5627 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5628
Paul Duffin537ea3d2021-05-14 10:38:00 +01005629 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005630 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005631 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005632 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005633 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005634 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005635 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005636
5637 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5638
5639 overrideNames := []string{
5640 "",
5641 "myjavalib.myapex",
5642 "libfoo.myapex",
5643 "libbar.myapex",
5644 "libbaz.myapex",
5645 }
5646 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5647 for i, e := range mkEntries {
5648 g := e.OverrideName
5649 if w := overrideNames[i]; w != g {
5650 t.Errorf("Expected override name %q, got %q", w, g)
5651 }
5652 }
5653
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005654 })
5655
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005656 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5657 bp := `
5658 prebuilt_apex {
5659 name: "myapex",
5660 arch: {
5661 arm64: {
5662 src: "myapex-arm64.apex",
5663 },
5664 arm: {
5665 src: "myapex-arm.apex",
5666 },
5667 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005668 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5669 }
5670
5671 prebuilt_bootclasspath_fragment {
5672 name: "my-bootclasspath-fragment",
5673 contents: ["libfoo", "libbar"],
5674 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005675 hidden_api: {
5676 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5677 metadata: "my-bootclasspath-fragment/metadata.csv",
5678 index: "my-bootclasspath-fragment/index.csv",
5679 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5680 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5681 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005682 }
5683
5684 java_import {
5685 name: "libfoo",
5686 jars: ["libfoo.jar"],
5687 apex_available: ["myapex"],
5688 }
5689
5690 java_library {
5691 name: "libfoo",
5692 srcs: ["foo/bar/MyClass.java"],
5693 apex_available: ["myapex"],
5694 }
Paul Duffin37856732021-02-26 14:24:15 +00005695
5696 java_sdk_library_import {
5697 name: "libbar",
5698 public: {
5699 jars: ["libbar.jar"],
5700 },
5701 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005702 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005703 }
5704
5705 java_sdk_library {
5706 name: "libbar",
5707 srcs: ["foo/bar/MyClass.java"],
5708 unsafe_ignore_missing_latest_api: true,
5709 apex_available: ["myapex"],
5710 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005711 `
5712
5713 // In this test the source (java_library) libfoo is active since the
5714 // prebuilt (java_import) defaults to prefer:false. However the
5715 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5716 // find the dex boot jar in it. We either need to disable the source libfoo
5717 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005718 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005719 // dexbootjar check is skipped if AllowMissingDependencies is true
5720 preparerAllowMissingDeps := android.GroupFixturePreparers(
5721 preparer,
5722 android.PrepareForTestWithAllowMissingDependencies,
5723 )
5724 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005725 })
5726
5727 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5728 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005729 apex {
5730 name: "myapex",
5731 key: "myapex.key",
5732 updatable: false,
5733 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5734 }
5735
5736 apex_key {
5737 name: "myapex.key",
5738 public_key: "testkey.avbpubkey",
5739 private_key: "testkey.pem",
5740 }
5741
5742 bootclasspath_fragment {
5743 name: "my-bootclasspath-fragment",
5744 contents: ["libfoo", "libbar"],
5745 apex_available: ["myapex"],
5746 hidden_api: {
5747 split_packages: ["*"],
5748 },
5749 }
5750
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005751 prebuilt_apex {
5752 name: "myapex",
5753 arch: {
5754 arm64: {
5755 src: "myapex-arm64.apex",
5756 },
5757 arm: {
5758 src: "myapex-arm.apex",
5759 },
5760 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005761 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5762 }
5763
5764 prebuilt_bootclasspath_fragment {
5765 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005766 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005767 contents: ["libfoo", "libbar"],
5768 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005769 hidden_api: {
5770 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5771 metadata: "my-bootclasspath-fragment/metadata.csv",
5772 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005773 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5774 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5775 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005776 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005777 }
5778
5779 java_import {
5780 name: "libfoo",
5781 prefer: true,
5782 jars: ["libfoo.jar"],
5783 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005784 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005785 }
5786
5787 java_library {
5788 name: "libfoo",
5789 srcs: ["foo/bar/MyClass.java"],
5790 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005791 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005792 }
Paul Duffin37856732021-02-26 14:24:15 +00005793
5794 java_sdk_library_import {
5795 name: "libbar",
5796 prefer: true,
5797 public: {
5798 jars: ["libbar.jar"],
5799 },
5800 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005801 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005802 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005803 }
5804
5805 java_sdk_library {
5806 name: "libbar",
5807 srcs: ["foo/bar/MyClass.java"],
5808 unsafe_ignore_missing_latest_api: true,
5809 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005810 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005811 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005812 `
5813
Paul Duffin89f570a2021-06-16 01:42:33 +01005814 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005815 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5816 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005817
Paul Duffin537ea3d2021-05-14 10:38:00 +01005818 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005819 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005820 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005821 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005822 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005823 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005824 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005825 })
5826
5827 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5828 bp := `
5829 apex {
5830 name: "myapex",
5831 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005832 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005833 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005834 }
5835
5836 apex_key {
5837 name: "myapex.key",
5838 public_key: "testkey.avbpubkey",
5839 private_key: "testkey.pem",
5840 }
5841
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005842 bootclasspath_fragment {
5843 name: "my-bootclasspath-fragment",
5844 contents: ["libfoo", "libbar"],
5845 apex_available: ["myapex"],
5846 hidden_api: {
5847 split_packages: ["*"],
5848 },
5849 }
5850
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005851 prebuilt_apex {
5852 name: "myapex",
5853 arch: {
5854 arm64: {
5855 src: "myapex-arm64.apex",
5856 },
5857 arm: {
5858 src: "myapex-arm.apex",
5859 },
5860 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005861 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5862 }
5863
5864 prebuilt_bootclasspath_fragment {
5865 name: "my-bootclasspath-fragment",
5866 contents: ["libfoo", "libbar"],
5867 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005868 hidden_api: {
5869 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5870 metadata: "my-bootclasspath-fragment/metadata.csv",
5871 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005872 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5873 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5874 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005875 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005876 }
5877
5878 java_import {
5879 name: "libfoo",
5880 jars: ["libfoo.jar"],
5881 apex_available: ["myapex"],
5882 }
5883
5884 java_library {
5885 name: "libfoo",
5886 srcs: ["foo/bar/MyClass.java"],
5887 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005888 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005889 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005890 }
Paul Duffin37856732021-02-26 14:24:15 +00005891
5892 java_sdk_library_import {
5893 name: "libbar",
5894 public: {
5895 jars: ["libbar.jar"],
5896 },
5897 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005898 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005899 }
5900
5901 java_sdk_library {
5902 name: "libbar",
5903 srcs: ["foo/bar/MyClass.java"],
5904 unsafe_ignore_missing_latest_api: true,
5905 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005906 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005907 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005908 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005909 `
5910
Paul Duffin89f570a2021-06-16 01:42:33 +01005911 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005912 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5913 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005914
Paul Duffin537ea3d2021-05-14 10:38:00 +01005915 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005916 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005917 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5918 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005919 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5920 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005921 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005922 })
5923
5924 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5925 bp := `
5926 apex {
5927 name: "myapex",
5928 enabled: false,
5929 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005930 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005931 }
5932
5933 apex_key {
5934 name: "myapex.key",
5935 public_key: "testkey.avbpubkey",
5936 private_key: "testkey.pem",
5937 }
5938
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005939 bootclasspath_fragment {
5940 name: "my-bootclasspath-fragment",
5941 enabled: false,
5942 contents: ["libfoo", "libbar"],
5943 apex_available: ["myapex"],
5944 hidden_api: {
5945 split_packages: ["*"],
5946 },
5947 }
5948
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005949 prebuilt_apex {
5950 name: "myapex",
5951 arch: {
5952 arm64: {
5953 src: "myapex-arm64.apex",
5954 },
5955 arm: {
5956 src: "myapex-arm.apex",
5957 },
5958 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005959 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5960 }
5961
5962 prebuilt_bootclasspath_fragment {
5963 name: "my-bootclasspath-fragment",
5964 contents: ["libfoo", "libbar"],
5965 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005966 hidden_api: {
5967 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5968 metadata: "my-bootclasspath-fragment/metadata.csv",
5969 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005970 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5971 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5972 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005973 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005974 }
5975
5976 java_import {
5977 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005978 jars: ["libfoo.jar"],
5979 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005980 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005981 }
5982
5983 java_library {
5984 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005985 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005986 srcs: ["foo/bar/MyClass.java"],
5987 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005988 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005989 }
Paul Duffin37856732021-02-26 14:24:15 +00005990
5991 java_sdk_library_import {
5992 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005993 public: {
5994 jars: ["libbar.jar"],
5995 },
5996 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005997 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005998 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005999 }
6000
6001 java_sdk_library {
6002 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006003 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00006004 srcs: ["foo/bar/MyClass.java"],
6005 unsafe_ignore_missing_latest_api: true,
6006 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006007 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006008 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006009 `
6010
Paul Duffin89f570a2021-06-16 01:42:33 +01006011 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01006012 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6013 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006014
Paul Duffin537ea3d2021-05-14 10:38:00 +01006015 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006016 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006017 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006018 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006019 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006020 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006021 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006022 })
6023}
6024
Roland Levillain630846d2019-06-26 12:48:34 +01006025func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006026 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006027 apex_test {
6028 name: "myapex",
6029 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006030 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006031 tests: [
6032 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006033 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006034 ],
6035 }
6036
6037 apex_key {
6038 name: "myapex.key",
6039 public_key: "testkey.avbpubkey",
6040 private_key: "testkey.pem",
6041 }
6042
Liz Kammer1c14a212020-05-12 15:26:55 -07006043 filegroup {
6044 name: "fg",
6045 srcs: [
6046 "baz",
6047 "bar/baz"
6048 ],
6049 }
6050
Roland Levillain630846d2019-06-26 12:48:34 +01006051 cc_test {
6052 name: "mytest",
6053 gtest: false,
6054 srcs: ["mytest.cpp"],
6055 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006056 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006057 system_shared_libs: [],
6058 static_executable: true,
6059 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006060 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006061 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006062
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006063 cc_library {
6064 name: "mylib",
6065 srcs: ["mylib.cpp"],
6066 system_shared_libs: [],
6067 stl: "none",
6068 }
6069
Liz Kammer5bd365f2020-05-27 15:15:11 -07006070 filegroup {
6071 name: "fg2",
6072 srcs: [
6073 "testdata/baz"
6074 ],
6075 }
6076
Roland Levillain9b5fde92019-06-28 15:41:19 +01006077 cc_test {
6078 name: "mytests",
6079 gtest: false,
6080 srcs: [
6081 "mytest1.cpp",
6082 "mytest2.cpp",
6083 "mytest3.cpp",
6084 ],
6085 test_per_src: true,
6086 relative_install_path: "test",
6087 system_shared_libs: [],
6088 static_executable: true,
6089 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006090 data: [
6091 ":fg",
6092 ":fg2",
6093 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006094 }
Roland Levillain630846d2019-06-26 12:48:34 +01006095 `)
6096
Jooyung Hana0503a52023-08-23 13:12:50 +09006097 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006098 copyCmds := apexRule.Args["copy_commands"]
6099
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006100 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006101 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006102 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006103
Liz Kammer1c14a212020-05-12 15:26:55 -07006104 //Ensure that test data are copied into apex.
6105 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6106 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6107
Roland Levillain9b5fde92019-06-28 15:41:19 +01006108 // Ensure that test deps built with `test_per_src` are copied into apex.
6109 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6110 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6111 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006112
6113 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006114 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006115 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006116 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006117 prefix := "TARGET_"
6118 var builder strings.Builder
6119 data.Custom(&builder, name, prefix, "", data)
6120 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006121 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6122 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6123 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6124 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006125 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006126}
6127
Jooyung Hand48f3c32019-08-23 11:18:57 +09006128func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6129 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6130 apex {
6131 name: "myapex",
6132 key: "myapex.key",
6133 native_shared_libs: ["libfoo"],
6134 }
6135
6136 apex_key {
6137 name: "myapex.key",
6138 public_key: "testkey.avbpubkey",
6139 private_key: "testkey.pem",
6140 }
6141
6142 cc_library {
6143 name: "libfoo",
6144 stl: "none",
6145 system_shared_libs: [],
6146 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006147 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006148 }
6149 `)
6150 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6151 apex {
6152 name: "myapex",
6153 key: "myapex.key",
6154 java_libs: ["myjar"],
6155 }
6156
6157 apex_key {
6158 name: "myapex.key",
6159 public_key: "testkey.avbpubkey",
6160 private_key: "testkey.pem",
6161 }
6162
6163 java_library {
6164 name: "myjar",
6165 srcs: ["foo/bar/MyClass.java"],
6166 sdk_version: "none",
6167 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006168 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006169 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006170 }
6171 `)
6172}
6173
Bill Peckhama41a6962021-01-11 10:58:54 -08006174func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006175 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006176 apex {
6177 name: "myapex",
6178 key: "myapex.key",
6179 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006180 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006181 }
6182
6183 apex_key {
6184 name: "myapex.key",
6185 public_key: "testkey.avbpubkey",
6186 private_key: "testkey.pem",
6187 }
6188
6189 java_import {
6190 name: "myjavaimport",
6191 apex_available: ["myapex"],
6192 jars: ["my.jar"],
6193 compile_dex: true,
6194 }
6195 `)
6196
Jooyung Hana0503a52023-08-23 13:12:50 +09006197 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006198 apexRule := module.Rule("apexRule")
6199 copyCmds := apexRule.Args["copy_commands"]
6200 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6201}
6202
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006203func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006204 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006205 apex {
6206 name: "myapex",
6207 key: "myapex.key",
6208 apps: [
6209 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006210 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006211 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006212 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006213 }
6214
6215 apex_key {
6216 name: "myapex.key",
6217 public_key: "testkey.avbpubkey",
6218 private_key: "testkey.pem",
6219 }
6220
6221 android_app {
6222 name: "AppFoo",
6223 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006224 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006225 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006226 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006227 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006228 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006229 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006230
6231 android_app {
6232 name: "AppFooPriv",
6233 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006234 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006235 system_modules: "none",
6236 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006237 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006238 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006239 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006240 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006241
6242 cc_library_shared {
6243 name: "libjni",
6244 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006245 shared_libs: ["libfoo"],
6246 stl: "none",
6247 system_shared_libs: [],
6248 apex_available: [ "myapex" ],
6249 sdk_version: "current",
6250 }
6251
6252 cc_library_shared {
6253 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006254 stl: "none",
6255 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006256 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006257 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006258 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006259 `)
6260
Jooyung Hana0503a52023-08-23 13:12:50 +09006261 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006262 apexRule := module.Rule("apexRule")
6263 copyCmds := apexRule.Args["copy_commands"]
6264
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006265 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6266 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006267 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006268
Colin Crossaede88c2020-08-11 12:17:01 -07006269 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006270 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006271 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006272 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006273 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006274 // JNI libraries including transitive deps are
6275 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006276 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006277 // ... embedded inside APK (jnilibs.zip)
6278 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6279 // ... and not directly inside the APEX
6280 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6281 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006282
6283 apexBundle := module.Module().(*apexBundle)
6284 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6285 var builder strings.Builder
6286 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6287 androidMk := builder.String()
6288 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6289 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6290 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6291 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6292 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6293 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 +01006294}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006295
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006296func TestApexWithAppImportBuildId(t *testing.T) {
6297 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6298 for _, id := range invalidBuildIds {
6299 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6300 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6301 variables.BuildId = proptools.StringPtr(id)
6302 })
6303 testApexError(t, message, `apex {
6304 name: "myapex",
6305 key: "myapex.key",
6306 apps: ["AppFooPrebuilt"],
6307 updatable: false,
6308 }
6309
6310 apex_key {
6311 name: "myapex.key",
6312 public_key: "testkey.avbpubkey",
6313 private_key: "testkey.pem",
6314 }
6315
6316 android_app_import {
6317 name: "AppFooPrebuilt",
6318 apk: "PrebuiltAppFoo.apk",
6319 presigned: true,
6320 apex_available: ["myapex"],
6321 }
6322 `, fixture)
6323 }
6324}
6325
Dario Frenicde2a032019-10-27 00:29:22 +01006326func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006327 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006328 apex {
6329 name: "myapex",
6330 key: "myapex.key",
6331 apps: [
6332 "AppFooPrebuilt",
6333 "AppFooPrivPrebuilt",
6334 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006335 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006336 }
6337
6338 apex_key {
6339 name: "myapex.key",
6340 public_key: "testkey.avbpubkey",
6341 private_key: "testkey.pem",
6342 }
6343
6344 android_app_import {
6345 name: "AppFooPrebuilt",
6346 apk: "PrebuiltAppFoo.apk",
6347 presigned: true,
6348 dex_preopt: {
6349 enabled: false,
6350 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006351 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006352 }
6353
6354 android_app_import {
6355 name: "AppFooPrivPrebuilt",
6356 apk: "PrebuiltAppFooPriv.apk",
6357 privileged: true,
6358 presigned: true,
6359 dex_preopt: {
6360 enabled: false,
6361 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006362 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006363 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006364 }
6365 `)
6366
Jooyung Hana0503a52023-08-23 13:12:50 +09006367 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006368 apexRule := module.Rule("apexRule")
6369 copyCmds := apexRule.Args["copy_commands"]
6370
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006371 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6372 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006373}
6374
6375func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006376 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006377 apex {
6378 name: "myapex",
6379 key: "myapex.key",
6380 apps: [
6381 "AppFoo",
6382 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006383 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006384 }
6385
6386 apex_key {
6387 name: "myapex.key",
6388 public_key: "testkey.avbpubkey",
6389 private_key: "testkey.pem",
6390 }
6391
6392 android_app {
6393 name: "AppFoo",
6394 srcs: ["foo/bar/MyClass.java"],
6395 sdk_version: "none",
6396 system_modules: "none",
6397 apex_available: [ "myapex" ],
6398 }
6399
6400 android_app_import {
6401 name: "AppFoo",
6402 apk: "AppFooPrebuilt.apk",
6403 filename: "AppFooPrebuilt.apk",
6404 presigned: true,
6405 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006406 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006407 }
6408 `, withFiles(map[string][]byte{
6409 "AppFooPrebuilt.apk": nil,
6410 }))
6411
Jooyung Hana0503a52023-08-23 13:12:50 +09006412 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006413 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006414 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006415}
6416
Dario Freni6f3937c2019-12-20 22:58:03 +00006417func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006418 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006419 apex {
6420 name: "myapex",
6421 key: "myapex.key",
6422 apps: [
6423 "TesterHelpAppFoo",
6424 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006425 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006426 }
6427
6428 apex_key {
6429 name: "myapex.key",
6430 public_key: "testkey.avbpubkey",
6431 private_key: "testkey.pem",
6432 }
6433
6434 android_test_helper_app {
6435 name: "TesterHelpAppFoo",
6436 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006437 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006438 }
6439
6440 `)
6441
Jooyung Hana0503a52023-08-23 13:12:50 +09006442 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006443 apexRule := module.Rule("apexRule")
6444 copyCmds := apexRule.Args["copy_commands"]
6445
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006446 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006447}
6448
Jooyung Han18020ea2019-11-13 10:50:48 +09006449func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6450 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006451 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006452 apex {
6453 name: "myapex",
6454 key: "myapex.key",
6455 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006456 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006457 }
6458
6459 apex_key {
6460 name: "myapex.key",
6461 public_key: "testkey.avbpubkey",
6462 private_key: "testkey.pem",
6463 }
6464
6465 apex {
6466 name: "otherapex",
6467 key: "myapex.key",
6468 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006469 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006470 }
6471
6472 cc_defaults {
6473 name: "libfoo-defaults",
6474 apex_available: ["otherapex"],
6475 }
6476
6477 cc_library {
6478 name: "libfoo",
6479 defaults: ["libfoo-defaults"],
6480 stl: "none",
6481 system_shared_libs: [],
6482 }`)
6483}
6484
Paul Duffine52e66f2020-03-30 17:54:29 +01006485func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006486 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006487 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006488 apex {
6489 name: "myapex",
6490 key: "myapex.key",
6491 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006492 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006493 }
6494
6495 apex_key {
6496 name: "myapex.key",
6497 public_key: "testkey.avbpubkey",
6498 private_key: "testkey.pem",
6499 }
6500
6501 apex {
6502 name: "otherapex",
6503 key: "otherapex.key",
6504 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006505 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006506 }
6507
6508 apex_key {
6509 name: "otherapex.key",
6510 public_key: "testkey.avbpubkey",
6511 private_key: "testkey.pem",
6512 }
6513
6514 cc_library {
6515 name: "libfoo",
6516 stl: "none",
6517 system_shared_libs: [],
6518 apex_available: ["otherapex"],
6519 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006520}
Jiyong Park127b40b2019-09-30 16:04:35 +09006521
Paul Duffine52e66f2020-03-30 17:54:29 +01006522func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006523 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006524 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006525.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006526.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006527.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006528.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006529.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006530.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006531 apex {
6532 name: "myapex",
6533 key: "myapex.key",
6534 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006535 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006536 }
6537
6538 apex_key {
6539 name: "myapex.key",
6540 public_key: "testkey.avbpubkey",
6541 private_key: "testkey.pem",
6542 }
6543
Jiyong Park127b40b2019-09-30 16:04:35 +09006544 cc_library {
6545 name: "libfoo",
6546 stl: "none",
6547 shared_libs: ["libbar"],
6548 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006549 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006550 }
6551
6552 cc_library {
6553 name: "libbar",
6554 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006555 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006556 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006557 apex_available: ["myapex"],
6558 }
6559
6560 cc_library {
6561 name: "libbaz",
6562 stl: "none",
6563 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006564 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006565}
Jiyong Park127b40b2019-09-30 16:04:35 +09006566
Liz Kammer5f108fa2023-05-11 14:33:17 -04006567func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6568 testApex(t, `
6569 apex {
6570 name: "myapex",
6571 key: "myapex.key",
6572 native_shared_libs: ["libfoo"],
6573 updatable: false,
6574 }
6575
6576 apex_key {
6577 name: "myapex.key",
6578 public_key: "testkey.avbpubkey",
6579 private_key: "testkey.pem",
6580 }
6581
6582 cc_library {
6583 name: "libfoo",
6584 stl: "none",
6585 static_libs: ["libbar"],
6586 system_shared_libs: [],
6587 apex_available: ["myapex"],
6588 }
6589
6590 cc_library {
6591 name: "libbar",
6592 stl: "none",
6593 shared_libs: ["libbaz"],
6594 system_shared_libs: [],
6595 apex_available: ["myapex"],
6596 }
6597
6598 cc_library {
6599 name: "libbaz",
6600 stl: "none",
6601 system_shared_libs: [],
6602 }`)
6603
6604 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6605 apex {
6606 name: "myapex",
6607 key: "myapex.key",
6608 native_shared_libs: ["libfoo"],
6609 updatable: false,
6610 }
6611
6612 apex_key {
6613 name: "myapex.key",
6614 public_key: "testkey.avbpubkey",
6615 private_key: "testkey.pem",
6616 }
6617
6618 cc_library {
6619 name: "libfoo",
6620 stl: "none",
6621 static_libs: ["libbar"],
6622 system_shared_libs: [],
6623 apex_available: ["myapex"],
6624 }
6625
6626 cc_library {
6627 name: "libbar",
6628 stl: "none",
6629 system_shared_libs: [],
6630 }`)
6631}
6632
Paul Duffine52e66f2020-03-30 17:54:29 +01006633func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006634 testApexError(t, "\"otherapex\" is not a valid module name", `
6635 apex {
6636 name: "myapex",
6637 key: "myapex.key",
6638 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006639 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006640 }
6641
6642 apex_key {
6643 name: "myapex.key",
6644 public_key: "testkey.avbpubkey",
6645 private_key: "testkey.pem",
6646 }
6647
6648 cc_library {
6649 name: "libfoo",
6650 stl: "none",
6651 system_shared_libs: [],
6652 apex_available: ["otherapex"],
6653 }`)
6654
Paul Duffine52e66f2020-03-30 17:54:29 +01006655 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006656 apex {
6657 name: "myapex",
6658 key: "myapex.key",
6659 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006660 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006661 }
6662
6663 apex_key {
6664 name: "myapex.key",
6665 public_key: "testkey.avbpubkey",
6666 private_key: "testkey.pem",
6667 }
6668
6669 cc_library {
6670 name: "libfoo",
6671 stl: "none",
6672 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006673 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006674 apex_available: ["myapex"],
6675 }
6676
6677 cc_library {
6678 name: "libbar",
6679 stl: "none",
6680 system_shared_libs: [],
6681 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006682 }
6683
6684 cc_library {
6685 name: "libbaz",
6686 stl: "none",
6687 system_shared_libs: [],
6688 stubs: {
6689 versions: ["10", "20", "30"],
6690 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006691 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006692}
Jiyong Park127b40b2019-09-30 16:04:35 +09006693
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006694func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6695 t.Run("negative variant_version produces error", func(t *testing.T) {
6696 testApexError(t, "expected an integer between 0-9; got -1", `
6697 apex {
6698 name: "myapex",
6699 key: "myapex.key",
6700 apex_available_name: "com.android.foo",
6701 variant_version: "-1",
6702 updatable: false,
6703 }
6704 apex_key {
6705 name: "myapex.key",
6706 public_key: "testkey.avbpubkey",
6707 private_key: "testkey.pem",
6708 }
6709 `)
6710 })
6711
6712 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6713 testApexError(t, "expected an integer between 0-9; got 10", `
6714 apex {
6715 name: "myapex",
6716 key: "myapex.key",
6717 apex_available_name: "com.android.foo",
6718 variant_version: "10",
6719 updatable: false,
6720 }
6721 apex_key {
6722 name: "myapex.key",
6723 public_key: "testkey.avbpubkey",
6724 private_key: "testkey.pem",
6725 }
6726 `)
6727 })
6728}
6729
6730func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6731 context := android.GroupFixturePreparers(
6732 android.PrepareForIntegrationTestWithAndroid,
6733 PrepareForTestWithApexBuildComponents,
6734 android.FixtureMergeMockFs(android.MockFS{
6735 "system/sepolicy/apex/foo-file_contexts": nil,
6736 "system/sepolicy/apex/bar-file_contexts": nil,
6737 }),
6738 )
6739 result := context.RunTestWithBp(t, `
6740 apex {
6741 name: "foo",
6742 key: "myapex.key",
6743 apex_available_name: "com.android.foo",
6744 variant_version: "0",
6745 updatable: false,
6746 }
6747 apex {
6748 name: "bar",
6749 key: "myapex.key",
6750 apex_available_name: "com.android.foo",
6751 variant_version: "3",
6752 updatable: false,
6753 }
6754 apex_key {
6755 name: "myapex.key",
6756 public_key: "testkey.avbpubkey",
6757 private_key: "testkey.pem",
6758 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006759 override_apex {
6760 name: "myoverrideapex",
6761 base: "bar",
6762 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006763 `)
6764
Jooyung Hana0503a52023-08-23 13:12:50 +09006765 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006766 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6767 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6768 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6769 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6770 }
6771
Jooyung Hana0503a52023-08-23 13:12:50 +09006772 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006773 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6774 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6775 barActualDefaultVersion := barManifestRule.Args["default_version"]
6776 if barActualDefaultVersion != barExpectedDefaultVersion {
6777 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6778 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006779
Jooyung Hana0503a52023-08-23 13:12:50 +09006780 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006781 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6782 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6783 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6784 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006785}
6786
Sam Delmericoca816532023-06-02 14:09:50 -04006787func TestApexAvailable_ApexAvailableName(t *testing.T) {
6788 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6789 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6790 apex {
6791 name: "myapex_sminus",
6792 key: "myapex.key",
6793 apps: ["AppFoo"],
6794 apex_available_name: "myapex",
6795 updatable: false,
6796 }
6797 apex {
6798 name: "myapex",
6799 key: "myapex.key",
6800 apps: ["AppFoo"],
6801 updatable: false,
6802 }
6803 apex_key {
6804 name: "myapex.key",
6805 public_key: "testkey.avbpubkey",
6806 private_key: "testkey.pem",
6807 }
6808 android_app {
6809 name: "AppFoo",
6810 srcs: ["foo/bar/MyClass.java"],
6811 sdk_version: "none",
6812 system_modules: "none",
6813 apex_available: [ "myapex_sminus" ],
6814 }`,
6815 android.FixtureMergeMockFs(android.MockFS{
6816 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6817 }),
6818 )
6819 })
6820
6821 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6822 testApex(t, `
6823 apex {
6824 name: "myapex_sminus",
6825 key: "myapex.key",
6826 apps: ["AppFoo"],
6827 apex_available_name: "myapex",
6828 updatable: false,
6829 }
6830 apex {
6831 name: "myapex",
6832 key: "myapex.key",
6833 apps: ["AppFoo"],
6834 updatable: false,
6835 }
6836 apex_key {
6837 name: "myapex.key",
6838 public_key: "testkey.avbpubkey",
6839 private_key: "testkey.pem",
6840 }
6841 android_app {
6842 name: "AppFoo",
6843 srcs: ["foo/bar/MyClass.java"],
6844 sdk_version: "none",
6845 system_modules: "none",
6846 apex_available: [ "myapex" ],
6847 }`,
6848 android.FixtureMergeMockFs(android.MockFS{
6849 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6850 }),
6851 )
6852 })
6853
6854 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6855 testApex(t, `
6856 override_apex {
6857 name: "myoverrideapex_sminus",
6858 base: "myapex_sminus",
6859 key: "myapex.key",
6860 apps: ["AppFooOverride"],
6861 }
6862 override_apex {
6863 name: "myoverrideapex",
6864 base: "myapex",
6865 key: "myapex.key",
6866 apps: ["AppFooOverride"],
6867 }
6868 apex {
6869 name: "myapex_sminus",
6870 key: "myapex.key",
6871 apps: ["AppFoo"],
6872 apex_available_name: "myapex",
6873 updatable: false,
6874 }
6875 apex {
6876 name: "myapex",
6877 key: "myapex.key",
6878 apps: ["AppFoo"],
6879 updatable: false,
6880 }
6881 apex_key {
6882 name: "myapex.key",
6883 public_key: "testkey.avbpubkey",
6884 private_key: "testkey.pem",
6885 }
6886 android_app {
6887 name: "AppFooOverride",
6888 srcs: ["foo/bar/MyClass.java"],
6889 sdk_version: "none",
6890 system_modules: "none",
6891 apex_available: [ "myapex" ],
6892 }
6893 android_app {
6894 name: "AppFoo",
6895 srcs: ["foo/bar/MyClass.java"],
6896 sdk_version: "none",
6897 system_modules: "none",
6898 apex_available: [ "myapex" ],
6899 }`,
6900 android.FixtureMergeMockFs(android.MockFS{
6901 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6902 }),
6903 )
6904 })
6905}
6906
6907func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6908 context := android.GroupFixturePreparers(
6909 android.PrepareForIntegrationTestWithAndroid,
6910 PrepareForTestWithApexBuildComponents,
6911 java.PrepareForTestWithDexpreopt,
6912 android.FixtureMergeMockFs(android.MockFS{
6913 "system/sepolicy/apex/myapex-file_contexts": nil,
6914 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6915 }),
6916 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6917 variables.BuildId = proptools.StringPtr("buildid")
6918 }),
6919 )
6920 context.RunTestWithBp(t, `
6921 override_apex {
6922 name: "myoverrideapex_sminus",
6923 base: "myapex_sminus",
6924 }
6925 override_apex {
6926 name: "myoverrideapex",
6927 base: "myapex",
6928 }
6929 apex {
6930 name: "myapex",
6931 key: "myapex.key",
6932 apps: ["AppFoo"],
6933 updatable: false,
6934 }
6935 apex {
6936 name: "myapex_sminus",
6937 apex_available_name: "myapex",
6938 key: "myapex.key",
6939 apps: ["AppFoo_sminus"],
6940 updatable: false,
6941 }
6942 apex_key {
6943 name: "myapex.key",
6944 public_key: "testkey.avbpubkey",
6945 private_key: "testkey.pem",
6946 }
6947 android_app {
6948 name: "AppFoo",
6949 srcs: ["foo/bar/MyClass.java"],
6950 sdk_version: "none",
6951 system_modules: "none",
6952 apex_available: [ "myapex" ],
6953 }
6954 android_app {
6955 name: "AppFoo_sminus",
6956 srcs: ["foo/bar/MyClass.java"],
6957 sdk_version: "none",
6958 min_sdk_version: "29",
6959 system_modules: "none",
6960 apex_available: [ "myapex" ],
6961 }`)
6962}
6963
Jiyong Park89e850a2020-04-07 16:37:39 +09006964func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006965 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006966 apex {
6967 name: "myapex",
6968 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006969 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006970 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006971 }
6972
6973 apex_key {
6974 name: "myapex.key",
6975 public_key: "testkey.avbpubkey",
6976 private_key: "testkey.pem",
6977 }
6978
6979 cc_library {
6980 name: "libfoo",
6981 stl: "none",
6982 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006983 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006984 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006985 }
6986
6987 cc_library {
6988 name: "libfoo2",
6989 stl: "none",
6990 system_shared_libs: [],
6991 shared_libs: ["libbaz"],
6992 apex_available: ["//apex_available:platform"],
6993 }
6994
6995 cc_library {
6996 name: "libbar",
6997 stl: "none",
6998 system_shared_libs: [],
6999 apex_available: ["myapex"],
7000 }
7001
7002 cc_library {
7003 name: "libbaz",
7004 stl: "none",
7005 system_shared_libs: [],
7006 apex_available: ["myapex"],
7007 stubs: {
7008 versions: ["1"],
7009 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007010 }`)
7011
Jiyong Park89e850a2020-04-07 16:37:39 +09007012 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7013 // because it depends on libbar which isn't available to platform
7014 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7015 if libfoo.NotAvailableForPlatform() != true {
7016 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7017 }
7018
7019 // libfoo2 however can be available to platform because it depends on libbaz which provides
7020 // stubs
7021 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7022 if libfoo2.NotAvailableForPlatform() == true {
7023 t.Errorf("%q should be available to platform", libfoo2.String())
7024 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007025}
Jiyong Parka90ca002019-10-07 15:47:24 +09007026
Paul Duffine52e66f2020-03-30 17:54:29 +01007027func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007028 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007029 apex {
7030 name: "myapex",
7031 key: "myapex.key",
7032 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007033 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007034 }
7035
7036 apex_key {
7037 name: "myapex.key",
7038 public_key: "testkey.avbpubkey",
7039 private_key: "testkey.pem",
7040 }
7041
7042 cc_library {
7043 name: "libfoo",
7044 stl: "none",
7045 system_shared_libs: [],
7046 apex_available: ["myapex"],
7047 static: {
7048 apex_available: ["//apex_available:platform"],
7049 },
7050 }`)
7051
Jiyong Park89e850a2020-04-07 16:37:39 +09007052 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7053 if libfooShared.NotAvailableForPlatform() != true {
7054 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7055 }
7056 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7057 if libfooStatic.NotAvailableForPlatform() != false {
7058 t.Errorf("%q should be available to platform", libfooStatic.String())
7059 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007060}
7061
Jiyong Park5d790c32019-11-15 18:40:32 +09007062func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007063 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007064 apex {
7065 name: "myapex",
7066 key: "myapex.key",
7067 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007068 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007069 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007070 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007071 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007072 }
7073
7074 override_apex {
7075 name: "override_myapex",
7076 base: "myapex",
7077 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007078 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007079 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007080 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007081 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007082 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007083 key: "mynewapex.key",
7084 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007085 }
7086
7087 apex_key {
7088 name: "myapex.key",
7089 public_key: "testkey.avbpubkey",
7090 private_key: "testkey.pem",
7091 }
7092
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007093 apex_key {
7094 name: "mynewapex.key",
7095 public_key: "testkey2.avbpubkey",
7096 private_key: "testkey2.pem",
7097 }
7098
7099 android_app_certificate {
7100 name: "myapex.certificate",
7101 certificate: "testkey",
7102 }
7103
Jiyong Park5d790c32019-11-15 18:40:32 +09007104 android_app {
7105 name: "app",
7106 srcs: ["foo/bar/MyClass.java"],
7107 package_name: "foo",
7108 sdk_version: "none",
7109 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007110 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007111 }
7112
7113 override_android_app {
7114 name: "override_app",
7115 base: "app",
7116 package_name: "bar",
7117 }
markchien7c803b82021-08-26 22:10:06 +08007118
7119 bpf {
7120 name: "bpf",
7121 srcs: ["bpf.c"],
7122 }
7123
7124 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007125 name: "overrideBpf",
7126 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007127 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007128
7129 prebuilt_etc {
7130 name: "myetc",
7131 src: "myprebuilt",
7132 }
7133
7134 prebuilt_etc {
7135 name: "override_myetc",
7136 src: "override_myprebuilt",
7137 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007138 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007139
Jooyung Hana0503a52023-08-23 13:12:50 +09007140 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
7141 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007142 if originalVariant.GetOverriddenBy() != "" {
7143 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7144 }
7145 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7146 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7147 }
7148
Jooyung Hana0503a52023-08-23 13:12:50 +09007149 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007150 apexRule := module.Rule("apexRule")
7151 copyCmds := apexRule.Args["copy_commands"]
7152
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007153 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7154 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007155
markchien7c803b82021-08-26 22:10:06 +08007156 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007157 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007158
Daniel Norman5a3ce132021-08-26 15:44:43 -07007159 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7160 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7161
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007162 apexBundle := module.Module().(*apexBundle)
7163 name := apexBundle.Name()
7164 if name != "override_myapex" {
7165 t.Errorf("name should be \"override_myapex\", but was %q", name)
7166 }
7167
Baligh Uddin004d7172020-02-19 21:29:28 -08007168 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7169 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7170 }
7171
Jiyong Park20bacab2020-03-03 11:45:41 +09007172 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007173 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007174 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7175
7176 signApkRule := module.Rule("signapk")
7177 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007178
Colin Crossaa255532020-07-03 13:18:24 -07007179 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007180 var builder strings.Builder
7181 data.Custom(&builder, name, "TARGET_", "", data)
7182 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007183 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7184 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007185 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007186 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007187 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007188 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007189 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007190 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007191}
7192
Albert Martineefabcf2022-03-21 20:11:16 +00007193func TestMinSdkVersionOverride(t *testing.T) {
7194 // Override from 29 to 31
7195 minSdkOverride31 := "31"
7196 ctx := testApex(t, `
7197 apex {
7198 name: "myapex",
7199 key: "myapex.key",
7200 native_shared_libs: ["mylib"],
7201 updatable: true,
7202 min_sdk_version: "29"
7203 }
7204
7205 override_apex {
7206 name: "override_myapex",
7207 base: "myapex",
7208 logging_parent: "com.foo.bar",
7209 package_name: "test.overridden.package"
7210 }
7211
7212 apex_key {
7213 name: "myapex.key",
7214 public_key: "testkey.avbpubkey",
7215 private_key: "testkey.pem",
7216 }
7217
7218 cc_library {
7219 name: "mylib",
7220 srcs: ["mylib.cpp"],
7221 runtime_libs: ["libbar"],
7222 system_shared_libs: [],
7223 stl: "none",
7224 apex_available: [ "myapex" ],
7225 min_sdk_version: "apex_inherit"
7226 }
7227
7228 cc_library {
7229 name: "libbar",
7230 srcs: ["mylib.cpp"],
7231 system_shared_libs: [],
7232 stl: "none",
7233 apex_available: [ "myapex" ],
7234 min_sdk_version: "apex_inherit"
7235 }
7236
7237 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7238
Jooyung Hana0503a52023-08-23 13:12:50 +09007239 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007240 copyCmds := apexRule.Args["copy_commands"]
7241
7242 // Ensure that direct non-stubs dep is always included
7243 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7244
7245 // Ensure that runtime_libs dep in included
7246 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7247
7248 // Ensure libraries target overridden min_sdk_version value
7249 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7250}
7251
7252func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7253 // Attempt to override from 31 to 29, should be a NOOP
7254 minSdkOverride29 := "29"
7255 ctx := testApex(t, `
7256 apex {
7257 name: "myapex",
7258 key: "myapex.key",
7259 native_shared_libs: ["mylib"],
7260 updatable: true,
7261 min_sdk_version: "31"
7262 }
7263
7264 override_apex {
7265 name: "override_myapex",
7266 base: "myapex",
7267 logging_parent: "com.foo.bar",
7268 package_name: "test.overridden.package"
7269 }
7270
7271 apex_key {
7272 name: "myapex.key",
7273 public_key: "testkey.avbpubkey",
7274 private_key: "testkey.pem",
7275 }
7276
7277 cc_library {
7278 name: "mylib",
7279 srcs: ["mylib.cpp"],
7280 runtime_libs: ["libbar"],
7281 system_shared_libs: [],
7282 stl: "none",
7283 apex_available: [ "myapex" ],
7284 min_sdk_version: "apex_inherit"
7285 }
7286
7287 cc_library {
7288 name: "libbar",
7289 srcs: ["mylib.cpp"],
7290 system_shared_libs: [],
7291 stl: "none",
7292 apex_available: [ "myapex" ],
7293 min_sdk_version: "apex_inherit"
7294 }
7295
7296 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7297
Jooyung Hana0503a52023-08-23 13:12:50 +09007298 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007299 copyCmds := apexRule.Args["copy_commands"]
7300
7301 // Ensure that direct non-stubs dep is always included
7302 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7303
7304 // Ensure that runtime_libs dep in included
7305 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7306
7307 // Ensure libraries target the original min_sdk_version value rather than the overridden
7308 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7309}
7310
Jooyung Han214bf372019-11-12 13:03:50 +09007311func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007312 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007313 apex {
7314 name: "myapex",
7315 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007316 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007317 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007318 }
7319
7320 apex_key {
7321 name: "myapex.key",
7322 public_key: "testkey.avbpubkey",
7323 private_key: "testkey.pem",
7324 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007325
7326 cc_library {
7327 name: "mylib",
7328 srcs: ["mylib.cpp"],
7329 stl: "libc++",
7330 system_shared_libs: [],
7331 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007332 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007333 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007334 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007335
Jooyung Hana0503a52023-08-23 13:12:50 +09007336 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007337 args := module.Rule("apexRule").Args
7338 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007339 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007340
7341 // The copies of the libraries in the apex should have one more dependency than
7342 // the ones outside the apex, namely the unwinder. Ideally we should check
7343 // the dependency names directly here but for some reason the names are blank in
7344 // this test.
7345 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007346 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007347 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7348 if len(apexImplicits) != len(nonApexImplicits)+1 {
7349 t.Errorf("%q missing unwinder dep", lib)
7350 }
7351 }
Jooyung Han214bf372019-11-12 13:03:50 +09007352}
7353
Paul Duffine05480a2021-03-08 15:07:14 +00007354var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007355 "api/current.txt": nil,
7356 "api/removed.txt": nil,
7357 "api/system-current.txt": nil,
7358 "api/system-removed.txt": nil,
7359 "api/test-current.txt": nil,
7360 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007361
Anton Hanssondff2c782020-12-21 17:10:01 +00007362 "100/public/api/foo.txt": nil,
7363 "100/public/api/foo-removed.txt": nil,
7364 "100/system/api/foo.txt": nil,
7365 "100/system/api/foo-removed.txt": nil,
7366
Paul Duffineedc5d52020-06-12 17:46:39 +01007367 // For java_sdk_library_import
7368 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007369}
7370
Jooyung Han58f26ab2019-12-18 15:34:32 +09007371func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007372 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007373 apex {
7374 name: "myapex",
7375 key: "myapex.key",
7376 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007377 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007378 }
7379
7380 apex_key {
7381 name: "myapex.key",
7382 public_key: "testkey.avbpubkey",
7383 private_key: "testkey.pem",
7384 }
7385
7386 java_sdk_library {
7387 name: "foo",
7388 srcs: ["a.java"],
7389 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007390 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007391 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007392
7393 prebuilt_apis {
7394 name: "sdk",
7395 api_dirs: ["100"],
7396 }
Paul Duffin9b879592020-05-26 13:21:35 +01007397 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007398
7399 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007400 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007401 "javalib/foo.jar",
7402 "etc/permissions/foo.xml",
7403 })
7404 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007405 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007406 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 +09007407}
7408
Paul Duffin9b879592020-05-26 13:21:35 +01007409func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007410 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007411 apex {
7412 name: "myapex",
7413 key: "myapex.key",
7414 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007415 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007416 }
7417
7418 apex_key {
7419 name: "myapex.key",
7420 public_key: "testkey.avbpubkey",
7421 private_key: "testkey.pem",
7422 }
7423
7424 java_sdk_library {
7425 name: "foo",
7426 srcs: ["a.java"],
7427 api_packages: ["foo"],
7428 apex_available: ["myapex"],
7429 sdk_version: "none",
7430 system_modules: "none",
7431 }
7432
7433 java_library {
7434 name: "bar",
7435 srcs: ["a.java"],
7436 libs: ["foo"],
7437 apex_available: ["myapex"],
7438 sdk_version: "none",
7439 system_modules: "none",
7440 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007441
7442 prebuilt_apis {
7443 name: "sdk",
7444 api_dirs: ["100"],
7445 }
Paul Duffin9b879592020-05-26 13:21:35 +01007446 `, withFiles(filesForSdkLibrary))
7447
7448 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007449 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007450 "javalib/bar.jar",
7451 "javalib/foo.jar",
7452 "etc/permissions/foo.xml",
7453 })
7454
7455 // The bar library should depend on the implementation jar.
7456 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007457 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007458 t.Errorf("expected %q, found %#q", expected, actual)
7459 }
7460}
7461
7462func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007463 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007464 apex {
7465 name: "myapex",
7466 key: "myapex.key",
7467 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007468 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007469 }
7470
7471 apex_key {
7472 name: "myapex.key",
7473 public_key: "testkey.avbpubkey",
7474 private_key: "testkey.pem",
7475 }
7476
7477 java_sdk_library {
7478 name: "foo",
7479 srcs: ["a.java"],
7480 api_packages: ["foo"],
7481 apex_available: ["myapex"],
7482 sdk_version: "none",
7483 system_modules: "none",
7484 }
7485
7486 java_library {
7487 name: "bar",
7488 srcs: ["a.java"],
7489 libs: ["foo"],
7490 sdk_version: "none",
7491 system_modules: "none",
7492 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007493
7494 prebuilt_apis {
7495 name: "sdk",
7496 api_dirs: ["100"],
7497 }
Paul Duffin9b879592020-05-26 13:21:35 +01007498 `, withFiles(filesForSdkLibrary))
7499
7500 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007501 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007502 "javalib/foo.jar",
7503 "etc/permissions/foo.xml",
7504 })
7505
7506 // The bar library should depend on the stubs jar.
7507 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007508 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007509 t.Errorf("expected %q, found %#q", expected, actual)
7510 }
7511}
7512
Paul Duffineedc5d52020-06-12 17:46:39 +01007513func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007514 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007515 prebuilt_apis {
7516 name: "sdk",
7517 api_dirs: ["100"],
7518 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007519 withFiles(map[string][]byte{
7520 "apex/a.java": nil,
7521 "apex/apex_manifest.json": nil,
7522 "apex/Android.bp": []byte(`
7523 package {
7524 default_visibility: ["//visibility:private"],
7525 }
7526
7527 apex {
7528 name: "myapex",
7529 key: "myapex.key",
7530 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007531 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007532 }
7533
7534 apex_key {
7535 name: "myapex.key",
7536 public_key: "testkey.avbpubkey",
7537 private_key: "testkey.pem",
7538 }
7539
7540 java_library {
7541 name: "bar",
7542 srcs: ["a.java"],
7543 libs: ["foo"],
7544 apex_available: ["myapex"],
7545 sdk_version: "none",
7546 system_modules: "none",
7547 }
7548`),
7549 "source/a.java": nil,
7550 "source/api/current.txt": nil,
7551 "source/api/removed.txt": nil,
7552 "source/Android.bp": []byte(`
7553 package {
7554 default_visibility: ["//visibility:private"],
7555 }
7556
7557 java_sdk_library {
7558 name: "foo",
7559 visibility: ["//apex"],
7560 srcs: ["a.java"],
7561 api_packages: ["foo"],
7562 apex_available: ["myapex"],
7563 sdk_version: "none",
7564 system_modules: "none",
7565 public: {
7566 enabled: true,
7567 },
7568 }
7569`),
7570 "prebuilt/a.jar": nil,
7571 "prebuilt/Android.bp": []byte(`
7572 package {
7573 default_visibility: ["//visibility:private"],
7574 }
7575
7576 java_sdk_library_import {
7577 name: "foo",
7578 visibility: ["//apex", "//source"],
7579 apex_available: ["myapex"],
7580 prefer: true,
7581 public: {
7582 jars: ["a.jar"],
7583 },
7584 }
7585`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007586 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007587 )
7588
7589 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007590 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007591 "javalib/bar.jar",
7592 "javalib/foo.jar",
7593 "etc/permissions/foo.xml",
7594 })
7595
7596 // The bar library should depend on the implementation jar.
7597 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007598 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007599 t.Errorf("expected %q, found %#q", expected, actual)
7600 }
7601}
7602
7603func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7604 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7605 apex {
7606 name: "myapex",
7607 key: "myapex.key",
7608 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007609 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007610 }
7611
7612 apex_key {
7613 name: "myapex.key",
7614 public_key: "testkey.avbpubkey",
7615 private_key: "testkey.pem",
7616 }
7617
7618 java_sdk_library_import {
7619 name: "foo",
7620 apex_available: ["myapex"],
7621 prefer: true,
7622 public: {
7623 jars: ["a.jar"],
7624 },
7625 }
7626
7627 `, withFiles(filesForSdkLibrary))
7628}
7629
atrost6e126252020-01-27 17:01:16 +00007630func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007631 result := android.GroupFixturePreparers(
7632 prepareForApexTest,
7633 java.PrepareForTestWithPlatformCompatConfig,
7634 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007635 apex {
7636 name: "myapex",
7637 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007638 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007639 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007640 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007641 }
7642
7643 apex_key {
7644 name: "myapex.key",
7645 public_key: "testkey.avbpubkey",
7646 private_key: "testkey.pem",
7647 }
7648
7649 platform_compat_config {
7650 name: "myjar-platform-compat-config",
7651 src: ":myjar",
7652 }
7653
7654 java_library {
7655 name: "myjar",
7656 srcs: ["foo/bar/MyClass.java"],
7657 sdk_version: "none",
7658 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007659 apex_available: [ "myapex" ],
7660 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007661
7662 // Make sure that a preferred prebuilt does not affect the apex contents.
7663 prebuilt_platform_compat_config {
7664 name: "myjar-platform-compat-config",
7665 metadata: "compat-config/metadata.xml",
7666 prefer: true,
7667 }
atrost6e126252020-01-27 17:01:16 +00007668 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007669 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007670 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007671 "etc/compatconfig/myjar-platform-compat-config.xml",
7672 "javalib/myjar.jar",
7673 })
7674}
7675
Jooyung Han862c0d62022-12-21 10:15:37 +09007676func TestNoDupeApexFiles(t *testing.T) {
7677 android.GroupFixturePreparers(
7678 android.PrepareForTestWithAndroidBuildComponents,
7679 PrepareForTestWithApexBuildComponents,
7680 prepareForTestWithMyapex,
7681 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7682 ).
7683 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7684 RunTestWithBp(t, `
7685 apex {
7686 name: "myapex",
7687 key: "myapex.key",
7688 prebuilts: ["foo", "bar"],
7689 updatable: false,
7690 }
7691
7692 apex_key {
7693 name: "myapex.key",
7694 public_key: "testkey.avbpubkey",
7695 private_key: "testkey.pem",
7696 }
7697
7698 prebuilt_etc {
7699 name: "foo",
7700 src: "myprebuilt",
7701 filename_from_src: true,
7702 }
7703
7704 prebuilt_etc {
7705 name: "bar",
7706 src: "myprebuilt",
7707 filename_from_src: true,
7708 }
7709 `)
7710}
7711
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007712func TestApexUnwantedTransitiveDeps(t *testing.T) {
7713 bp := `
7714 apex {
7715 name: "myapex",
7716 key: "myapex.key",
7717 native_shared_libs: ["libfoo"],
7718 updatable: false,
7719 unwanted_transitive_deps: ["libbar"],
7720 }
7721
7722 apex_key {
7723 name: "myapex.key",
7724 public_key: "testkey.avbpubkey",
7725 private_key: "testkey.pem",
7726 }
7727
7728 cc_library {
7729 name: "libfoo",
7730 srcs: ["foo.cpp"],
7731 shared_libs: ["libbar"],
7732 apex_available: ["myapex"],
7733 }
7734
7735 cc_library {
7736 name: "libbar",
7737 srcs: ["bar.cpp"],
7738 apex_available: ["myapex"],
7739 }`
7740 ctx := testApex(t, bp)
7741 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7742 "*/libc++.so",
7743 "*/libfoo.so",
7744 // not libbar.so
7745 })
7746}
7747
Jiyong Park479321d2019-12-16 11:47:12 +09007748func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7749 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7750 apex {
7751 name: "myapex",
7752 key: "myapex.key",
7753 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007754 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007755 }
7756
7757 apex_key {
7758 name: "myapex.key",
7759 public_key: "testkey.avbpubkey",
7760 private_key: "testkey.pem",
7761 }
7762
7763 java_library {
7764 name: "myjar",
7765 srcs: ["foo/bar/MyClass.java"],
7766 sdk_version: "none",
7767 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007768 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007769 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007770 }
7771 `)
7772}
7773
Jiyong Park7afd1072019-12-30 16:56:33 +09007774func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007775 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007776 apex {
7777 name: "myapex",
7778 key: "myapex.key",
7779 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007780 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007781 }
7782
7783 apex_key {
7784 name: "myapex.key",
7785 public_key: "testkey.avbpubkey",
7786 private_key: "testkey.pem",
7787 }
7788
7789 cc_library {
7790 name: "mylib",
7791 srcs: ["mylib.cpp"],
7792 system_shared_libs: [],
7793 stl: "none",
7794 required: ["a", "b"],
7795 host_required: ["c", "d"],
7796 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007797 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007798 }
7799 `)
7800
Jooyung Hana0503a52023-08-23 13:12:50 +09007801 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007802 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007803 name := apexBundle.BaseModuleName()
7804 prefix := "TARGET_"
7805 var builder strings.Builder
7806 data.Custom(&builder, name, prefix, "", data)
7807 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007808 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007809 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7810 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007811}
7812
Jiyong Park7cd10e32020-01-14 09:22:18 +09007813func TestSymlinksFromApexToSystem(t *testing.T) {
7814 bp := `
7815 apex {
7816 name: "myapex",
7817 key: "myapex.key",
7818 native_shared_libs: ["mylib"],
7819 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007820 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007821 }
7822
Jiyong Park9d677202020-02-19 16:29:35 +09007823 apex {
7824 name: "myapex.updatable",
7825 key: "myapex.key",
7826 native_shared_libs: ["mylib"],
7827 java_libs: ["myjar"],
7828 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007829 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007830 }
7831
Jiyong Park7cd10e32020-01-14 09:22:18 +09007832 apex_key {
7833 name: "myapex.key",
7834 public_key: "testkey.avbpubkey",
7835 private_key: "testkey.pem",
7836 }
7837
7838 cc_library {
7839 name: "mylib",
7840 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007841 shared_libs: [
7842 "myotherlib",
7843 "myotherlib_ext",
7844 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007845 system_shared_libs: [],
7846 stl: "none",
7847 apex_available: [
7848 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007849 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007850 "//apex_available:platform",
7851 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007852 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007853 }
7854
7855 cc_library {
7856 name: "myotherlib",
7857 srcs: ["mylib.cpp"],
7858 system_shared_libs: [],
7859 stl: "none",
7860 apex_available: [
7861 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007862 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007863 "//apex_available:platform",
7864 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007865 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007866 }
7867
Jiyong Parkce243632023-02-17 18:22:25 +09007868 cc_library {
7869 name: "myotherlib_ext",
7870 srcs: ["mylib.cpp"],
7871 system_shared_libs: [],
7872 system_ext_specific: true,
7873 stl: "none",
7874 apex_available: [
7875 "myapex",
7876 "myapex.updatable",
7877 "//apex_available:platform",
7878 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007879 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007880 }
7881
Jiyong Park7cd10e32020-01-14 09:22:18 +09007882 java_library {
7883 name: "myjar",
7884 srcs: ["foo/bar/MyClass.java"],
7885 sdk_version: "none",
7886 system_modules: "none",
7887 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007888 apex_available: [
7889 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007890 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007891 "//apex_available:platform",
7892 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007893 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007894 }
7895
7896 java_library {
7897 name: "myotherjar",
7898 srcs: ["foo/bar/MyClass.java"],
7899 sdk_version: "none",
7900 system_modules: "none",
7901 apex_available: [
7902 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007903 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007904 "//apex_available:platform",
7905 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007906 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007907 }
7908 `
7909
7910 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7911 for _, f := range files {
7912 if f.path == file {
7913 if f.isLink {
7914 t.Errorf("%q is not a real file", file)
7915 }
7916 return
7917 }
7918 }
7919 t.Errorf("%q is not found", file)
7920 }
7921
Jiyong Parkce243632023-02-17 18:22:25 +09007922 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007923 for _, f := range files {
7924 if f.path == file {
7925 if !f.isLink {
7926 t.Errorf("%q is not a symlink", file)
7927 }
Jiyong Parkce243632023-02-17 18:22:25 +09007928 if f.src != target {
7929 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7930 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007931 return
7932 }
7933 }
7934 t.Errorf("%q is not found", file)
7935 }
7936
Jiyong Park9d677202020-02-19 16:29:35 +09007937 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7938 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007939 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007940 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007941 ensureRealfileExists(t, files, "javalib/myjar.jar")
7942 ensureRealfileExists(t, files, "lib64/mylib.so")
7943 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007944 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007945
Jooyung Hana0503a52023-08-23 13:12:50 +09007946 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007947 ensureRealfileExists(t, files, "javalib/myjar.jar")
7948 ensureRealfileExists(t, files, "lib64/mylib.so")
7949 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007950 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007951
7952 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007953 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007954 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007955 ensureRealfileExists(t, files, "javalib/myjar.jar")
7956 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007957 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7958 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007959
Jooyung Hana0503a52023-08-23 13:12:50 +09007960 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007961 ensureRealfileExists(t, files, "javalib/myjar.jar")
7962 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007963 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7964 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007965}
7966
Yo Chiange8128052020-07-23 20:09:18 +08007967func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007968 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007969 apex {
7970 name: "myapex",
7971 key: "myapex.key",
7972 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007973 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007974 }
7975
7976 apex_key {
7977 name: "myapex.key",
7978 public_key: "testkey.avbpubkey",
7979 private_key: "testkey.pem",
7980 }
7981
7982 cc_library_shared {
7983 name: "mylib",
7984 srcs: ["mylib.cpp"],
7985 shared_libs: ["myotherlib"],
7986 system_shared_libs: [],
7987 stl: "none",
7988 apex_available: [
7989 "myapex",
7990 "//apex_available:platform",
7991 ],
7992 }
7993
7994 cc_prebuilt_library_shared {
7995 name: "myotherlib",
7996 srcs: ["prebuilt.so"],
7997 system_shared_libs: [],
7998 stl: "none",
7999 apex_available: [
8000 "myapex",
8001 "//apex_available:platform",
8002 ],
8003 }
8004 `)
8005
Jooyung Hana0503a52023-08-23 13:12:50 +09008006 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008007 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008008 var builder strings.Builder
8009 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8010 androidMk := builder.String()
8011 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008012 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008013 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8014 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8015 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008016 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008017}
8018
Jooyung Han643adc42020-02-27 13:50:06 +09008019func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008020 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008021 apex {
8022 name: "myapex",
8023 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008024 binaries: ["mybin"],
8025 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008026 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008027 }
8028
8029 apex_key {
8030 name: "myapex.key",
8031 public_key: "testkey.avbpubkey",
8032 private_key: "testkey.pem",
8033 }
8034
8035 cc_library {
8036 name: "mylib",
8037 srcs: ["mylib.cpp"],
8038 shared_libs: ["mylib2"],
8039 system_shared_libs: [],
8040 stl: "none",
8041 apex_available: [ "myapex" ],
8042 }
8043
8044 cc_library {
8045 name: "mylib2",
8046 srcs: ["mylib.cpp"],
8047 system_shared_libs: [],
8048 stl: "none",
8049 apex_available: [ "myapex" ],
8050 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008051
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008052 // Used as both a JNI library and a regular shared library.
8053 cc_library {
8054 name: "mylib3",
8055 srcs: ["mylib.cpp"],
8056 system_shared_libs: [],
8057 stl: "none",
8058 apex_available: [ "myapex" ],
8059 }
8060
8061 cc_binary {
8062 name: "mybin",
8063 srcs: ["mybin.cpp"],
8064 shared_libs: ["mylib3"],
8065 system_shared_libs: [],
8066 stl: "none",
8067 apex_available: [ "myapex" ],
8068 }
8069
Jiyong Park34d5c332022-02-24 18:02:44 +09008070 rust_ffi_shared {
8071 name: "libfoo.rust",
8072 crate_name: "foo",
8073 srcs: ["foo.rs"],
8074 shared_libs: ["libfoo.shared_from_rust"],
8075 prefer_rlib: true,
8076 apex_available: ["myapex"],
8077 }
8078
8079 cc_library_shared {
8080 name: "libfoo.shared_from_rust",
8081 srcs: ["mylib.cpp"],
8082 system_shared_libs: [],
8083 stl: "none",
8084 stubs: {
8085 versions: ["10", "11", "12"],
8086 },
8087 }
8088
Jooyung Han643adc42020-02-27 13:50:06 +09008089 `)
8090
Jooyung Hana0503a52023-08-23 13:12:50 +09008091 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008092 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008093 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008094 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008095 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008096 "lib64/mylib.so",
8097 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008098 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008099 "lib64/libfoo.rust.so",
8100 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8101 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008102 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008103
8104 // b/220397949
8105 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008106}
8107
Jooyung Han49f67012020-04-17 13:43:10 +09008108func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008109 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008110 apex {
8111 name: "myapex",
8112 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008113 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008114 }
8115 apex_key {
8116 name: "myapex.key",
8117 public_key: "testkey.avbpubkey",
8118 private_key: "testkey.pem",
8119 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008120 `,
8121 android.FixtureModifyConfig(func(config android.Config) {
8122 delete(config.Targets, android.Android)
8123 config.AndroidCommonTarget = android.Target{}
8124 }),
8125 )
Jooyung Han49f67012020-04-17 13:43:10 +09008126
8127 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8128 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8129 }
8130}
8131
Jiyong Parkbd159612020-02-28 15:22:21 +09008132func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008133 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008134 apex {
8135 name: "myapex",
8136 key: "myapex.key",
8137 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008138 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008139 }
8140
8141 apex_key {
8142 name: "myapex.key",
8143 public_key: "testkey.avbpubkey",
8144 private_key: "testkey.pem",
8145 }
8146
8147 android_app {
8148 name: "AppFoo",
8149 srcs: ["foo/bar/MyClass.java"],
8150 sdk_version: "none",
8151 system_modules: "none",
8152 apex_available: [ "myapex" ],
8153 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008154 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008155
Jooyung Hana0503a52023-08-23 13:12:50 +09008156 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09008157 content := bundleConfigRule.Args["content"]
8158
8159 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008160 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 +09008161}
8162
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008163func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008164 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008165 apex {
8166 name: "myapex",
8167 key: "myapex.key",
8168 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008169 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008170 }
8171
8172 apex_key {
8173 name: "myapex.key",
8174 public_key: "testkey.avbpubkey",
8175 private_key: "testkey.pem",
8176 }
8177
8178 android_app_set {
8179 name: "AppSet",
8180 set: "AppSet.apks",
8181 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008182 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008183 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008184 content := bundleConfigRule.Args["content"]
8185 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8186 s := mod.Rule("apexRule").Args["copy_commands"]
8187 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008188 if len(copyCmds) != 4 {
8189 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008190 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008191 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8192 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008193 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8194 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008195
8196 // Ensure that canned_fs_config has an entry for the app set zip file
8197 generateFsRule := mod.Rule("generateFsConfig")
8198 cmd := generateFsRule.RuleParams.Command
8199 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008200}
8201
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008202func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008203 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008204 apex_set {
8205 name: "myapex",
8206 filename: "foo_v2.apex",
8207 sanitized: {
8208 none: { set: "myapex.apks", },
8209 hwaddress: { set: "myapex.hwasan.apks", },
8210 },
Paul Duffin24704672021-04-06 16:09:30 +01008211 }
8212 `
8213 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008214
Paul Duffin24704672021-04-06 16:09:30 +01008215 // Check that the extractor produces the correct output file from the correct input file.
8216 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008217
Paul Duffin24704672021-04-06 16:09:30 +01008218 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8219 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008220
Paul Duffin24704672021-04-06 16:09:30 +01008221 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8222
8223 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008224 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8225 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008226
8227 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008228}
8229
Pranav Guptaeba03b02022-09-27 00:27:08 +00008230func TestApexSetApksModuleAssignment(t *testing.T) {
8231 ctx := testApex(t, `
8232 apex_set {
8233 name: "myapex",
8234 set: ":myapex_apks_file",
8235 }
8236
8237 filegroup {
8238 name: "myapex_apks_file",
8239 srcs: ["myapex.apks"],
8240 }
8241 `)
8242
8243 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8244
8245 // Check that the extractor produces the correct apks file from the input module
8246 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
8247 extractedApex := m.Output(extractorOutput)
8248
8249 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8250}
8251
Paul Duffin89f570a2021-06-16 01:42:33 +01008252func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008253 t.Helper()
8254
Paul Duffin55607122021-03-30 23:32:51 +01008255 fs := android.MockFS{
8256 "a.java": nil,
8257 "a.jar": nil,
8258 "apex_manifest.json": nil,
8259 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008260 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008261 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8262 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8263 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008264 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008265 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008266
Paul Duffin55607122021-03-30 23:32:51 +01008267 errorHandler := android.FixtureExpectsNoErrors
8268 if errmsg != "" {
8269 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008270 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008271
Paul Duffin55607122021-03-30 23:32:51 +01008272 result := android.GroupFixturePreparers(
8273 cc.PrepareForTestWithCcDefaultModules,
8274 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008275 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008276 java.PrepareForTestWithJavaSdkLibraryFiles,
8277 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008278 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008279 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008280 android.FixtureModifyMockFS(func(fs android.MockFS) {
8281 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8282 insert := ""
8283 for _, fragment := range fragments {
8284 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8285 }
8286 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8287 platform_bootclasspath {
8288 name: "platform-bootclasspath",
8289 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008290 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008291 %s
8292 ],
8293 }
8294 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008295 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008296 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008297 // Dexpreopt for boot jars requires the ART boot image profile.
8298 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8299 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008300 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008301 ).
8302 ExtendWithErrorHandler(errorHandler).
8303 RunTestWithBp(t, bp)
8304
8305 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008306}
8307
Paul Duffin5556c5f2022-06-09 17:32:21 +00008308func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008309 preparers := android.GroupFixturePreparers(
8310 java.PrepareForTestWithJavaDefaultModules,
8311 PrepareForTestWithApexBuildComponents,
8312 ).
8313 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
8314 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
8315
8316 bpBase := `
8317 apex_set {
8318 name: "com.android.myapex",
8319 installable: true,
8320 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8321 set: "myapex.apks",
8322 }
8323
8324 apex_set {
8325 name: "com.mycompany.android.myapex",
8326 apex_name: "com.android.myapex",
8327 installable: true,
8328 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8329 set: "company-myapex.apks",
8330 }
8331
8332 prebuilt_bootclasspath_fragment {
8333 name: "my-bootclasspath-fragment",
8334 apex_available: ["com.android.myapex"],
8335 %s
8336 }
8337 `
8338
8339 t.Run("java_import", func(t *testing.T) {
8340 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8341 java_import {
8342 name: "libfoo",
8343 jars: ["libfoo.jar"],
8344 apex_available: ["com.android.myapex"],
8345 }
8346 `)
8347 })
8348
8349 t.Run("java_sdk_library_import", func(t *testing.T) {
8350 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8351 java_sdk_library_import {
8352 name: "libfoo",
8353 public: {
8354 jars: ["libbar.jar"],
8355 },
8356 apex_available: ["com.android.myapex"],
8357 }
8358 `)
8359 })
8360
8361 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8362 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8363 image_name: "art",
8364 contents: ["libfoo"],
8365 `)+`
8366 java_sdk_library_import {
8367 name: "libfoo",
8368 public: {
8369 jars: ["libbar.jar"],
8370 },
8371 apex_available: ["com.android.myapex"],
8372 }
8373 `)
8374 })
8375}
8376
Paul Duffin5556c5f2022-06-09 17:32:21 +00008377func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8378 preparers := android.GroupFixturePreparers(
8379 java.PrepareForTestWithJavaDefaultModules,
8380 PrepareForTestWithApexBuildComponents,
8381 )
8382
8383 bpBase := `
8384 apex_set {
8385 name: "com.android.myapex",
8386 installable: true,
8387 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8388 set: "myapex.apks",
8389 }
8390
8391 apex_set {
8392 name: "com.android.myapex_compressed",
8393 apex_name: "com.android.myapex",
8394 installable: true,
8395 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8396 set: "myapex_compressed.apks",
8397 }
8398
8399 prebuilt_bootclasspath_fragment {
8400 name: "my-bootclasspath-fragment",
8401 apex_available: [
8402 "com.android.myapex",
8403 "com.android.myapex_compressed",
8404 ],
8405 hidden_api: {
8406 annotation_flags: "annotation-flags.csv",
8407 metadata: "metadata.csv",
8408 index: "index.csv",
8409 signature_patterns: "signature_patterns.csv",
8410 },
8411 %s
8412 }
8413 `
8414
8415 t.Run("java_import", func(t *testing.T) {
8416 result := preparers.RunTestWithBp(t,
8417 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8418 java_import {
8419 name: "libfoo",
8420 jars: ["libfoo.jar"],
8421 apex_available: [
8422 "com.android.myapex",
8423 "com.android.myapex_compressed",
8424 ],
8425 }
8426 `)
8427
8428 module := result.Module("libfoo", "android_common_com.android.myapex")
8429 usesLibraryDep := module.(java.UsesLibraryDependency)
8430 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8431 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8432 usesLibraryDep.DexJarBuildPath().Path())
8433 })
8434
8435 t.Run("java_sdk_library_import", func(t *testing.T) {
8436 result := preparers.RunTestWithBp(t,
8437 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8438 java_sdk_library_import {
8439 name: "libfoo",
8440 public: {
8441 jars: ["libbar.jar"],
8442 },
8443 apex_available: [
8444 "com.android.myapex",
8445 "com.android.myapex_compressed",
8446 ],
8447 compile_dex: true,
8448 }
8449 `)
8450
8451 module := result.Module("libfoo", "android_common_com.android.myapex")
8452 usesLibraryDep := module.(java.UsesLibraryDependency)
8453 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8454 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8455 usesLibraryDep.DexJarBuildPath().Path())
8456 })
8457
8458 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8459 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8460 image_name: "art",
8461 contents: ["libfoo"],
8462 `)+`
8463 java_sdk_library_import {
8464 name: "libfoo",
8465 public: {
8466 jars: ["libbar.jar"],
8467 },
8468 apex_available: [
8469 "com.android.myapex",
8470 "com.android.myapex_compressed",
8471 ],
8472 compile_dex: true,
8473 }
8474 `)
8475 })
8476}
8477
Jooyung Han548640b2020-04-27 12:10:30 +09008478func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8479 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8480 apex {
8481 name: "myapex",
8482 key: "myapex.key",
8483 updatable: true,
8484 }
8485
8486 apex_key {
8487 name: "myapex.key",
8488 public_key: "testkey.avbpubkey",
8489 private_key: "testkey.pem",
8490 }
8491 `)
8492}
8493
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008494func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8495 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8496 apex {
8497 name: "myapex",
8498 key: "myapex.key",
8499 }
8500
8501 apex_key {
8502 name: "myapex.key",
8503 public_key: "testkey.avbpubkey",
8504 private_key: "testkey.pem",
8505 }
8506 `)
8507}
8508
Jooyung Handfc864c2023-03-20 18:19:07 +09008509func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8510 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008511 apex {
8512 name: "myapex",
8513 key: "myapex.key",
8514 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008515 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008516 soc_specific: true,
8517 }
8518
8519 apex_key {
8520 name: "myapex.key",
8521 public_key: "testkey.avbpubkey",
8522 private_key: "testkey.pem",
8523 }
8524 `)
8525}
8526
Jooyung Han02873da2023-03-22 17:41:03 +09008527func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8528 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8529 apex {
8530 name: "myapex",
8531 key: "myapex.key",
8532 updatable: false,
8533 min_sdk_version: "29",
8534 use_vndk_as_stable: true,
8535 vendor: true,
8536 }
8537
8538 apex_key {
8539 name: "myapex.key",
8540 public_key: "testkey.avbpubkey",
8541 private_key: "testkey.pem",
8542 }
8543 `)
8544}
8545
Jooyung Handfc864c2023-03-20 18:19:07 +09008546func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8547 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8548 apex {
8549 name: "myapex",
8550 key: "myapex.key",
8551 updatable: false,
8552 use_vndk_as_stable: true,
8553 }
8554
8555 apex_key {
8556 name: "myapex.key",
8557 public_key: "testkey.avbpubkey",
8558 private_key: "testkey.pem",
8559 }
8560 `)
8561}
8562
satayevb98371c2021-06-15 16:49:50 +01008563func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8564 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8565 apex {
8566 name: "myapex",
8567 key: "myapex.key",
8568 systemserverclasspath_fragments: [
8569 "mysystemserverclasspathfragment",
8570 ],
8571 min_sdk_version: "29",
8572 updatable: true,
8573 }
8574
8575 apex_key {
8576 name: "myapex.key",
8577 public_key: "testkey.avbpubkey",
8578 private_key: "testkey.pem",
8579 }
8580
8581 java_library {
8582 name: "foo",
8583 srcs: ["b.java"],
8584 min_sdk_version: "29",
8585 installable: true,
8586 apex_available: [
8587 "myapex",
8588 ],
8589 }
8590
8591 systemserverclasspath_fragment {
8592 name: "mysystemserverclasspathfragment",
8593 generate_classpaths_proto: false,
8594 contents: [
8595 "foo",
8596 ],
8597 apex_available: [
8598 "myapex",
8599 ],
8600 }
satayevabcd5972021-08-06 17:49:46 +01008601 `,
8602 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8603 )
satayevb98371c2021-06-15 16:49:50 +01008604}
8605
Paul Duffin064b70c2020-11-02 17:32:38 +00008606func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008607 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008608 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008609 fragment := java.ApexVariantReference{
8610 Apex: proptools.StringPtr("myapex"),
8611 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8612 }
8613
Paul Duffin064b70c2020-11-02 17:32:38 +00008614 testDexpreoptWithApexes(t, `
8615 prebuilt_apex {
8616 name: "myapex" ,
8617 arch: {
8618 arm64: {
8619 src: "myapex-arm64.apex",
8620 },
8621 arm: {
8622 src: "myapex-arm.apex",
8623 },
8624 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008625 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8626 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008627
Paul Duffin89f570a2021-06-16 01:42:33 +01008628 prebuilt_bootclasspath_fragment {
8629 name: "my-bootclasspath-fragment",
8630 contents: ["libfoo"],
8631 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008632 hidden_api: {
8633 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8634 metadata: "my-bootclasspath-fragment/metadata.csv",
8635 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008636 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8637 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8638 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008639 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008640 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008641
Paul Duffin89f570a2021-06-16 01:42:33 +01008642 java_import {
8643 name: "libfoo",
8644 jars: ["libfoo.jar"],
8645 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008646 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008647 }
8648 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008649 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008650}
8651
Spandan Dasf14e2542021-11-12 00:01:37 +00008652func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008653 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008654 bp += `
8655 apex_key {
8656 name: "myapex.key",
8657 public_key: "testkey.avbpubkey",
8658 private_key: "testkey.pem",
8659 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008660 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008661 "lib1/src/A.java": nil,
8662 "lib2/src/B.java": nil,
8663 "system/sepolicy/apex/myapex-file_contexts": nil,
8664 }
8665
Paul Duffin45338f02021-03-30 23:07:52 +01008666 errorHandler := android.FixtureExpectsNoErrors
8667 if errmsg != "" {
8668 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008669 }
Colin Crossae8600b2020-10-29 17:09:13 -07008670
Paul Duffin45338f02021-03-30 23:07:52 +01008671 android.GroupFixturePreparers(
8672 android.PrepareForTestWithAndroidBuildComponents,
8673 java.PrepareForTestWithJavaBuildComponents,
8674 PrepareForTestWithApexBuildComponents,
8675 android.PrepareForTestWithNeverallowRules(rules),
8676 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008677 apexBootJars := make([]string, 0, len(bootJars))
8678 for _, apexBootJar := range bootJars {
8679 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008680 }
satayevd604b212021-07-21 14:23:52 +01008681 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008682 }),
8683 fs.AddToFixture(),
8684 ).
8685 ExtendWithErrorHandler(errorHandler).
8686 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008687}
8688
8689func TestApexPermittedPackagesRules(t *testing.T) {
8690 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008691 name string
8692 expectedError string
8693 bp string
8694 bootJars []string
8695 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008696 }{
8697
8698 {
8699 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8700 expectedError: "",
8701 bp: `
8702 java_library {
8703 name: "bcp_lib1",
8704 srcs: ["lib1/src/*.java"],
8705 permitted_packages: ["foo.bar"],
8706 apex_available: ["myapex"],
8707 sdk_version: "none",
8708 system_modules: "none",
8709 }
8710 java_library {
8711 name: "nonbcp_lib2",
8712 srcs: ["lib2/src/*.java"],
8713 apex_available: ["myapex"],
8714 permitted_packages: ["a.b"],
8715 sdk_version: "none",
8716 system_modules: "none",
8717 }
8718 apex {
8719 name: "myapex",
8720 key: "myapex.key",
8721 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008722 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008723 }`,
8724 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008725 bcpPermittedPackages: map[string][]string{
8726 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008727 "foo.bar",
8728 },
8729 },
8730 },
8731 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008732 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008733 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 +01008734 bp: `
8735 java_library {
8736 name: "bcp_lib1",
8737 srcs: ["lib1/src/*.java"],
8738 apex_available: ["myapex"],
8739 permitted_packages: ["foo.bar"],
8740 sdk_version: "none",
8741 system_modules: "none",
8742 }
8743 java_library {
8744 name: "bcp_lib2",
8745 srcs: ["lib2/src/*.java"],
8746 apex_available: ["myapex"],
8747 permitted_packages: ["foo.bar", "bar.baz"],
8748 sdk_version: "none",
8749 system_modules: "none",
8750 }
8751 apex {
8752 name: "myapex",
8753 key: "myapex.key",
8754 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008755 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008756 }
8757 `,
8758 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008759 bcpPermittedPackages: map[string][]string{
8760 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008761 "foo.bar",
8762 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008763 "bcp_lib2": []string{
8764 "foo.bar",
8765 },
8766 },
8767 },
8768 {
8769 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8770 expectedError: "",
8771 bp: `
8772 java_library {
8773 name: "bcp_lib_restricted",
8774 srcs: ["lib1/src/*.java"],
8775 apex_available: ["myapex"],
8776 permitted_packages: ["foo.bar"],
8777 sdk_version: "none",
8778 min_sdk_version: "29",
8779 system_modules: "none",
8780 }
8781 java_library {
8782 name: "bcp_lib_unrestricted",
8783 srcs: ["lib2/src/*.java"],
8784 apex_available: ["myapex"],
8785 permitted_packages: ["foo.bar", "bar.baz"],
8786 sdk_version: "none",
8787 min_sdk_version: "29",
8788 system_modules: "none",
8789 }
8790 apex {
8791 name: "myapex",
8792 key: "myapex.key",
8793 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8794 updatable: true,
8795 min_sdk_version: "29",
8796 }
8797 `,
8798 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8799 bcpPermittedPackages: map[string][]string{
8800 "bcp_lib1_non_updateable": []string{
8801 "foo.bar",
8802 },
8803 // 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 +01008804 },
8805 },
8806 }
8807 for _, tc := range testcases {
8808 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008809 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8810 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008811 })
8812 }
8813}
8814
Jiyong Park62304bb2020-04-13 16:19:48 +09008815func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008816 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008817 apex {
8818 name: "myapex",
8819 key: "myapex.key",
8820 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008821 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008822 }
8823
8824 apex_key {
8825 name: "myapex.key",
8826 public_key: "testkey.avbpubkey",
8827 private_key: "testkey.pem",
8828 }
8829
8830 cc_library {
8831 name: "mylib",
8832 srcs: ["mylib.cpp"],
8833 system_shared_libs: [],
8834 stl: "none",
8835 stubs: {
8836 versions: ["1"],
8837 },
8838 apex_available: ["myapex"],
8839 }
8840
8841 cc_library {
8842 name: "myprivlib",
8843 srcs: ["mylib.cpp"],
8844 system_shared_libs: [],
8845 stl: "none",
8846 apex_available: ["myapex"],
8847 }
8848
8849
8850 cc_test {
8851 name: "mytest",
8852 gtest: false,
8853 srcs: ["mylib.cpp"],
8854 system_shared_libs: [],
8855 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008856 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008857 test_for: ["myapex"]
8858 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008859
8860 cc_library {
8861 name: "mytestlib",
8862 srcs: ["mylib.cpp"],
8863 system_shared_libs: [],
8864 shared_libs: ["mylib", "myprivlib"],
8865 stl: "none",
8866 test_for: ["myapex"],
8867 }
8868
8869 cc_benchmark {
8870 name: "mybench",
8871 srcs: ["mylib.cpp"],
8872 system_shared_libs: [],
8873 shared_libs: ["mylib", "myprivlib"],
8874 stl: "none",
8875 test_for: ["myapex"],
8876 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008877 `)
8878
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008879 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008880 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008881 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8882 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8883 }
8884
8885 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008886 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008887 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8888 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8889 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8890}
Jiyong Park46a512f2020-12-04 18:02:13 +09008891
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008892func TestIndirectTestFor(t *testing.T) {
8893 ctx := testApex(t, `
8894 apex {
8895 name: "myapex",
8896 key: "myapex.key",
8897 native_shared_libs: ["mylib", "myprivlib"],
8898 updatable: false,
8899 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008900
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008901 apex_key {
8902 name: "myapex.key",
8903 public_key: "testkey.avbpubkey",
8904 private_key: "testkey.pem",
8905 }
8906
8907 cc_library {
8908 name: "mylib",
8909 srcs: ["mylib.cpp"],
8910 system_shared_libs: [],
8911 stl: "none",
8912 stubs: {
8913 versions: ["1"],
8914 },
8915 apex_available: ["myapex"],
8916 }
8917
8918 cc_library {
8919 name: "myprivlib",
8920 srcs: ["mylib.cpp"],
8921 system_shared_libs: [],
8922 stl: "none",
8923 shared_libs: ["mylib"],
8924 apex_available: ["myapex"],
8925 }
8926
8927 cc_library {
8928 name: "mytestlib",
8929 srcs: ["mylib.cpp"],
8930 system_shared_libs: [],
8931 shared_libs: ["myprivlib"],
8932 stl: "none",
8933 test_for: ["myapex"],
8934 }
8935 `)
8936
8937 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008938 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008939 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8940 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8941 }
8942
8943 // The platform variant of mytestlib links to the platform variant of the
8944 // internal myprivlib.
8945 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8946
8947 // The platform variant of myprivlib links to the platform variant of mylib
8948 // and bypasses its stubs.
8949 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 +09008950}
8951
Martin Stjernholmec009002021-03-27 15:18:31 +00008952func TestTestForForLibInOtherApex(t *testing.T) {
8953 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8954 _ = testApex(t, `
8955 apex {
8956 name: "com.android.art",
8957 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008958 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008959 updatable: false,
8960 }
8961
8962 apex {
8963 name: "com.android.art.debug",
8964 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008965 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008966 updatable: false,
8967 }
8968
8969 apex_key {
8970 name: "myapex.key",
8971 public_key: "testkey.avbpubkey",
8972 private_key: "testkey.pem",
8973 }
8974
8975 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008976 name: "libnativebridge",
8977 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008978 system_shared_libs: [],
8979 stl: "none",
8980 stubs: {
8981 versions: ["1"],
8982 },
8983 apex_available: ["com.android.art", "com.android.art.debug"],
8984 }
8985
8986 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008987 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008988 srcs: ["mylib.cpp"],
8989 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008990 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008991 stl: "none",
8992 apex_available: ["com.android.art.debug"],
8993 test_for: ["com.android.art"],
8994 }
8995 `,
8996 android.MockFS{
8997 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8998 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8999 }.AddToFixture())
9000}
9001
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009002// TODO(jungjw): Move this to proptools
9003func intPtr(i int) *int {
9004 return &i
9005}
9006
9007func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009008 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009009 apex_set {
9010 name: "myapex",
9011 set: "myapex.apks",
9012 filename: "foo_v2.apex",
9013 overrides: ["foo"],
9014 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009015 `,
9016 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9017 variables.Platform_sdk_version = intPtr(30)
9018 }),
9019 android.FixtureModifyConfig(func(config android.Config) {
9020 config.Targets[android.Android] = []android.Target{
9021 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9022 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9023 }
9024 }),
9025 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009026
Paul Duffin24704672021-04-06 16:09:30 +01009027 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009028
9029 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009030 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009031 actual := extractedApex.Args["abis"]
9032 expected := "ARMEABI_V7A,ARM64_V8A"
9033 if actual != expected {
9034 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9035 }
9036 actual = extractedApex.Args["sdk-version"]
9037 expected = "30"
9038 if actual != expected {
9039 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9040 }
9041
Paul Duffin6717d882021-06-15 19:09:41 +01009042 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009043 a := m.Module().(*ApexSet)
9044 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009045 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009046 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9047 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9048 }
9049}
9050
Anton Hansson805e0a52022-11-25 14:06:46 +00009051func TestApexSet_NativeBridge(t *testing.T) {
9052 ctx := testApex(t, `
9053 apex_set {
9054 name: "myapex",
9055 set: "myapex.apks",
9056 filename: "foo_v2.apex",
9057 overrides: ["foo"],
9058 }
9059 `,
9060 android.FixtureModifyConfig(func(config android.Config) {
9061 config.Targets[android.Android] = []android.Target{
9062 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9063 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9064 }
9065 }),
9066 )
9067
9068 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
9069
9070 // Check extract_apks tool parameters. No native bridge arch expected
9071 extractedApex := m.Output("extracted/myapex.apks")
9072 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9073}
9074
Jiyong Park7d95a512020-05-10 15:16:24 +09009075func TestNoStaticLinkingToStubsLib(t *testing.T) {
9076 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9077 apex {
9078 name: "myapex",
9079 key: "myapex.key",
9080 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009081 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009082 }
9083
9084 apex_key {
9085 name: "myapex.key",
9086 public_key: "testkey.avbpubkey",
9087 private_key: "testkey.pem",
9088 }
9089
9090 cc_library {
9091 name: "mylib",
9092 srcs: ["mylib.cpp"],
9093 static_libs: ["otherlib"],
9094 system_shared_libs: [],
9095 stl: "none",
9096 apex_available: [ "myapex" ],
9097 }
9098
9099 cc_library {
9100 name: "otherlib",
9101 srcs: ["mylib.cpp"],
9102 system_shared_libs: [],
9103 stl: "none",
9104 stubs: {
9105 versions: ["1", "2", "3"],
9106 },
9107 apex_available: [ "myapex" ],
9108 }
9109 `)
9110}
9111
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009112func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009113 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009114 apex {
9115 name: "myapex",
9116 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009117 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009118 custom_sign_tool: "sign_myapex",
9119 }
9120
9121 apex_key {
9122 name: "myapex.key",
9123 public_key: "testkey.avbpubkey",
9124 private_key: "testkey.pem",
9125 }
9126 `)
9127
Jooyung Han286957d2023-10-30 16:17:56 +09009128 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
9129 content := myapex.Output("apexkeys.txt").BuildParams.Args["content"]
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009130 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" sign_tool="sign_myapex"`)
Jooyung Han09c11ad2021-10-27 03:45:31 +09009131}
9132
9133func TestApexKeysTxtOverrides(t *testing.T) {
9134 ctx := testApex(t, `
9135 apex {
9136 name: "myapex",
9137 key: "myapex.key",
9138 updatable: false,
9139 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009140 }
9141
9142 apex_key {
9143 name: "myapex.key",
9144 public_key: "testkey.avbpubkey",
9145 private_key: "testkey.pem",
9146 }
9147
9148 prebuilt_apex {
9149 name: "myapex",
9150 prefer: true,
9151 arch: {
9152 arm64: {
9153 src: "myapex-arm64.apex",
9154 },
9155 arm: {
9156 src: "myapex-arm.apex",
9157 },
9158 },
9159 }
9160
9161 apex_set {
9162 name: "myapex_set",
9163 set: "myapex.apks",
9164 filename: "myapex_set.apex",
9165 overrides: ["myapex"],
9166 }
9167 `)
9168
Jooyung Han286957d2023-10-30 16:17:56 +09009169 content := ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt").BuildParams.Args["content"]
9170 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" sign_tool="sign_myapex"`)
9171 content = ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt").BuildParams.Args["content"]
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009172 ensureContains(t, content, `name="myapex_set.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`)
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009173}
9174
Jooyung Han938b5932020-06-20 12:47:47 +09009175func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009176 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009177 apex {
9178 name: "myapex",
9179 key: "myapex.key",
9180 apps: ["app"],
9181 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009182 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009183 }
9184
9185 apex_key {
9186 name: "myapex.key",
9187 public_key: "testkey.avbpubkey",
9188 private_key: "testkey.pem",
9189 }
9190
9191 android_app {
9192 name: "app",
9193 srcs: ["foo/bar/MyClass.java"],
9194 package_name: "foo",
9195 sdk_version: "none",
9196 system_modules: "none",
9197 apex_available: [ "myapex" ],
9198 }
9199 `, withFiles(map[string][]byte{
9200 "sub/Android.bp": []byte(`
9201 override_apex {
9202 name: "override_myapex",
9203 base: "myapex",
9204 apps: ["override_app"],
9205 allowed_files: ":allowed",
9206 }
9207 // Overridable "path" property should be referenced indirectly
9208 filegroup {
9209 name: "allowed",
9210 srcs: ["allowed.txt"],
9211 }
9212 override_android_app {
9213 name: "override_app",
9214 base: "app",
9215 package_name: "bar",
9216 }
9217 `),
9218 }))
9219
Jooyung Hana0503a52023-08-23 13:12:50 +09009220 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009221 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9222 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9223 }
9224
Jooyung Hana0503a52023-08-23 13:12:50 +09009225 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009226 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9227 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9228 }
9229}
9230
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009231func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009232 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009233 apex {
9234 name: "myapex",
9235 key: "myapex.key",
9236 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009237 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009238 }
9239
9240 apex_key {
9241 name: "myapex.key",
9242 public_key: "testkey.avbpubkey",
9243 private_key: "testkey.pem",
9244 }
9245
9246 cc_library {
9247 name: "mylib",
9248 srcs: ["mylib.cpp"],
9249 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009250 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009251 },
9252 apex_available: ["myapex"],
9253 }
9254
9255 cc_prebuilt_library_shared {
9256 name: "mylib",
9257 prefer: false,
9258 srcs: ["prebuilt.so"],
9259 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009260 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009261 },
9262 apex_available: ["myapex"],
9263 }
9264 `)
9265}
9266
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009267func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009268 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009269 apex {
9270 name: "myapex",
9271 key: "myapex.key",
9272 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009273 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009274 }
9275 apex_key {
9276 name: "myapex.key",
9277 public_key: "testkey.avbpubkey",
9278 private_key: "testkey.pem",
9279 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009280 `,
9281 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9282 variables.CompressedApex = proptools.BoolPtr(true)
9283 }),
9284 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009285
Jooyung Hana0503a52023-08-23 13:12:50 +09009286 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009287 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9288
Jooyung Hana0503a52023-08-23 13:12:50 +09009289 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009290 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9291
9292 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009293 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009294 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9295
9296 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009297 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009298 var builder strings.Builder
9299 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9300 androidMk := builder.String()
9301 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9302}
9303
Martin Stjernholm2856c662020-12-02 15:03:42 +00009304func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009305 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009306 apex {
9307 name: "myapex",
9308 key: "myapex.key",
9309 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009310 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009311 }
9312
9313 apex_key {
9314 name: "myapex.key",
9315 public_key: "testkey.avbpubkey",
9316 private_key: "testkey.pem",
9317 }
9318
9319 cc_library {
9320 name: "mylib",
9321 srcs: ["mylib.cpp"],
9322 apex_available: ["myapex"],
9323 shared_libs: ["otherlib"],
9324 system_shared_libs: [],
9325 }
9326
9327 cc_library {
9328 name: "otherlib",
9329 srcs: ["mylib.cpp"],
9330 stubs: {
9331 versions: ["current"],
9332 },
9333 }
9334
9335 cc_prebuilt_library_shared {
9336 name: "otherlib",
9337 prefer: true,
9338 srcs: ["prebuilt.so"],
9339 stubs: {
9340 versions: ["current"],
9341 },
9342 }
9343 `)
9344
Jooyung Hana0503a52023-08-23 13:12:50 +09009345 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009346 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009347 var builder strings.Builder
9348 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9349 androidMk := builder.String()
9350
9351 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9352 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009353 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009354}
9355
Jiyong Parke3867542020-12-03 17:28:25 +09009356func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009357 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009358 apex {
9359 name: "myapex",
9360 key: "myapex.key",
9361 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009362 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009363 }
9364
9365 apex_key {
9366 name: "myapex.key",
9367 public_key: "testkey.avbpubkey",
9368 private_key: "testkey.pem",
9369 }
9370
9371 cc_library {
9372 name: "mylib",
9373 srcs: ["mylib.cpp"],
9374 system_shared_libs: [],
9375 stl: "none",
9376 apex_available: ["myapex"],
9377 shared_libs: ["mylib2"],
9378 target: {
9379 apex: {
9380 exclude_shared_libs: ["mylib2"],
9381 },
9382 },
9383 }
9384
9385 cc_library {
9386 name: "mylib2",
9387 srcs: ["mylib.cpp"],
9388 system_shared_libs: [],
9389 stl: "none",
9390 }
9391 `)
9392
9393 // Check if mylib is linked to mylib2 for the non-apex target
9394 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9395 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9396
9397 // Make sure that the link doesn't occur for the apex target
9398 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9399 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9400
9401 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009402 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009403 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9404}
9405
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009406func TestPrebuiltStubLibDep(t *testing.T) {
9407 bpBase := `
9408 apex {
9409 name: "myapex",
9410 key: "myapex.key",
9411 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009412 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009413 }
9414 apex_key {
9415 name: "myapex.key",
9416 public_key: "testkey.avbpubkey",
9417 private_key: "testkey.pem",
9418 }
9419 cc_library {
9420 name: "mylib",
9421 srcs: ["mylib.cpp"],
9422 apex_available: ["myapex"],
9423 shared_libs: ["stublib"],
9424 system_shared_libs: [],
9425 }
9426 apex {
9427 name: "otherapex",
9428 enabled: %s,
9429 key: "myapex.key",
9430 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009431 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009432 }
9433 `
9434
9435 stublibSourceBp := `
9436 cc_library {
9437 name: "stublib",
9438 srcs: ["mylib.cpp"],
9439 apex_available: ["otherapex"],
9440 system_shared_libs: [],
9441 stl: "none",
9442 stubs: {
9443 versions: ["1"],
9444 },
9445 }
9446 `
9447
9448 stublibPrebuiltBp := `
9449 cc_prebuilt_library_shared {
9450 name: "stublib",
9451 srcs: ["prebuilt.so"],
9452 apex_available: ["otherapex"],
9453 stubs: {
9454 versions: ["1"],
9455 },
9456 %s
9457 }
9458 `
9459
9460 tests := []struct {
9461 name string
9462 stublibBp string
9463 usePrebuilt bool
9464 modNames []string // Modules to collect AndroidMkEntries for
9465 otherApexEnabled []string
9466 }{
9467 {
9468 name: "only_source",
9469 stublibBp: stublibSourceBp,
9470 usePrebuilt: false,
9471 modNames: []string{"stublib"},
9472 otherApexEnabled: []string{"true", "false"},
9473 },
9474 {
9475 name: "source_preferred",
9476 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9477 usePrebuilt: false,
9478 modNames: []string{"stublib", "prebuilt_stublib"},
9479 otherApexEnabled: []string{"true", "false"},
9480 },
9481 {
9482 name: "prebuilt_preferred",
9483 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9484 usePrebuilt: true,
9485 modNames: []string{"stublib", "prebuilt_stublib"},
9486 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9487 },
9488 {
9489 name: "only_prebuilt",
9490 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9491 usePrebuilt: true,
9492 modNames: []string{"stublib"},
9493 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9494 },
9495 }
9496
9497 for _, test := range tests {
9498 t.Run(test.name, func(t *testing.T) {
9499 for _, otherApexEnabled := range test.otherApexEnabled {
9500 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009501 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009502
9503 type modAndMkEntries struct {
9504 mod *cc.Module
9505 mkEntries android.AndroidMkEntries
9506 }
9507 entries := []*modAndMkEntries{}
9508
9509 // Gather shared lib modules that are installable
9510 for _, modName := range test.modNames {
9511 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9512 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9513 continue
9514 }
9515 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009516 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009517 continue
9518 }
Colin Crossaa255532020-07-03 13:18:24 -07009519 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009520 if ent.Disabled {
9521 continue
9522 }
9523 entries = append(entries, &modAndMkEntries{
9524 mod: mod,
9525 mkEntries: ent,
9526 })
9527 }
9528 }
9529 }
9530
9531 var entry *modAndMkEntries = nil
9532 for _, ent := range entries {
9533 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9534 if entry != nil {
9535 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9536 } else {
9537 entry = ent
9538 }
9539 }
9540 }
9541
9542 if entry == nil {
9543 t.Errorf("AndroidMk entry for \"stublib\" missing")
9544 } else {
9545 isPrebuilt := entry.mod.Prebuilt() != nil
9546 if isPrebuilt != test.usePrebuilt {
9547 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9548 }
9549 if !entry.mod.IsStubs() {
9550 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9551 }
9552 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9553 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9554 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009555 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009556 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009557 if !android.InList(expected, cflags) {
9558 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9559 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009560 }
9561 })
9562 }
9563 })
9564 }
9565}
9566
Colin Crossc33e5212021-05-25 18:16:02 -07009567func TestApexJavaCoverage(t *testing.T) {
9568 bp := `
9569 apex {
9570 name: "myapex",
9571 key: "myapex.key",
9572 java_libs: ["mylib"],
9573 bootclasspath_fragments: ["mybootclasspathfragment"],
9574 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9575 updatable: false,
9576 }
9577
9578 apex_key {
9579 name: "myapex.key",
9580 public_key: "testkey.avbpubkey",
9581 private_key: "testkey.pem",
9582 }
9583
9584 java_library {
9585 name: "mylib",
9586 srcs: ["mylib.java"],
9587 apex_available: ["myapex"],
9588 compile_dex: true,
9589 }
9590
9591 bootclasspath_fragment {
9592 name: "mybootclasspathfragment",
9593 contents: ["mybootclasspathlib"],
9594 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009595 hidden_api: {
9596 split_packages: ["*"],
9597 },
Colin Crossc33e5212021-05-25 18:16:02 -07009598 }
9599
9600 java_library {
9601 name: "mybootclasspathlib",
9602 srcs: ["mybootclasspathlib.java"],
9603 apex_available: ["myapex"],
9604 compile_dex: true,
9605 }
9606
9607 systemserverclasspath_fragment {
9608 name: "mysystemserverclasspathfragment",
9609 contents: ["mysystemserverclasspathlib"],
9610 apex_available: ["myapex"],
9611 }
9612
9613 java_library {
9614 name: "mysystemserverclasspathlib",
9615 srcs: ["mysystemserverclasspathlib.java"],
9616 apex_available: ["myapex"],
9617 compile_dex: true,
9618 }
9619 `
9620
9621 result := android.GroupFixturePreparers(
9622 PrepareForTestWithApexBuildComponents,
9623 prepareForTestWithMyapex,
9624 java.PrepareForTestWithJavaDefaultModules,
9625 android.PrepareForTestWithAndroidBuildComponents,
9626 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009627 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9628 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009629 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009630 ).RunTest(t)
9631
9632 // Make sure jacoco ran on both mylib and mybootclasspathlib
9633 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9634 t.Errorf("Failed to find jacoco rule for mylib")
9635 }
9636 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9637 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9638 }
9639 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9640 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9641 }
9642}
9643
Jiyong Park192600a2021-08-03 07:52:17 +00009644func TestProhibitStaticExecutable(t *testing.T) {
9645 testApexError(t, `executable mybin is static`, `
9646 apex {
9647 name: "myapex",
9648 key: "myapex.key",
9649 binaries: ["mybin"],
9650 min_sdk_version: "29",
9651 }
9652
9653 apex_key {
9654 name: "myapex.key",
9655 public_key: "testkey.avbpubkey",
9656 private_key: "testkey.pem",
9657 }
9658
9659 cc_binary {
9660 name: "mybin",
9661 srcs: ["mylib.cpp"],
9662 relative_install_path: "foo/bar",
9663 static_executable: true,
9664 system_shared_libs: [],
9665 stl: "none",
9666 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009667 min_sdk_version: "29",
9668 }
9669 `)
9670
9671 testApexError(t, `executable mybin.rust is static`, `
9672 apex {
9673 name: "myapex",
9674 key: "myapex.key",
9675 binaries: ["mybin.rust"],
9676 min_sdk_version: "29",
9677 }
9678
9679 apex_key {
9680 name: "myapex.key",
9681 public_key: "testkey.avbpubkey",
9682 private_key: "testkey.pem",
9683 }
9684
9685 rust_binary {
9686 name: "mybin.rust",
9687 srcs: ["foo.rs"],
9688 static_executable: true,
9689 apex_available: ["myapex"],
9690 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009691 }
9692 `)
9693}
9694
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009695func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9696 ctx := testApex(t, `
9697 apex {
9698 name: "myapex",
9699 key: "myapex.key",
9700 updatable: false,
9701 java_libs: ["foo"],
9702 }
9703
9704 apex_key {
9705 name: "myapex.key",
9706 public_key: "testkey.avbpubkey",
9707 private_key: "testkey.pem",
9708 }
9709
9710 java_library {
9711 name: "foo",
9712 srcs: ["foo.java"],
9713 apex_available: ["myapex"],
9714 installable: true,
9715 }
9716 `,
9717 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9718 )
9719
Jooyung Hana0503a52023-08-23 13:12:50 +09009720 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009721 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9722 var builder strings.Builder
9723 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9724 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009725 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.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 +00009726}
9727
9728func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9729 ctx := testApex(t, `
9730 prebuilt_apex {
9731 name: "myapex",
9732 arch: {
9733 arm64: {
9734 src: "myapex-arm64.apex",
9735 },
9736 arm: {
9737 src: "myapex-arm.apex",
9738 },
9739 },
9740 exported_java_libs: ["foo"],
9741 }
9742
9743 java_import {
9744 name: "foo",
9745 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009746 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009747 }
9748 `,
9749 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9750 )
9751
9752 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9753 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9754 mainModuleEntries := entriesList[0]
9755 android.AssertArrayString(t,
9756 "LOCAL_REQUIRED_MODULES",
9757 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9758 []string{
9759 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9760 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9761 })
9762}
9763
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009764func TestAndroidMk_RequiredModules(t *testing.T) {
9765 ctx := testApex(t, `
9766 apex {
9767 name: "myapex",
9768 key: "myapex.key",
9769 updatable: false,
9770 java_libs: ["foo"],
9771 required: ["otherapex"],
9772 }
9773
9774 apex {
9775 name: "otherapex",
9776 key: "myapex.key",
9777 updatable: false,
9778 java_libs: ["foo"],
9779 required: ["otherapex"],
9780 }
9781
9782 apex_key {
9783 name: "myapex.key",
9784 public_key: "testkey.avbpubkey",
9785 private_key: "testkey.pem",
9786 }
9787
9788 java_library {
9789 name: "foo",
9790 srcs: ["foo.java"],
9791 apex_available: ["myapex", "otherapex"],
9792 installable: true,
9793 }
9794 `)
9795
Jooyung Hana0503a52023-08-23 13:12:50 +09009796 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009797 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9798 var builder strings.Builder
9799 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9800 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009801 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009802}
9803
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009804func TestAndroidMk_RequiredDeps(t *testing.T) {
9805 ctx := testApex(t, `
9806 apex {
9807 name: "myapex",
9808 key: "myapex.key",
9809 updatable: false,
9810 }
9811
9812 apex_key {
9813 name: "myapex.key",
9814 public_key: "testkey.avbpubkey",
9815 private_key: "testkey.pem",
9816 }
9817 `)
9818
Jooyung Hana0503a52023-08-23 13:12:50 +09009819 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009820 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009821 data := android.AndroidMkDataForTest(t, ctx, bundle)
9822 var builder strings.Builder
9823 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9824 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009825 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009826}
9827
Jooyung Hana6d36672022-02-24 13:58:07 +09009828func TestApexOutputFileProducer(t *testing.T) {
9829 for _, tc := range []struct {
9830 name string
9831 ref string
9832 expected_data []string
9833 }{
9834 {
9835 name: "test_using_output",
9836 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009837 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009838 },
9839 {
9840 name: "test_using_apex",
9841 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009842 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009843 },
9844 } {
9845 t.Run(tc.name, func(t *testing.T) {
9846 ctx := testApex(t, `
9847 apex {
9848 name: "myapex",
9849 key: "myapex.key",
9850 compressible: true,
9851 updatable: false,
9852 }
9853
9854 apex_key {
9855 name: "myapex.key",
9856 public_key: "testkey.avbpubkey",
9857 private_key: "testkey.pem",
9858 }
9859
9860 java_test {
9861 name: "`+tc.name+`",
9862 srcs: ["a.java"],
9863 data: ["`+tc.ref+`"],
9864 }
9865 `,
9866 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9867 variables.CompressedApex = proptools.BoolPtr(true)
9868 }))
9869 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9870 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9871 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9872 })
9873 }
9874}
9875
satayev758968a2021-12-06 11:42:40 +00009876func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9877 preparer := android.GroupFixturePreparers(
9878 PrepareForTestWithApexBuildComponents,
9879 prepareForTestWithMyapex,
9880 java.PrepareForTestWithJavaSdkLibraryFiles,
9881 java.PrepareForTestWithJavaDefaultModules,
9882 android.PrepareForTestWithAndroidBuildComponents,
9883 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9884 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9885 )
9886
9887 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9888 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9889 preparer.RunTestWithBp(t, `
9890 apex {
9891 name: "myapex",
9892 key: "myapex.key",
9893 bootclasspath_fragments: ["mybootclasspathfragment"],
9894 min_sdk_version: "30",
9895 updatable: false,
9896 }
9897
9898 apex_key {
9899 name: "myapex.key",
9900 public_key: "testkey.avbpubkey",
9901 private_key: "testkey.pem",
9902 }
9903
9904 bootclasspath_fragment {
9905 name: "mybootclasspathfragment",
9906 contents: ["mybootclasspathlib"],
9907 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009908 hidden_api: {
9909 split_packages: ["*"],
9910 },
satayev758968a2021-12-06 11:42:40 +00009911 }
9912
9913 java_sdk_library {
9914 name: "mybootclasspathlib",
9915 srcs: ["mybootclasspathlib.java"],
9916 apex_available: ["myapex"],
9917 compile_dex: true,
9918 unsafe_ignore_missing_latest_api: true,
9919 min_sdk_version: "31",
9920 static_libs: ["util"],
9921 }
9922
9923 java_library {
9924 name: "util",
9925 srcs: ["a.java"],
9926 apex_available: ["myapex"],
9927 min_sdk_version: "31",
9928 static_libs: ["another_util"],
9929 }
9930
9931 java_library {
9932 name: "another_util",
9933 srcs: ["a.java"],
9934 min_sdk_version: "31",
9935 apex_available: ["myapex"],
9936 }
9937 `)
9938 })
9939
9940 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9941 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9942 preparer.RunTestWithBp(t, `
9943 apex {
9944 name: "myapex",
9945 key: "myapex.key",
9946 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9947 min_sdk_version: "30",
9948 updatable: false,
9949 }
9950
9951 apex_key {
9952 name: "myapex.key",
9953 public_key: "testkey.avbpubkey",
9954 private_key: "testkey.pem",
9955 }
9956
9957 systemserverclasspath_fragment {
9958 name: "mysystemserverclasspathfragment",
9959 contents: ["mysystemserverclasspathlib"],
9960 apex_available: ["myapex"],
9961 }
9962
9963 java_sdk_library {
9964 name: "mysystemserverclasspathlib",
9965 srcs: ["mysystemserverclasspathlib.java"],
9966 apex_available: ["myapex"],
9967 compile_dex: true,
9968 min_sdk_version: "32",
9969 unsafe_ignore_missing_latest_api: true,
9970 static_libs: ["util"],
9971 }
9972
9973 java_library {
9974 name: "util",
9975 srcs: ["a.java"],
9976 apex_available: ["myapex"],
9977 min_sdk_version: "31",
9978 static_libs: ["another_util"],
9979 }
9980
9981 java_library {
9982 name: "another_util",
9983 srcs: ["a.java"],
9984 min_sdk_version: "31",
9985 apex_available: ["myapex"],
9986 }
9987 `)
9988 })
9989
9990 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9991 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9992 RunTestWithBp(t, `
9993 apex {
9994 name: "myapex",
9995 key: "myapex.key",
9996 bootclasspath_fragments: ["mybootclasspathfragment"],
9997 min_sdk_version: "30",
9998 updatable: false,
9999 }
10000
10001 apex_key {
10002 name: "myapex.key",
10003 public_key: "testkey.avbpubkey",
10004 private_key: "testkey.pem",
10005 }
10006
10007 bootclasspath_fragment {
10008 name: "mybootclasspathfragment",
10009 contents: ["mybootclasspathlib"],
10010 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010011 hidden_api: {
10012 split_packages: ["*"],
10013 },
satayev758968a2021-12-06 11:42:40 +000010014 }
10015
10016 java_sdk_library {
10017 name: "mybootclasspathlib",
10018 srcs: ["mybootclasspathlib.java"],
10019 apex_available: ["myapex"],
10020 compile_dex: true,
10021 unsafe_ignore_missing_latest_api: true,
10022 }
10023 `)
10024 })
10025
10026 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10027 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10028 RunTestWithBp(t, `
10029 apex {
10030 name: "myapex",
10031 key: "myapex.key",
10032 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10033 min_sdk_version: "30",
10034 updatable: false,
10035 }
10036
10037 apex_key {
10038 name: "myapex.key",
10039 public_key: "testkey.avbpubkey",
10040 private_key: "testkey.pem",
10041 }
10042
10043 systemserverclasspath_fragment {
10044 name: "mysystemserverclasspathfragment",
10045 contents: ["mysystemserverclasspathlib"],
10046 apex_available: ["myapex"],
10047 }
10048
10049 java_sdk_library {
10050 name: "mysystemserverclasspathlib",
10051 srcs: ["mysystemserverclasspathlib.java"],
10052 apex_available: ["myapex"],
10053 compile_dex: true,
10054 unsafe_ignore_missing_latest_api: true,
10055 }
10056 `)
10057 })
10058}
10059
Jiakai Zhang6decef92022-01-12 17:56:19 +000010060// Verifies that the APEX depends on all the Make modules in the list.
10061func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10062 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10063 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010064 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010065 }
10066}
10067
10068// Verifies that the APEX does not depend on any of the Make modules in the list.
10069func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10070 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10071 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010072 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010073 }
10074}
10075
Cole Faust1021ccd2023-02-26 21:15:25 -080010076// TODO(b/193460475): Re-enable this test
10077//func TestApexStrictUpdtabilityLint(t *testing.T) {
10078// bpTemplate := `
10079// apex {
10080// name: "myapex",
10081// key: "myapex.key",
10082// java_libs: ["myjavalib"],
10083// updatable: %v,
10084// min_sdk_version: "29",
10085// }
10086// apex_key {
10087// name: "myapex.key",
10088// }
10089// java_library {
10090// name: "myjavalib",
10091// srcs: ["MyClass.java"],
10092// apex_available: [ "myapex" ],
10093// lint: {
10094// strict_updatability_linting: %v,
10095// },
10096// sdk_version: "current",
10097// min_sdk_version: "29",
10098// }
10099// `
10100// fs := android.MockFS{
10101// "lint-baseline.xml": nil,
10102// }
10103//
10104// testCases := []struct {
10105// testCaseName string
10106// apexUpdatable bool
10107// javaStrictUpdtabilityLint bool
10108// lintFileExists bool
10109// disallowedFlagExpected bool
10110// }{
10111// {
10112// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10113// apexUpdatable: true,
10114// javaStrictUpdtabilityLint: true,
10115// lintFileExists: false,
10116// disallowedFlagExpected: false,
10117// },
10118// {
10119// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10120// apexUpdatable: false,
10121// javaStrictUpdtabilityLint: false,
10122// lintFileExists: true,
10123// disallowedFlagExpected: false,
10124// },
10125// {
10126// testCaseName: "non-updatable apex respects strict updatability of javalib",
10127// apexUpdatable: false,
10128// javaStrictUpdtabilityLint: true,
10129// lintFileExists: true,
10130// disallowedFlagExpected: true,
10131// },
10132// {
10133// testCaseName: "updatable apex sets strict updatability of javalib to true",
10134// apexUpdatable: true,
10135// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10136// lintFileExists: true,
10137// disallowedFlagExpected: true,
10138// },
10139// }
10140//
10141// for _, testCase := range testCases {
10142// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10143// fixtures := []android.FixturePreparer{}
10144// if testCase.lintFileExists {
10145// fixtures = append(fixtures, fs.AddToFixture())
10146// }
10147//
10148// result := testApex(t, bp, fixtures...)
10149// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10150// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10151// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10152//
10153// if disallowedFlagActual != testCase.disallowedFlagExpected {
10154// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10155// }
10156// }
10157//}
10158//
10159//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10160// bp := `
10161// apex {
10162// name: "myapex",
10163// key: "myapex.key",
10164// java_libs: ["myjavalib"],
10165// updatable: true,
10166// min_sdk_version: "29",
10167// }
10168// apex_key {
10169// name: "myapex.key",
10170// }
10171// java_library {
10172// name: "myjavalib",
10173// srcs: ["MyClass.java"],
10174// apex_available: [ "myapex" ],
10175// sdk_version: "current",
10176// min_sdk_version: "29",
10177// }
10178// `
10179//
10180// testCases := []struct {
10181// testCaseName string
10182// moduleDirectory string
10183// disallowedFlagExpected bool
10184// }{
10185// {
10186// testCaseName: "lintable module defined outside libcore",
10187// moduleDirectory: "",
10188// disallowedFlagExpected: true,
10189// },
10190// {
10191// testCaseName: "lintable module defined in libcore root directory",
10192// moduleDirectory: "libcore/",
10193// disallowedFlagExpected: false,
10194// },
10195// {
10196// testCaseName: "lintable module defined in libcore child directory",
10197// moduleDirectory: "libcore/childdir/",
10198// disallowedFlagExpected: true,
10199// },
10200// }
10201//
10202// for _, testCase := range testCases {
10203// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10204// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10205// result := testApex(t, "", lintFileCreator, bpFileCreator)
10206// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10207// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10208// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10209// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10210//
10211// if disallowedFlagActual != testCase.disallowedFlagExpected {
10212// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10213// }
10214// }
10215//}
10216//
10217//// checks transtive deps of an apex coming from bootclasspath_fragment
10218//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10219// bp := `
10220// apex {
10221// name: "myapex",
10222// key: "myapex.key",
10223// bootclasspath_fragments: ["mybootclasspathfragment"],
10224// updatable: true,
10225// min_sdk_version: "29",
10226// }
10227// apex_key {
10228// name: "myapex.key",
10229// }
10230// bootclasspath_fragment {
10231// name: "mybootclasspathfragment",
10232// contents: ["myjavalib"],
10233// apex_available: ["myapex"],
10234// hidden_api: {
10235// split_packages: ["*"],
10236// },
10237// }
10238// java_library {
10239// name: "myjavalib",
10240// srcs: ["MyClass.java"],
10241// apex_available: [ "myapex" ],
10242// sdk_version: "current",
10243// min_sdk_version: "29",
10244// compile_dex: true,
10245// }
10246// `
10247// fs := android.MockFS{
10248// "lint-baseline.xml": nil,
10249// }
10250//
10251// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10252// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10253// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10254// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10255// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10256// }
10257//}
Spandan Das66773252022-01-15 00:23:18 +000010258
Spandan Das42e89502022-05-06 22:12:55 +000010259// updatable apexes should propagate updatable=true to its apps
10260func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10261 bp := `
10262 apex {
10263 name: "myapex",
10264 key: "myapex.key",
10265 updatable: %v,
10266 apps: [
10267 "myapp",
10268 ],
10269 min_sdk_version: "30",
10270 }
10271 apex_key {
10272 name: "myapex.key",
10273 }
10274 android_app {
10275 name: "myapp",
10276 updatable: %v,
10277 apex_available: [
10278 "myapex",
10279 ],
10280 sdk_version: "current",
10281 min_sdk_version: "30",
10282 }
10283 `
10284 testCases := []struct {
10285 name string
10286 apex_is_updatable_bp bool
10287 app_is_updatable_bp bool
10288 app_is_updatable_expected bool
10289 }{
10290 {
10291 name: "Non-updatable apex respects updatable property of non-updatable app",
10292 apex_is_updatable_bp: false,
10293 app_is_updatable_bp: false,
10294 app_is_updatable_expected: false,
10295 },
10296 {
10297 name: "Non-updatable apex respects updatable property of updatable app",
10298 apex_is_updatable_bp: false,
10299 app_is_updatable_bp: true,
10300 app_is_updatable_expected: true,
10301 },
10302 {
10303 name: "Updatable apex respects updatable property of updatable app",
10304 apex_is_updatable_bp: true,
10305 app_is_updatable_bp: true,
10306 app_is_updatable_expected: true,
10307 },
10308 {
10309 name: "Updatable apex sets updatable=true on non-updatable app",
10310 apex_is_updatable_bp: true,
10311 app_is_updatable_bp: false,
10312 app_is_updatable_expected: true,
10313 },
10314 }
10315 for _, testCase := range testCases {
10316 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10317 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10318 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10319 }
10320}
10321
Kiyoung Kim487689e2022-07-26 09:48:22 +090010322func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10323 bp := `
10324 apex {
10325 name: "myapex",
10326 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010327 native_shared_libs: ["libbaz"],
10328 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010329 min_sdk_version: "29",
10330 }
10331 apex_key {
10332 name: "myapex.key",
10333 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010334 cc_binary {
10335 name: "binfoo",
10336 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010337 apex_available: ["myapex"],
10338 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010339 recovery_available: false,
10340 }
10341 cc_library {
10342 name: "libbar",
10343 srcs: ["libbar.cc"],
10344 stubs: {
10345 symbol_file: "libbar.map.txt",
10346 versions: [
10347 "29",
10348 ],
10349 },
10350 }
10351 cc_library {
10352 name: "libbaz",
10353 srcs: ["libbaz.cc"],
10354 apex_available: ["myapex"],
10355 min_sdk_version: "29",
10356 stubs: {
10357 symbol_file: "libbaz.map.txt",
10358 versions: [
10359 "29",
10360 ],
10361 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010362 }
10363 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010364 name: "libbar",
10365 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010366 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010367 variants: ["apex.29"],
10368 }
10369 cc_api_variant {
10370 name: "libbar",
10371 variant: "apex",
10372 version: "29",
10373 src: "libbar_apex_29.so",
10374 }
10375 cc_api_library {
10376 name: "libbaz",
10377 src: "libbaz_stub.so",
10378 min_sdk_version: "29",
10379 variants: ["apex.29"],
10380 }
10381 cc_api_variant {
10382 name: "libbaz",
10383 variant: "apex",
10384 version: "29",
10385 src: "libbaz_apex_29.so",
10386 }
10387 cc_api_library {
10388 name: "libqux",
10389 src: "libqux_stub.so",
10390 min_sdk_version: "29",
10391 variants: ["apex.29"],
10392 }
10393 cc_api_variant {
10394 name: "libqux",
10395 variant: "apex",
10396 version: "29",
10397 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010398 }
10399 api_imports {
10400 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010401 apex_shared_libs: [
10402 "libbar",
10403 "libbaz",
10404 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010405 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010406 }
10407 `
10408 result := testApex(t, bp)
10409
10410 hasDep := func(m android.Module, wantDep android.Module) bool {
10411 t.Helper()
10412 var found bool
10413 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10414 if dep == wantDep {
10415 found = true
10416 }
10417 })
10418 return found
10419 }
10420
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010421 // Library defines stubs and cc_api_library should be used with cc_api_library
10422 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10423 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10424 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010425
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010426 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10427 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010428
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010429 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10430 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10431 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10432 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10433
10434 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10435 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10436 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10437 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10438 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10439
10440 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10441 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10442 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10443
10444 // cc_api_library defined without original library should be linked with cc_api_library
10445 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10446 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10447 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10448}
10449
10450func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10451 bp := `
10452 apex {
10453 name: "myapex",
10454 key: "myapex.key",
10455 native_shared_libs: ["libbar"],
10456 min_sdk_version: "29",
10457 }
10458 apex_key {
10459 name: "myapex.key",
10460 }
10461 cc_binary {
10462 name: "binfoo",
10463 shared_libs: ["libbar"],
10464 recovery_available: false,
10465 }
10466 cc_library {
10467 name: "libbar",
10468 srcs: ["libbar.cc"],
10469 apex_available: ["myapex"],
10470 min_sdk_version: "29",
10471 stubs: {
10472 symbol_file: "libbar.map.txt",
10473 versions: [
10474 "29",
10475 ],
10476 },
10477 }
10478 cc_api_library {
10479 name: "libbar",
10480 src: "libbar_stub.so",
10481 variants: ["apex.29"],
10482 }
10483 cc_api_variant {
10484 name: "libbar",
10485 variant: "apex",
10486 version: "29",
10487 src: "libbar_apex_29.so",
10488 }
10489 api_imports {
10490 name: "api_imports",
10491 apex_shared_libs: [
10492 "libbar",
10493 ],
10494 }
10495 `
10496
10497 result := testApex(t, bp)
10498
10499 hasDep := func(m android.Module, wantDep android.Module) bool {
10500 t.Helper()
10501 var found bool
10502 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10503 if dep == wantDep {
10504 found = true
10505 }
10506 })
10507 return found
10508 }
10509
10510 // Library defines stubs and cc_api_library should be used with cc_api_library
10511 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10512 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10513 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10514
10515 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10516 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10517
10518 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10519 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10520 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10521 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010522}
Dennis Shend4f5d932023-01-31 20:27:21 +000010523
10524func TestTrimmedApex(t *testing.T) {
10525 bp := `
10526 apex {
10527 name: "myapex",
10528 key: "myapex.key",
10529 native_shared_libs: ["libfoo","libbaz"],
10530 min_sdk_version: "29",
10531 trim_against: "mydcla",
10532 }
10533 apex {
10534 name: "mydcla",
10535 key: "myapex.key",
10536 native_shared_libs: ["libfoo","libbar"],
10537 min_sdk_version: "29",
10538 file_contexts: ":myapex-file_contexts",
10539 dynamic_common_lib_apex: true,
10540 }
10541 apex_key {
10542 name: "myapex.key",
10543 }
10544 cc_library {
10545 name: "libfoo",
10546 shared_libs: ["libc"],
10547 apex_available: ["myapex","mydcla"],
10548 min_sdk_version: "29",
10549 }
10550 cc_library {
10551 name: "libbar",
10552 shared_libs: ["libc"],
10553 apex_available: ["myapex","mydcla"],
10554 min_sdk_version: "29",
10555 }
10556 cc_library {
10557 name: "libbaz",
10558 shared_libs: ["libc"],
10559 apex_available: ["myapex","mydcla"],
10560 min_sdk_version: "29",
10561 }
10562 cc_api_library {
10563 name: "libc",
10564 src: "libc.so",
10565 min_sdk_version: "29",
10566 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010567 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010568 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010569 }
10570 api_imports {
10571 name: "api_imports",
10572 shared_libs: [
10573 "libc",
10574 ],
10575 header_libs: [],
10576 }
10577 `
10578 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010579 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010580 apexRule := module.MaybeRule("apexRule")
10581 if apexRule.Rule == nil {
10582 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10583 }
10584
10585 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010586 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010587 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10588 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10589 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10590 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10591}
Jingwen Chendea7a642023-03-28 11:30:50 +000010592
10593func TestCannedFsConfig(t *testing.T) {
10594 ctx := testApex(t, `
10595 apex {
10596 name: "myapex",
10597 key: "myapex.key",
10598 updatable: false,
10599 }
10600
10601 apex_key {
10602 name: "myapex.key",
10603 public_key: "testkey.avbpubkey",
10604 private_key: "testkey.pem",
10605 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010606 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010607 generateFsRule := mod.Rule("generateFsConfig")
10608 cmd := generateFsRule.RuleParams.Command
10609
10610 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10611}
10612
10613func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10614 ctx := testApex(t, `
10615 apex {
10616 name: "myapex",
10617 key: "myapex.key",
10618 canned_fs_config: "my_config",
10619 updatable: false,
10620 }
10621
10622 apex_key {
10623 name: "myapex.key",
10624 public_key: "testkey.avbpubkey",
10625 private_key: "testkey.pem",
10626 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010627 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010628 generateFsRule := mod.Rule("generateFsConfig")
10629 cmd := generateFsRule.RuleParams.Command
10630
10631 // Ensure that canned_fs_config has "cat my_config" at the end
10632 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10633}
Spandan Das20fce2d2023-04-12 17:21:39 +000010634
10635func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10636 testCases := []struct {
10637 desc string
10638 hasStubs bool
10639 apexAvailable string
10640 expectedError string
10641 }{
10642 {
10643 desc: "non-stub library can have multiple apex_available",
10644 hasStubs: false,
10645 apexAvailable: `["myapex", "otherapex"]`,
10646 },
10647 {
10648 desc: "stub library should not be available to anyapex",
10649 hasStubs: true,
10650 apexAvailable: `["//apex_available:anyapex"]`,
10651 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10652 },
10653 {
10654 desc: "stub library should not be available to multiple apexes",
10655 hasStubs: true,
10656 apexAvailable: `["myapex", "otherapex"]`,
10657 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10658 },
10659 {
10660 desc: "stub library can be available to a core apex and a test apex",
10661 hasStubs: true,
10662 apexAvailable: `["myapex", "test_myapex"]`,
10663 },
10664 }
10665 bpTemplate := `
10666 cc_library {
10667 name: "libfoo",
10668 %v
10669 apex_available: %v,
10670 }
10671 apex {
10672 name: "myapex",
10673 key: "apex.key",
10674 updatable: false,
10675 native_shared_libs: ["libfoo"],
10676 }
10677 apex {
10678 name: "otherapex",
10679 key: "apex.key",
10680 updatable: false,
10681 }
10682 apex_test {
10683 name: "test_myapex",
10684 key: "apex.key",
10685 updatable: false,
10686 native_shared_libs: ["libfoo"],
10687 }
10688 apex_key {
10689 name: "apex.key",
10690 }
10691 `
10692 for _, tc := range testCases {
10693 stubs := ""
10694 if tc.hasStubs {
10695 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10696 }
10697 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10698 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10699 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10700 })
10701 if tc.expectedError == "" {
10702 testApex(t, bp, mockFsFixturePreparer)
10703 } else {
10704 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10705 }
10706 }
10707}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010708
10709func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10710 context := android.GroupFixturePreparers(
10711 android.PrepareForIntegrationTestWithAndroid,
10712 cc.PrepareForIntegrationTestWithCc,
10713 PrepareForTestWithApexBuildComponents,
10714 prepareForTestWithMyapex,
10715 filesystem.PrepareForTestWithFilesystemBuildComponents,
10716 )
10717 result := context.RunTestWithBp(t, `
10718 android_system_image {
10719 name: "myfilesystem",
10720 deps: [
10721 "libfoo",
10722 ],
10723 linker_config_src: "linker.config.json",
10724 }
10725
10726 cc_library {
10727 name: "libfoo",
10728 shared_libs: [
10729 "libbar",
10730 ],
10731 stl: "none",
10732 }
10733
10734 cc_library {
10735 name: "libbar",
10736 stl: "none",
10737 apex_available: ["myapex"],
10738 }
10739
10740 apex {
10741 name: "myapex",
10742 native_shared_libs: ["libbar"],
10743 key: "myapex.key",
10744 updatable: false,
10745 }
10746
10747 apex_key {
10748 name: "myapex.key",
10749 public_key: "testkey.avbpubkey",
10750 private_key: "testkey.pem",
10751 }
10752 `)
10753
10754 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10755 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10756 inputs.Strings(),
10757 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10758}