blob: 479bf1ac6544f659cd4b898a10f50de7dccbb92f [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
Colin Crossf61d03d2023-11-02 16:56:39 -0700598 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
599 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100600 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100601 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
602 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
603 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100604
Colin Crossf61d03d2023-11-02 16:56:39 -0700605 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
606 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100607 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100608 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
609 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
610 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800611}
612
Jooyung Hanf21c7972019-12-16 22:32:06 +0900613func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800614 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900615 apex_defaults {
616 name: "myapex-defaults",
617 key: "myapex.key",
618 prebuilts: ["myetc"],
619 native_shared_libs: ["mylib"],
620 java_libs: ["myjar"],
621 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900622 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800623 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000624 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900625 }
626
627 prebuilt_etc {
628 name: "myetc",
629 src: "myprebuilt",
630 }
631
632 apex {
633 name: "myapex",
634 defaults: ["myapex-defaults"],
635 }
636
637 apex_key {
638 name: "myapex.key",
639 public_key: "testkey.avbpubkey",
640 private_key: "testkey.pem",
641 }
642
643 cc_library {
644 name: "mylib",
645 system_shared_libs: [],
646 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000647 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900648 }
649
650 java_library {
651 name: "myjar",
652 srcs: ["foo/bar/MyClass.java"],
653 sdk_version: "none",
654 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000655 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900656 }
657
658 android_app {
659 name: "AppFoo",
660 srcs: ["foo/bar/MyClass.java"],
661 sdk_version: "none",
662 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000663 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900664 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900665
666 runtime_resource_overlay {
667 name: "rro",
668 theme: "blue",
669 }
670
markchien2f59ec92020-09-02 16:23:38 +0800671 bpf {
672 name: "bpf",
673 srcs: ["bpf.c", "bpf2.c"],
674 }
675
Ken Chenfad7f9d2021-11-10 22:02:57 +0800676 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800677 name: "netdTest",
678 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800679 sub_dir: "netd",
680 }
681
Jooyung Hanf21c7972019-12-16 22:32:06 +0900682 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900683 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900684 "etc/myetc",
685 "javalib/myjar.jar",
686 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000687 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900688 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800689 "etc/bpf/bpf.o",
690 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800691 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900692 })
693}
694
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800696 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900697 apex {
698 name: "myapex",
699 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000700 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900701 }
702
703 apex_key {
704 name: "myapex.key",
705 public_key: "testkey.avbpubkey",
706 private_key: "testkey.pem",
707 }
708 `)
709
Jooyung Hana0503a52023-08-23 13:12:50 +0900710 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900711 args := module.Rule("apexRule").Args
712 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
713 t.Error("manifest should be apex_manifest.pb, but " + manifest)
714 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900715}
716
Liz Kammer4854a7d2021-05-27 14:28:27 -0400717func TestApexManifestMinSdkVersion(t *testing.T) {
718 ctx := testApex(t, `
719 apex_defaults {
720 name: "my_defaults",
721 key: "myapex.key",
722 product_specific: true,
723 file_contexts: ":my-file-contexts",
724 updatable: false,
725 }
726 apex {
727 name: "myapex_30",
728 min_sdk_version: "30",
729 defaults: ["my_defaults"],
730 }
731
732 apex {
733 name: "myapex_current",
734 min_sdk_version: "current",
735 defaults: ["my_defaults"],
736 }
737
738 apex {
739 name: "myapex_none",
740 defaults: ["my_defaults"],
741 }
742
743 apex_key {
744 name: "myapex.key",
745 public_key: "testkey.avbpubkey",
746 private_key: "testkey.pem",
747 }
748
749 filegroup {
750 name: "my-file-contexts",
751 srcs: ["product_specific_file_contexts"],
752 }
753 `, withFiles(map[string][]byte{
754 "product_specific_file_contexts": nil,
755 }), android.FixtureModifyProductVariables(
756 func(variables android.FixtureProductVariables) {
757 variables.Unbundled_build = proptools.BoolPtr(true)
758 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
759 }), android.FixtureMergeEnv(map[string]string{
760 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
761 }))
762
763 testCases := []struct {
764 module string
765 minSdkVersion string
766 }{
767 {
768 module: "myapex_30",
769 minSdkVersion: "30",
770 },
771 {
772 module: "myapex_current",
773 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
774 },
775 {
776 module: "myapex_none",
777 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
778 },
779 }
780 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900781 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400782 args := module.Rule("apexRule").Args
783 optFlags := args["opt_flags"]
784 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
785 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
786 }
787 }
788}
789
Jooyung Hanaf730952023-02-28 14:13:38 +0900790func TestFileContexts(t *testing.T) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900791 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900792 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900793 if vendor {
794 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900795 }
796 ctx := testApex(t, `
797 apex {
798 name: "myapex",
799 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900800 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900801 `+prop+`
802 }
803
804 apex_key {
805 name: "myapex.key",
806 public_key: "testkey.avbpubkey",
807 private_key: "testkey.pem",
808 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900809 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900810
Jooyung Hana0503a52023-08-23 13:12:50 +0900811 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900812 if vendor {
813 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
814 rule.RuleParams.Command,
815 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900816 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900817 android.AssertStringDoesContain(t, "should force-label as system_file",
818 rule.RuleParams.Command,
819 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900820 }
821 }
822}
823
Jiyong Park25fc6a92018-11-18 18:02:45 +0900824func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800825 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900826 apex {
827 name: "myapex",
828 key: "myapex.key",
829 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900830 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000831 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900832 }
833
834 apex_key {
835 name: "myapex.key",
836 public_key: "testkey.avbpubkey",
837 private_key: "testkey.pem",
838 }
839
840 cc_library {
841 name: "mylib",
842 srcs: ["mylib.cpp"],
843 shared_libs: ["mylib2", "mylib3"],
844 system_shared_libs: [],
845 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000846 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900847 }
848
849 cc_library {
850 name: "mylib2",
851 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900852 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900853 system_shared_libs: [],
854 stl: "none",
855 stubs: {
856 versions: ["1", "2", "3"],
857 },
858 }
859
860 cc_library {
861 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900862 srcs: ["mylib.cpp"],
863 shared_libs: ["mylib4"],
864 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900865 stl: "none",
866 stubs: {
867 versions: ["10", "11", "12"],
868 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000869 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900870 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900871
872 cc_library {
873 name: "mylib4",
874 srcs: ["mylib.cpp"],
875 system_shared_libs: [],
876 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000877 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900878 }
Jiyong Park105dc322021-06-11 17:22:09 +0900879
880 rust_binary {
881 name: "foo.rust",
882 srcs: ["foo.rs"],
883 shared_libs: ["libfoo.shared_from_rust"],
884 prefer_rlib: true,
885 apex_available: ["myapex"],
886 }
887
888 cc_library_shared {
889 name: "libfoo.shared_from_rust",
890 srcs: ["mylib.cpp"],
891 system_shared_libs: [],
892 stl: "none",
893 stubs: {
894 versions: ["10", "11", "12"],
895 },
896 }
897
Jiyong Park25fc6a92018-11-18 18:02:45 +0900898 `)
899
Jooyung Hana0503a52023-08-23 13:12:50 +0900900 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900901 copyCmds := apexRule.Args["copy_commands"]
902
903 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800904 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900905
906 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800907 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900908
909 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800910 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900911
Colin Crossaede88c2020-08-11 12:17:01 -0700912 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900913
914 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900915 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900916 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900917 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900918
919 // 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 -0700920 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700922 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900923
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700924 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
925 // is replaced by sharing of "cFlags" in cc/builder.go.
926 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
927 // module variable representing "cflags". So it was not detected by ensureNotContains.
928 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
929 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
930 // including the original cflags's "-include mylib.h".
931 //
Jiyong Park64379952018-12-13 18:37:29 +0900932 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700933 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
934 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900935
Jiyong Park85cc35a2022-07-17 11:30:47 +0900936 // Ensure that genstub for platform-provided lib is invoked with --systemapi
937 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
938 // Ensure that genstub for apex-provided lib is invoked with --apex
939 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900940
Jooyung Hana0503a52023-08-23 13:12:50 +0900941 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900942 "lib64/mylib.so",
943 "lib64/mylib3.so",
944 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900945 "bin/foo.rust",
946 "lib64/libc++.so", // by the implicit dependency from foo.rust
947 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900948 })
Jiyong Park105dc322021-06-11 17:22:09 +0900949
950 // Ensure that stub dependency from a rust module is not included
951 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
952 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -0700953 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +0900954 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
955 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900956
Jooyung Hana0503a52023-08-23 13:12:50 +0900957 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +0900958 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900959}
960
Jiyong Park1bc84122021-06-22 20:23:05 +0900961func TestApexCanUsePrivateApis(t *testing.T) {
962 ctx := testApex(t, `
963 apex {
964 name: "myapex",
965 key: "myapex.key",
966 native_shared_libs: ["mylib"],
967 binaries: ["foo.rust"],
968 updatable: false,
969 platform_apis: true,
970 }
971
972 apex_key {
973 name: "myapex.key",
974 public_key: "testkey.avbpubkey",
975 private_key: "testkey.pem",
976 }
977
978 cc_library {
979 name: "mylib",
980 srcs: ["mylib.cpp"],
981 shared_libs: ["mylib2"],
982 system_shared_libs: [],
983 stl: "none",
984 apex_available: [ "myapex" ],
985 }
986
987 cc_library {
988 name: "mylib2",
989 srcs: ["mylib.cpp"],
990 cflags: ["-include mylib.h"],
991 system_shared_libs: [],
992 stl: "none",
993 stubs: {
994 versions: ["1", "2", "3"],
995 },
996 }
997
998 rust_binary {
999 name: "foo.rust",
1000 srcs: ["foo.rs"],
1001 shared_libs: ["libfoo.shared_from_rust"],
1002 prefer_rlib: true,
1003 apex_available: ["myapex"],
1004 }
1005
1006 cc_library_shared {
1007 name: "libfoo.shared_from_rust",
1008 srcs: ["mylib.cpp"],
1009 system_shared_libs: [],
1010 stl: "none",
1011 stubs: {
1012 versions: ["10", "11", "12"],
1013 },
1014 }
1015 `)
1016
Jooyung Hana0503a52023-08-23 13:12:50 +09001017 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001018 copyCmds := apexRule.Args["copy_commands"]
1019
1020 // Ensure that indirect stubs dep is not included
1021 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1022 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1023
1024 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1025 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001026 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001027 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1028 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001029 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001030 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1031 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1032}
1033
Colin Cross7812fd32020-09-25 12:35:10 -07001034func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1035 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001036 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001037 apex {
1038 name: "myapex",
1039 key: "myapex.key",
1040 native_shared_libs: ["mylib", "mylib3"],
1041 min_sdk_version: "29",
1042 }
1043
1044 apex_key {
1045 name: "myapex.key",
1046 public_key: "testkey.avbpubkey",
1047 private_key: "testkey.pem",
1048 }
1049
1050 cc_library {
1051 name: "mylib",
1052 srcs: ["mylib.cpp"],
1053 shared_libs: ["mylib2", "mylib3"],
1054 system_shared_libs: [],
1055 stl: "none",
1056 apex_available: [ "myapex" ],
1057 min_sdk_version: "28",
1058 }
1059
1060 cc_library {
1061 name: "mylib2",
1062 srcs: ["mylib.cpp"],
1063 cflags: ["-include mylib.h"],
1064 system_shared_libs: [],
1065 stl: "none",
1066 stubs: {
1067 versions: ["28", "29", "30", "current"],
1068 },
1069 min_sdk_version: "28",
1070 }
1071
1072 cc_library {
1073 name: "mylib3",
1074 srcs: ["mylib.cpp"],
1075 shared_libs: ["mylib4"],
1076 system_shared_libs: [],
1077 stl: "none",
1078 stubs: {
1079 versions: ["28", "29", "30", "current"],
1080 },
1081 apex_available: [ "myapex" ],
1082 min_sdk_version: "28",
1083 }
1084
1085 cc_library {
1086 name: "mylib4",
1087 srcs: ["mylib.cpp"],
1088 system_shared_libs: [],
1089 stl: "none",
1090 apex_available: [ "myapex" ],
1091 min_sdk_version: "28",
1092 }
1093 `)
1094
Jooyung Hana0503a52023-08-23 13:12:50 +09001095 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001096 copyCmds := apexRule.Args["copy_commands"]
1097
1098 // Ensure that direct non-stubs dep is always included
1099 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1100
1101 // Ensure that indirect stubs dep is not included
1102 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1103
1104 // Ensure that direct stubs dep is included
1105 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1106
1107 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1108
Jiyong Park55549df2021-02-26 23:57:23 +09001109 // Ensure that mylib is linking with the latest version of stub for mylib2
1110 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001111 // ... and not linking to the non-stub (impl) variant of mylib2
1112 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1113
1114 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1115 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1116 // .. and not linking to the stubs variant of mylib3
1117 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1118
1119 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001120 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001121 ensureNotContains(t, mylib2Cflags, "-include ")
1122
Jiyong Park85cc35a2022-07-17 11:30:47 +09001123 // Ensure that genstub is invoked with --systemapi
1124 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001125
Jooyung Hana0503a52023-08-23 13:12:50 +09001126 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001127 "lib64/mylib.so",
1128 "lib64/mylib3.so",
1129 "lib64/mylib4.so",
1130 })
1131}
1132
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001133func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1134 t.Parallel()
1135 // myapex (Z)
1136 // mylib -----------------.
1137 // |
1138 // otherapex (29) |
1139 // libstub's versions: 29 Z current
1140 // |
1141 // <platform> |
1142 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001143 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001144 apex {
1145 name: "myapex",
1146 key: "myapex.key",
1147 native_shared_libs: ["mylib"],
1148 min_sdk_version: "Z", // non-final
1149 }
1150
1151 cc_library {
1152 name: "mylib",
1153 srcs: ["mylib.cpp"],
1154 shared_libs: ["libstub"],
1155 apex_available: ["myapex"],
1156 min_sdk_version: "Z",
1157 }
1158
1159 apex_key {
1160 name: "myapex.key",
1161 public_key: "testkey.avbpubkey",
1162 private_key: "testkey.pem",
1163 }
1164
1165 apex {
1166 name: "otherapex",
1167 key: "myapex.key",
1168 native_shared_libs: ["libstub"],
1169 min_sdk_version: "29",
1170 }
1171
1172 cc_library {
1173 name: "libstub",
1174 srcs: ["mylib.cpp"],
1175 stubs: {
1176 versions: ["29", "Z", "current"],
1177 },
1178 apex_available: ["otherapex"],
1179 min_sdk_version: "29",
1180 }
1181
1182 // platform module depending on libstub from otherapex should use the latest stub("current")
1183 cc_library {
1184 name: "libplatform",
1185 srcs: ["mylib.cpp"],
1186 shared_libs: ["libstub"],
1187 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001188 `,
1189 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1190 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1191 variables.Platform_sdk_final = proptools.BoolPtr(false)
1192 variables.Platform_version_active_codenames = []string{"Z"}
1193 }),
1194 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001195
Jiyong Park55549df2021-02-26 23:57:23 +09001196 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001197 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001198 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001199 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001200 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001201
1202 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1203 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1204 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1205 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1206 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1207}
1208
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001209func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001210 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001211 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001212 name: "myapex2",
1213 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001214 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001215 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001216 }
1217
1218 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001219 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001220 public_key: "testkey.avbpubkey",
1221 private_key: "testkey.pem",
1222 }
1223
1224 cc_library {
1225 name: "mylib",
1226 srcs: ["mylib.cpp"],
1227 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001228 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001229 system_shared_libs: [],
1230 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001231 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001232 }
1233
1234 cc_library {
1235 name: "libfoo",
1236 srcs: ["mylib.cpp"],
1237 shared_libs: ["libbar"],
1238 system_shared_libs: [],
1239 stl: "none",
1240 stubs: {
1241 versions: ["10", "20", "30"],
1242 },
1243 }
1244
1245 cc_library {
1246 name: "libbar",
1247 srcs: ["mylib.cpp"],
1248 system_shared_libs: [],
1249 stl: "none",
1250 }
1251
Jiyong Park678c8812020-02-07 17:25:49 +09001252 cc_library_static {
1253 name: "libbaz",
1254 srcs: ["mylib.cpp"],
1255 system_shared_libs: [],
1256 stl: "none",
1257 apex_available: [ "myapex2" ],
1258 }
1259
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001260 `)
1261
Jooyung Hana0503a52023-08-23 13:12:50 +09001262 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001263 copyCmds := apexRule.Args["copy_commands"]
1264
1265 // Ensure that direct non-stubs dep is always included
1266 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1267
1268 // Ensure that indirect stubs dep is not included
1269 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1270
1271 // Ensure that dependency of stubs is not included
1272 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1273
Colin Crossaede88c2020-08-11 12:17:01 -07001274 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001275
1276 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001277 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001278 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001279 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001280
Jiyong Park3ff16992019-12-27 14:11:47 +09001281 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001282
1283 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1284 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001285
Colin Crossf61d03d2023-11-02 16:56:39 -07001286 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1287 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001288 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001289
Colin Crossf61d03d2023-11-02 16:56:39 -07001290 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1291 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001292 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001293}
1294
Jooyung Hand3639552019-08-09 12:57:43 +09001295func TestApexWithRuntimeLibsDependency(t *testing.T) {
1296 /*
1297 myapex
1298 |
1299 v (runtime_libs)
1300 mylib ------+------> libfoo [provides stub]
1301 |
1302 `------> libbar
1303 */
Colin Cross1c460562021-02-16 17:55:47 -08001304 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001305 apex {
1306 name: "myapex",
1307 key: "myapex.key",
1308 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001309 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001310 }
1311
1312 apex_key {
1313 name: "myapex.key",
1314 public_key: "testkey.avbpubkey",
1315 private_key: "testkey.pem",
1316 }
1317
1318 cc_library {
1319 name: "mylib",
1320 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001321 static_libs: ["libstatic"],
1322 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001323 runtime_libs: ["libfoo", "libbar"],
1324 system_shared_libs: [],
1325 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001326 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001327 }
1328
1329 cc_library {
1330 name: "libfoo",
1331 srcs: ["mylib.cpp"],
1332 system_shared_libs: [],
1333 stl: "none",
1334 stubs: {
1335 versions: ["10", "20", "30"],
1336 },
1337 }
1338
1339 cc_library {
1340 name: "libbar",
1341 srcs: ["mylib.cpp"],
1342 system_shared_libs: [],
1343 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001344 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001345 }
1346
Liz Kammer5f108fa2023-05-11 14:33:17 -04001347 cc_library {
1348 name: "libstatic",
1349 srcs: ["mylib.cpp"],
1350 system_shared_libs: [],
1351 stl: "none",
1352 apex_available: [ "myapex" ],
1353 runtime_libs: ["libstatic_to_runtime"],
1354 }
1355
1356 cc_library {
1357 name: "libshared",
1358 srcs: ["mylib.cpp"],
1359 system_shared_libs: [],
1360 stl: "none",
1361 apex_available: [ "myapex" ],
1362 runtime_libs: ["libshared_to_runtime"],
1363 }
1364
1365 cc_library {
1366 name: "libstatic_to_runtime",
1367 srcs: ["mylib.cpp"],
1368 system_shared_libs: [],
1369 stl: "none",
1370 apex_available: [ "myapex" ],
1371 }
1372
1373 cc_library {
1374 name: "libshared_to_runtime",
1375 srcs: ["mylib.cpp"],
1376 system_shared_libs: [],
1377 stl: "none",
1378 apex_available: [ "myapex" ],
1379 }
Jooyung Hand3639552019-08-09 12:57:43 +09001380 `)
1381
Jooyung Hana0503a52023-08-23 13:12:50 +09001382 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001383 copyCmds := apexRule.Args["copy_commands"]
1384
1385 // Ensure that direct non-stubs dep is always included
1386 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1387
1388 // Ensure that indirect stubs dep is not included
1389 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1390
1391 // Ensure that runtime_libs dep in included
1392 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001393 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1394 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1395
1396 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001397
Jooyung Hana0503a52023-08-23 13:12:50 +09001398 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001399 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1400 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001401}
1402
Paul Duffina02cae32021-03-09 01:44:06 +00001403var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1404 cc.PrepareForTestWithCcBuildComponents,
1405 PrepareForTestWithApexBuildComponents,
1406 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001407 apex {
1408 name: "com.android.runtime",
1409 key: "com.android.runtime.key",
1410 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001411 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001412 }
1413
1414 apex_key {
1415 name: "com.android.runtime.key",
1416 public_key: "testkey.avbpubkey",
1417 private_key: "testkey.pem",
1418 }
Paul Duffina02cae32021-03-09 01:44:06 +00001419 `),
1420 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1421)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001422
Paul Duffina02cae32021-03-09 01:44:06 +00001423func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001424 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001425 cc_library {
1426 name: "libc",
1427 no_libcrt: true,
1428 nocrt: true,
1429 stl: "none",
1430 system_shared_libs: [],
1431 stubs: { versions: ["1"] },
1432 apex_available: ["com.android.runtime"],
1433
1434 sanitize: {
1435 hwaddress: true,
1436 }
1437 }
1438
1439 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001440 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001441 no_libcrt: true,
1442 nocrt: true,
1443 stl: "none",
1444 system_shared_libs: [],
1445 srcs: [""],
1446 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001447 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001448
1449 sanitize: {
1450 never: true,
1451 },
Spandan Das4de7b492023-05-05 21:13:01 +00001452 apex_available: [
1453 "//apex_available:anyapex",
1454 "//apex_available:platform",
1455 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001456 } `)
1457 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001458
Jooyung Hana0503a52023-08-23 13:12:50 +09001459 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001460 "lib64/bionic/libc.so",
1461 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1462 })
1463
Colin Cross4c4c1be2022-02-10 11:41:18 -08001464 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001465
1466 installed := hwasan.Description("install libclang_rt.hwasan")
1467 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1468
1469 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1470 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1471 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1472}
1473
1474func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001475 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001476 prepareForTestOfRuntimeApexWithHwasan,
1477 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1478 variables.SanitizeDevice = []string{"hwaddress"}
1479 }),
1480 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001481 cc_library {
1482 name: "libc",
1483 no_libcrt: true,
1484 nocrt: true,
1485 stl: "none",
1486 system_shared_libs: [],
1487 stubs: { versions: ["1"] },
1488 apex_available: ["com.android.runtime"],
1489 }
1490
1491 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001492 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001493 no_libcrt: true,
1494 nocrt: true,
1495 stl: "none",
1496 system_shared_libs: [],
1497 srcs: [""],
1498 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001499 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001500
1501 sanitize: {
1502 never: true,
1503 },
Spandan Das4de7b492023-05-05 21:13:01 +00001504 apex_available: [
1505 "//apex_available:anyapex",
1506 "//apex_available:platform",
1507 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001508 }
Paul Duffina02cae32021-03-09 01:44:06 +00001509 `)
1510 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001511
Jooyung Hana0503a52023-08-23 13:12:50 +09001512 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001513 "lib64/bionic/libc.so",
1514 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1515 })
1516
Colin Cross4c4c1be2022-02-10 11:41:18 -08001517 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001518
1519 installed := hwasan.Description("install libclang_rt.hwasan")
1520 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1521
1522 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1523 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1524 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1525}
1526
Jooyung Han61b66e92020-03-21 14:21:46 +00001527func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1528 testcases := []struct {
1529 name string
1530 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001531 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001532 shouldLink string
1533 shouldNotLink []string
1534 }{
1535 {
Jiyong Park55549df2021-02-26 23:57:23 +09001536 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001537 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001538 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001539 shouldLink: "current",
1540 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001541 },
1542 {
Jiyong Park55549df2021-02-26 23:57:23 +09001543 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001544 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001545 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001546 shouldLink: "current",
1547 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001548 },
1549 }
1550 for _, tc := range testcases {
1551 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001552 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001553 apex {
1554 name: "myapex",
1555 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001556 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001557 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001558 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001559 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001560
Jooyung Han61b66e92020-03-21 14:21:46 +00001561 apex_key {
1562 name: "myapex.key",
1563 public_key: "testkey.avbpubkey",
1564 private_key: "testkey.pem",
1565 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001566
Jooyung Han61b66e92020-03-21 14:21:46 +00001567 cc_library {
1568 name: "mylib",
1569 srcs: ["mylib.cpp"],
1570 vendor_available: true,
1571 shared_libs: ["libbar"],
1572 system_shared_libs: [],
1573 stl: "none",
1574 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001575 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001576 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001577
Jooyung Han61b66e92020-03-21 14:21:46 +00001578 cc_library {
1579 name: "libbar",
1580 srcs: ["mylib.cpp"],
1581 system_shared_libs: [],
1582 stl: "none",
1583 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001584 llndk: {
1585 symbol_file: "libbar.map.txt",
1586 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001587 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001588 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001589 withUnbundledBuild,
1590 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001591
Jooyung Han61b66e92020-03-21 14:21:46 +00001592 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001593 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001594 "lib64/mylib.so",
1595 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001596
Jooyung Han61b66e92020-03-21 14:21:46 +00001597 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001598 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001599 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1600 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001601
Steven Moreland2c4000c2021-04-27 02:08:49 +00001602 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1603 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001604 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001605 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001606 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001607
Steven Moreland2c4000c2021-04-27 02:08:49 +00001608 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001609 ver := tc.shouldLink
1610 if tc.shouldLink == "current" {
1611 ver = strconv.Itoa(android.FutureApiLevelInt)
1612 }
1613 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001614 })
1615 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001616}
1617
Jiyong Park25fc6a92018-11-18 18:02:45 +09001618func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001619 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001620 apex {
1621 name: "myapex",
1622 key: "myapex.key",
1623 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001624 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001625 }
1626
1627 apex_key {
1628 name: "myapex.key",
1629 public_key: "testkey.avbpubkey",
1630 private_key: "testkey.pem",
1631 }
1632
1633 cc_library {
1634 name: "mylib",
1635 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001636 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001637 shared_libs: ["libdl#27"],
1638 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001639 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001640 }
1641
1642 cc_library_shared {
1643 name: "mylib_shared",
1644 srcs: ["mylib.cpp"],
1645 shared_libs: ["libdl#27"],
1646 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001647 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001648 }
1649
1650 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001651 name: "libBootstrap",
1652 srcs: ["mylib.cpp"],
1653 stl: "none",
1654 bootstrap: true,
1655 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001656 `)
1657
Jooyung Hana0503a52023-08-23 13:12:50 +09001658 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001659 copyCmds := apexRule.Args["copy_commands"]
1660
1661 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001662 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001663 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1664 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001665
1666 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001667 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001668
Colin Crossaede88c2020-08-11 12:17:01 -07001669 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1670 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1671 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001672
1673 // For dependency to libc
1674 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001675 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001676 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001677 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001678 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001679 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1680 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001681
1682 // For dependency to libm
1683 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001684 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001685 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001686 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001687 // ... and is not compiling with the stub
1688 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1689 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1690
1691 // For dependency to libdl
1692 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001693 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001694 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001695 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1696 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001697 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001698 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001699 // ... Cflags from stub is correctly exported to mylib
1700 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1701 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001702
1703 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001704 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1705 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1706 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1707 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001708}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001709
Jooyung Han749dc692020-04-15 11:03:39 +09001710func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001711 // there are three links between liba --> libz.
1712 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001713 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001714 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001715 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001716 apex {
1717 name: "myapex",
1718 key: "myapex.key",
1719 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001720 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001721 }
1722
1723 apex {
1724 name: "otherapex",
1725 key: "myapex.key",
1726 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001727 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001728 }
1729
1730 apex_key {
1731 name: "myapex.key",
1732 public_key: "testkey.avbpubkey",
1733 private_key: "testkey.pem",
1734 }
1735
1736 cc_library {
1737 name: "libx",
1738 shared_libs: ["liba"],
1739 system_shared_libs: [],
1740 stl: "none",
1741 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001742 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001743 }
1744
1745 cc_library {
1746 name: "liby",
1747 shared_libs: ["liba"],
1748 system_shared_libs: [],
1749 stl: "none",
1750 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001751 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001752 }
1753
1754 cc_library {
1755 name: "liba",
1756 shared_libs: ["libz"],
1757 system_shared_libs: [],
1758 stl: "none",
1759 apex_available: [
1760 "//apex_available:anyapex",
1761 "//apex_available:platform",
1762 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001763 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001764 }
1765
1766 cc_library {
1767 name: "libz",
1768 system_shared_libs: [],
1769 stl: "none",
1770 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001771 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001772 },
1773 }
Jooyung Han749dc692020-04-15 11:03:39 +09001774 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001775
1776 expectLink := func(from, from_variant, to, to_variant string) {
1777 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1778 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1779 }
1780 expectNoLink := func(from, from_variant, to, to_variant string) {
1781 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1782 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1783 }
1784 // platform liba is linked to non-stub version
1785 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001786 // liba in myapex is linked to current
1787 expectLink("liba", "shared_apex29", "libz", "shared_current")
1788 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001789 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001790 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001791 // liba in otherapex is linked to current
1792 expectLink("liba", "shared_apex30", "libz", "shared_current")
1793 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001794 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1795 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001796}
1797
Jooyung Hanaed150d2020-04-02 01:41:41 +09001798func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001799 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001800 apex {
1801 name: "myapex",
1802 key: "myapex.key",
1803 native_shared_libs: ["libx"],
1804 min_sdk_version: "R",
1805 }
1806
1807 apex_key {
1808 name: "myapex.key",
1809 public_key: "testkey.avbpubkey",
1810 private_key: "testkey.pem",
1811 }
1812
1813 cc_library {
1814 name: "libx",
1815 shared_libs: ["libz"],
1816 system_shared_libs: [],
1817 stl: "none",
1818 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001819 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001820 }
1821
1822 cc_library {
1823 name: "libz",
1824 system_shared_libs: [],
1825 stl: "none",
1826 stubs: {
1827 versions: ["29", "R"],
1828 },
1829 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001830 `,
1831 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1832 variables.Platform_version_active_codenames = []string{"R"}
1833 }),
1834 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001835
1836 expectLink := func(from, from_variant, to, to_variant string) {
1837 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1838 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1839 }
1840 expectNoLink := func(from, from_variant, to, to_variant string) {
1841 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1842 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1843 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001844 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1845 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001846 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1847 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001848}
1849
Jooyung Han4c4da062021-06-23 10:23:16 +09001850func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1851 testApex(t, `
1852 apex {
1853 name: "myapex",
1854 key: "myapex.key",
1855 java_libs: ["libx"],
1856 min_sdk_version: "S",
1857 }
1858
1859 apex_key {
1860 name: "myapex.key",
1861 public_key: "testkey.avbpubkey",
1862 private_key: "testkey.pem",
1863 }
1864
1865 java_library {
1866 name: "libx",
1867 srcs: ["a.java"],
1868 apex_available: [ "myapex" ],
1869 sdk_version: "current",
1870 min_sdk_version: "S", // should be okay
1871 }
1872 `,
1873 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1874 variables.Platform_version_active_codenames = []string{"S"}
1875 variables.Platform_sdk_codename = proptools.StringPtr("S")
1876 }),
1877 )
1878}
1879
Jooyung Han749dc692020-04-15 11:03:39 +09001880func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001881 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001882 apex {
1883 name: "myapex",
1884 key: "myapex.key",
1885 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001886 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001887 }
1888
1889 apex_key {
1890 name: "myapex.key",
1891 public_key: "testkey.avbpubkey",
1892 private_key: "testkey.pem",
1893 }
1894
1895 cc_library {
1896 name: "libx",
1897 shared_libs: ["libz"],
1898 system_shared_libs: [],
1899 stl: "none",
1900 apex_available: [ "myapex" ],
1901 }
1902
1903 cc_library {
1904 name: "libz",
1905 system_shared_libs: [],
1906 stl: "none",
1907 stubs: {
1908 versions: ["1", "2"],
1909 },
1910 }
1911 `)
1912
1913 expectLink := func(from, from_variant, to, to_variant string) {
1914 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1915 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1916 }
1917 expectNoLink := func(from, from_variant, to, to_variant string) {
1918 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1919 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1920 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001921 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001922 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001923 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001924 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001925}
1926
Jooyung Handfc864c2023-03-20 18:19:07 +09001927func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001928 ctx := testApex(t, `
1929 apex {
1930 name: "myapex",
1931 key: "myapex.key",
1932 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001933 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001934 vendor: true,
1935 min_sdk_version: "29",
1936 }
1937
1938 apex_key {
1939 name: "myapex.key",
1940 public_key: "testkey.avbpubkey",
1941 private_key: "testkey.pem",
1942 }
1943
1944 cc_library {
1945 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001946 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001947 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001948 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001949 shared_libs: ["libbar"],
1950 }
1951
1952 cc_library {
1953 name: "libbar",
1954 stubs: { versions: ["29", "30"] },
1955 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09001956 }
1957 `)
1958
1959 vendorVariant := "android_vendor.29_arm64_armv8-a"
1960
Jooyung Handfc864c2023-03-20 18:19:07 +09001961 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
1962
1963 // Ensure that mylib links with "current" LLNDK
1964 libFlags := names(mylib.Rule("ld").Args["libFlags"])
1965 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
1966
1967 // Ensure that mylib is targeting 29
1968 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
1969 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
1970
1971 // Ensure that the correct variant of crtbegin_so is used.
1972 crtBegin := mylib.Rule("ld").Args["crtBegin"]
1973 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09001974
1975 // Ensure that the crtbegin_so used by the APEX is targeting 29
1976 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1977 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1978}
1979
Jooyung Han4495f842023-04-25 16:39:59 +09001980func TestTrackAllowedDeps(t *testing.T) {
1981 ctx := testApex(t, `
1982 apex {
1983 name: "myapex",
1984 key: "myapex.key",
1985 updatable: true,
1986 native_shared_libs: [
1987 "mylib",
1988 "yourlib",
1989 ],
1990 min_sdk_version: "29",
1991 }
1992
1993 apex {
1994 name: "myapex2",
1995 key: "myapex.key",
1996 updatable: false,
1997 native_shared_libs: ["yourlib"],
1998 }
1999
2000 apex_key {
2001 name: "myapex.key",
2002 public_key: "testkey.avbpubkey",
2003 private_key: "testkey.pem",
2004 }
2005
2006 cc_library {
2007 name: "mylib",
2008 srcs: ["mylib.cpp"],
2009 shared_libs: ["libbar"],
2010 min_sdk_version: "29",
2011 apex_available: ["myapex"],
2012 }
2013
2014 cc_library {
2015 name: "libbar",
2016 stubs: { versions: ["29", "30"] },
2017 }
2018
2019 cc_library {
2020 name: "yourlib",
2021 srcs: ["mylib.cpp"],
2022 min_sdk_version: "29",
2023 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2024 }
2025 `, withFiles(android.MockFS{
2026 "packages/modules/common/build/allowed_deps.txt": nil,
2027 }))
2028
2029 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2030 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2031 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002032 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002033 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002034 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002035
Jooyung Hana0503a52023-08-23 13:12:50 +09002036 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002037 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2038 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002039 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2040 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2041 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2042 flatlist, "mylib:(minSdkVersion:29)")
2043 android.AssertStringListContains(t, "track platform-available lib",
2044 flatlist, "yourlib(minSdkVersion:29)")
2045}
2046
2047func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2048 ctx := testApex(t, `
2049 apex {
2050 name: "myapex",
2051 key: "myapex.key",
2052 updatable: true,
2053 min_sdk_version: "29",
2054 }
2055
2056 apex_key {
2057 name: "myapex.key",
2058 public_key: "testkey.avbpubkey",
2059 private_key: "testkey.pem",
2060 }
2061 `)
2062 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2063 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2064 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2065 }
2066}
2067
Jooyung Han03b51852020-02-26 22:45:42 +09002068func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002069 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002070 apex {
2071 name: "myapex",
2072 key: "myapex.key",
2073 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002074 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002075 }
2076
2077 apex_key {
2078 name: "myapex.key",
2079 public_key: "testkey.avbpubkey",
2080 private_key: "testkey.pem",
2081 }
2082
2083 cc_library {
2084 name: "libx",
2085 system_shared_libs: [],
2086 stl: "none",
2087 apex_available: [ "myapex" ],
2088 stubs: {
2089 versions: ["1", "2"],
2090 },
2091 }
2092
2093 cc_library {
2094 name: "libz",
2095 shared_libs: ["libx"],
2096 system_shared_libs: [],
2097 stl: "none",
2098 }
2099 `)
2100
2101 expectLink := 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 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2105 }
2106 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002107 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002108 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2109 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2110 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002111 expectLink("libz", "shared", "libx", "shared_current")
2112 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002113 expectNoLink("libz", "shared", "libz", "shared_1")
2114 expectNoLink("libz", "shared", "libz", "shared")
2115}
2116
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002117var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2118 func(variables android.FixtureProductVariables) {
2119 variables.SanitizeDevice = []string{"hwaddress"}
2120 },
2121)
2122
Jooyung Han75568392020-03-20 04:29:24 +09002123func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002124 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002125 apex {
2126 name: "myapex",
2127 key: "myapex.key",
2128 native_shared_libs: ["libx"],
2129 min_sdk_version: "29",
2130 }
2131
2132 apex_key {
2133 name: "myapex.key",
2134 public_key: "testkey.avbpubkey",
2135 private_key: "testkey.pem",
2136 }
2137
2138 cc_library {
2139 name: "libx",
2140 shared_libs: ["libbar"],
2141 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002142 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002143 }
2144
2145 cc_library {
2146 name: "libbar",
2147 stubs: {
2148 versions: ["29", "30"],
2149 },
2150 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002151 `,
2152 prepareForTestWithSantitizeHwaddress,
2153 )
Jooyung Han03b51852020-02-26 22:45:42 +09002154 expectLink := func(from, from_variant, to, to_variant string) {
2155 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2156 libFlags := ld.Args["libFlags"]
2157 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2158 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002159 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002160}
2161
Jooyung Han75568392020-03-20 04:29:24 +09002162func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002163 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002164 apex {
2165 name: "myapex",
2166 key: "myapex.key",
2167 native_shared_libs: ["libx"],
2168 min_sdk_version: "29",
2169 }
2170
2171 apex_key {
2172 name: "myapex.key",
2173 public_key: "testkey.avbpubkey",
2174 private_key: "testkey.pem",
2175 }
2176
2177 cc_library {
2178 name: "libx",
2179 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002180 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002181 }
Jooyung Han75568392020-03-20 04:29:24 +09002182 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002183
2184 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002185 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002186 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002187 // note that platform variant is not.
2188 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002189 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002190}
2191
Jooyung Han749dc692020-04-15 11:03:39 +09002192func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2193 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002194 apex {
2195 name: "myapex",
2196 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002197 native_shared_libs: ["mylib"],
2198 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002199 }
2200
2201 apex_key {
2202 name: "myapex.key",
2203 public_key: "testkey.avbpubkey",
2204 private_key: "testkey.pem",
2205 }
Jooyung Han749dc692020-04-15 11:03:39 +09002206
2207 cc_library {
2208 name: "mylib",
2209 srcs: ["mylib.cpp"],
2210 system_shared_libs: [],
2211 stl: "none",
2212 apex_available: [
2213 "myapex",
2214 ],
2215 min_sdk_version: "30",
2216 }
2217 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002218
2219 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2220 apex {
2221 name: "myapex",
2222 key: "myapex.key",
2223 native_shared_libs: ["libfoo.ffi"],
2224 min_sdk_version: "29",
2225 }
2226
2227 apex_key {
2228 name: "myapex.key",
2229 public_key: "testkey.avbpubkey",
2230 private_key: "testkey.pem",
2231 }
2232
2233 rust_ffi_shared {
2234 name: "libfoo.ffi",
2235 srcs: ["foo.rs"],
2236 crate_name: "foo",
2237 apex_available: [
2238 "myapex",
2239 ],
2240 min_sdk_version: "30",
2241 }
2242 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002243
2244 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2245 apex {
2246 name: "myapex",
2247 key: "myapex.key",
2248 java_libs: ["libfoo"],
2249 min_sdk_version: "29",
2250 }
2251
2252 apex_key {
2253 name: "myapex.key",
2254 public_key: "testkey.avbpubkey",
2255 private_key: "testkey.pem",
2256 }
2257
2258 java_import {
2259 name: "libfoo",
2260 jars: ["libfoo.jar"],
2261 apex_available: [
2262 "myapex",
2263 ],
2264 min_sdk_version: "30",
2265 }
2266 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002267
2268 // Skip check for modules compiling against core API surface
2269 testApex(t, `
2270 apex {
2271 name: "myapex",
2272 key: "myapex.key",
2273 java_libs: ["libfoo"],
2274 min_sdk_version: "29",
2275 }
2276
2277 apex_key {
2278 name: "myapex.key",
2279 public_key: "testkey.avbpubkey",
2280 private_key: "testkey.pem",
2281 }
2282
2283 java_library {
2284 name: "libfoo",
2285 srcs: ["Foo.java"],
2286 apex_available: [
2287 "myapex",
2288 ],
2289 // Compile against core API surface
2290 sdk_version: "core_current",
2291 min_sdk_version: "30",
2292 }
2293 `)
2294
Jooyung Han749dc692020-04-15 11:03:39 +09002295}
2296
2297func TestApexMinSdkVersion_Okay(t *testing.T) {
2298 testApex(t, `
2299 apex {
2300 name: "myapex",
2301 key: "myapex.key",
2302 native_shared_libs: ["libfoo"],
2303 java_libs: ["libbar"],
2304 min_sdk_version: "29",
2305 }
2306
2307 apex_key {
2308 name: "myapex.key",
2309 public_key: "testkey.avbpubkey",
2310 private_key: "testkey.pem",
2311 }
2312
2313 cc_library {
2314 name: "libfoo",
2315 srcs: ["mylib.cpp"],
2316 shared_libs: ["libfoo_dep"],
2317 apex_available: ["myapex"],
2318 min_sdk_version: "29",
2319 }
2320
2321 cc_library {
2322 name: "libfoo_dep",
2323 srcs: ["mylib.cpp"],
2324 apex_available: ["myapex"],
2325 min_sdk_version: "29",
2326 }
2327
2328 java_library {
2329 name: "libbar",
2330 sdk_version: "current",
2331 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002332 static_libs: [
2333 "libbar_dep",
2334 "libbar_import_dep",
2335 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002336 apex_available: ["myapex"],
2337 min_sdk_version: "29",
2338 }
2339
2340 java_library {
2341 name: "libbar_dep",
2342 sdk_version: "current",
2343 srcs: ["a.java"],
2344 apex_available: ["myapex"],
2345 min_sdk_version: "29",
2346 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002347
2348 java_import {
2349 name: "libbar_import_dep",
2350 jars: ["libbar.jar"],
2351 apex_available: ["myapex"],
2352 min_sdk_version: "29",
2353 }
Jooyung Han03b51852020-02-26 22:45:42 +09002354 `)
2355}
2356
Colin Cross8ca61c12022-10-06 21:00:14 -07002357func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2358 // Tests that an apex dependency with min_sdk_version higher than the
2359 // min_sdk_version of the apex is allowed as long as the dependency's
2360 // min_sdk_version is less than or equal to the api level that the
2361 // architecture was introduced in. In this case, arm64 didn't exist
2362 // until api level 21, so the arm64 code will never need to run on
2363 // an api level 20 device, even if other architectures of the apex
2364 // will.
2365 testApex(t, `
2366 apex {
2367 name: "myapex",
2368 key: "myapex.key",
2369 native_shared_libs: ["libfoo"],
2370 min_sdk_version: "20",
2371 }
2372
2373 apex_key {
2374 name: "myapex.key",
2375 public_key: "testkey.avbpubkey",
2376 private_key: "testkey.pem",
2377 }
2378
2379 cc_library {
2380 name: "libfoo",
2381 srcs: ["mylib.cpp"],
2382 apex_available: ["myapex"],
2383 min_sdk_version: "21",
2384 stl: "none",
2385 }
2386 `)
2387}
2388
Artur Satayev8cf899a2020-04-15 17:29:42 +01002389func TestJavaStableSdkVersion(t *testing.T) {
2390 testCases := []struct {
2391 name string
2392 expectedError string
2393 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002394 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002395 }{
2396 {
2397 name: "Non-updatable apex with non-stable dep",
2398 bp: `
2399 apex {
2400 name: "myapex",
2401 java_libs: ["myjar"],
2402 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002403 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002404 }
2405 apex_key {
2406 name: "myapex.key",
2407 public_key: "testkey.avbpubkey",
2408 private_key: "testkey.pem",
2409 }
2410 java_library {
2411 name: "myjar",
2412 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002413 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002414 apex_available: ["myapex"],
2415 }
2416 `,
2417 },
2418 {
2419 name: "Updatable apex with stable dep",
2420 bp: `
2421 apex {
2422 name: "myapex",
2423 java_libs: ["myjar"],
2424 key: "myapex.key",
2425 updatable: true,
2426 min_sdk_version: "29",
2427 }
2428 apex_key {
2429 name: "myapex.key",
2430 public_key: "testkey.avbpubkey",
2431 private_key: "testkey.pem",
2432 }
2433 java_library {
2434 name: "myjar",
2435 srcs: ["foo/bar/MyClass.java"],
2436 sdk_version: "current",
2437 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002438 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002439 }
2440 `,
2441 },
2442 {
2443 name: "Updatable apex with non-stable dep",
2444 expectedError: "cannot depend on \"myjar\"",
2445 bp: `
2446 apex {
2447 name: "myapex",
2448 java_libs: ["myjar"],
2449 key: "myapex.key",
2450 updatable: true,
2451 }
2452 apex_key {
2453 name: "myapex.key",
2454 public_key: "testkey.avbpubkey",
2455 private_key: "testkey.pem",
2456 }
2457 java_library {
2458 name: "myjar",
2459 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002460 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002461 apex_available: ["myapex"],
2462 }
2463 `,
2464 },
2465 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002466 name: "Updatable apex with non-stable legacy core platform dep",
2467 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2468 bp: `
2469 apex {
2470 name: "myapex",
2471 java_libs: ["myjar-uses-legacy"],
2472 key: "myapex.key",
2473 updatable: true,
2474 }
2475 apex_key {
2476 name: "myapex.key",
2477 public_key: "testkey.avbpubkey",
2478 private_key: "testkey.pem",
2479 }
2480 java_library {
2481 name: "myjar-uses-legacy",
2482 srcs: ["foo/bar/MyClass.java"],
2483 sdk_version: "core_platform",
2484 apex_available: ["myapex"],
2485 }
2486 `,
2487 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2488 },
2489 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002490 name: "Updatable apex with non-stable transitive dep",
2491 // This is not actually detecting that the transitive dependency is unstable, rather it is
2492 // detecting that the transitive dependency is building against a wider API surface than the
2493 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002494 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002495 bp: `
2496 apex {
2497 name: "myapex",
2498 java_libs: ["myjar"],
2499 key: "myapex.key",
2500 updatable: true,
2501 }
2502 apex_key {
2503 name: "myapex.key",
2504 public_key: "testkey.avbpubkey",
2505 private_key: "testkey.pem",
2506 }
2507 java_library {
2508 name: "myjar",
2509 srcs: ["foo/bar/MyClass.java"],
2510 sdk_version: "current",
2511 apex_available: ["myapex"],
2512 static_libs: ["transitive-jar"],
2513 }
2514 java_library {
2515 name: "transitive-jar",
2516 srcs: ["foo/bar/MyClass.java"],
2517 sdk_version: "core_platform",
2518 apex_available: ["myapex"],
2519 }
2520 `,
2521 },
2522 }
2523
2524 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002525 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2526 continue
2527 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002528 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002529 errorHandler := android.FixtureExpectsNoErrors
2530 if test.expectedError != "" {
2531 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002532 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002533 android.GroupFixturePreparers(
2534 java.PrepareForTestWithJavaDefaultModules,
2535 PrepareForTestWithApexBuildComponents,
2536 prepareForTestWithMyapex,
2537 android.OptionalFixturePreparer(test.preparer),
2538 ).
2539 ExtendWithErrorHandler(errorHandler).
2540 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002541 })
2542 }
2543}
2544
Jooyung Han749dc692020-04-15 11:03:39 +09002545func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2546 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2547 apex {
2548 name: "myapex",
2549 key: "myapex.key",
2550 native_shared_libs: ["mylib"],
2551 min_sdk_version: "29",
2552 }
2553
2554 apex_key {
2555 name: "myapex.key",
2556 public_key: "testkey.avbpubkey",
2557 private_key: "testkey.pem",
2558 }
2559
2560 cc_library {
2561 name: "mylib",
2562 srcs: ["mylib.cpp"],
2563 shared_libs: ["mylib2"],
2564 system_shared_libs: [],
2565 stl: "none",
2566 apex_available: [
2567 "myapex",
2568 ],
2569 min_sdk_version: "29",
2570 }
2571
2572 // indirect part of the apex
2573 cc_library {
2574 name: "mylib2",
2575 srcs: ["mylib.cpp"],
2576 system_shared_libs: [],
2577 stl: "none",
2578 apex_available: [
2579 "myapex",
2580 ],
2581 min_sdk_version: "30",
2582 }
2583 `)
2584}
2585
2586func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2587 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2588 apex {
2589 name: "myapex",
2590 key: "myapex.key",
2591 apps: ["AppFoo"],
2592 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002593 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002594 }
2595
2596 apex_key {
2597 name: "myapex.key",
2598 public_key: "testkey.avbpubkey",
2599 private_key: "testkey.pem",
2600 }
2601
2602 android_app {
2603 name: "AppFoo",
2604 srcs: ["foo/bar/MyClass.java"],
2605 sdk_version: "current",
2606 min_sdk_version: "29",
2607 system_modules: "none",
2608 stl: "none",
2609 static_libs: ["bar"],
2610 apex_available: [ "myapex" ],
2611 }
2612
2613 java_library {
2614 name: "bar",
2615 sdk_version: "current",
2616 srcs: ["a.java"],
2617 apex_available: [ "myapex" ],
2618 }
2619 `)
2620}
2621
2622func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002623 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002624 apex {
2625 name: "myapex",
2626 key: "myapex.key",
2627 native_shared_libs: ["mylib"],
2628 min_sdk_version: "29",
2629 }
2630
2631 apex_key {
2632 name: "myapex.key",
2633 public_key: "testkey.avbpubkey",
2634 private_key: "testkey.pem",
2635 }
2636
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002637 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002638 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2639 cc_library {
2640 name: "mylib",
2641 srcs: ["mylib.cpp"],
2642 shared_libs: ["mylib2"],
2643 system_shared_libs: [],
2644 stl: "none",
2645 apex_available: ["myapex", "otherapex"],
2646 min_sdk_version: "29",
2647 }
2648
2649 cc_library {
2650 name: "mylib2",
2651 srcs: ["mylib.cpp"],
2652 system_shared_libs: [],
2653 stl: "none",
2654 apex_available: ["otherapex"],
2655 stubs: { versions: ["29", "30"] },
2656 min_sdk_version: "30",
2657 }
2658
2659 apex {
2660 name: "otherapex",
2661 key: "myapex.key",
2662 native_shared_libs: ["mylib", "mylib2"],
2663 min_sdk_version: "30",
2664 }
2665 `)
2666 expectLink := func(from, from_variant, to, to_variant string) {
2667 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2668 libFlags := ld.Args["libFlags"]
2669 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2670 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002671 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002672 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002673}
2674
Jooyung Haned124c32021-01-26 11:43:46 +09002675func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002676 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2677 func(variables android.FixtureProductVariables) {
2678 variables.Platform_sdk_codename = proptools.StringPtr("S")
2679 variables.Platform_version_active_codenames = []string{"S"}
2680 },
2681 )
Jooyung Haned124c32021-01-26 11:43:46 +09002682 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2683 apex {
2684 name: "myapex",
2685 key: "myapex.key",
2686 native_shared_libs: ["libfoo"],
2687 min_sdk_version: "S",
2688 }
2689 apex_key {
2690 name: "myapex.key",
2691 public_key: "testkey.avbpubkey",
2692 private_key: "testkey.pem",
2693 }
2694 cc_library {
2695 name: "libfoo",
2696 shared_libs: ["libbar"],
2697 apex_available: ["myapex"],
2698 min_sdk_version: "29",
2699 }
2700 cc_library {
2701 name: "libbar",
2702 apex_available: ["myapex"],
2703 }
2704 `, withSAsActiveCodeNames)
2705}
2706
2707func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002708 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2709 variables.Platform_sdk_codename = proptools.StringPtr("S")
2710 variables.Platform_version_active_codenames = []string{"S", "T"}
2711 })
Colin Cross1c460562021-02-16 17:55:47 -08002712 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002713 apex {
2714 name: "myapex",
2715 key: "myapex.key",
2716 native_shared_libs: ["libfoo"],
2717 min_sdk_version: "S",
2718 }
2719 apex_key {
2720 name: "myapex.key",
2721 public_key: "testkey.avbpubkey",
2722 private_key: "testkey.pem",
2723 }
2724 cc_library {
2725 name: "libfoo",
2726 shared_libs: ["libbar"],
2727 apex_available: ["myapex"],
2728 min_sdk_version: "S",
2729 }
2730 cc_library {
2731 name: "libbar",
2732 stubs: {
2733 symbol_file: "libbar.map.txt",
2734 versions: ["30", "S", "T"],
2735 },
2736 }
2737 `, withSAsActiveCodeNames)
2738
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002739 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002740 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2741 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002742 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002743}
2744
Jiyong Park7c2ee712018-12-07 00:42:25 +09002745func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002746 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002747 apex {
2748 name: "myapex",
2749 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002750 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002751 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002752 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002753 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002754 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002755 }
2756
2757 apex_key {
2758 name: "myapex.key",
2759 public_key: "testkey.avbpubkey",
2760 private_key: "testkey.pem",
2761 }
2762
2763 prebuilt_etc {
2764 name: "myetc",
2765 src: "myprebuilt",
2766 sub_dir: "foo/bar",
2767 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002768
2769 cc_library {
2770 name: "mylib",
2771 srcs: ["mylib.cpp"],
2772 relative_install_path: "foo/bar",
2773 system_shared_libs: [],
2774 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002775 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002776 }
2777
2778 cc_binary {
2779 name: "mybin",
2780 srcs: ["mylib.cpp"],
2781 relative_install_path: "foo/bar",
2782 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002783 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002784 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002785 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002786
2787 rust_binary {
2788 name: "mybin.rust",
2789 srcs: ["foo.rs"],
2790 relative_install_path: "rust_subdir",
2791 apex_available: [ "myapex" ],
2792 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002793 `)
2794
Jooyung Hana0503a52023-08-23 13:12:50 +09002795 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002796 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002797
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002798 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002799 ensureContains(t, cmd, "/etc ")
2800 ensureContains(t, cmd, "/etc/foo ")
2801 ensureContains(t, cmd, "/etc/foo/bar ")
2802 ensureContains(t, cmd, "/lib64 ")
2803 ensureContains(t, cmd, "/lib64/foo ")
2804 ensureContains(t, cmd, "/lib64/foo/bar ")
2805 ensureContains(t, cmd, "/lib ")
2806 ensureContains(t, cmd, "/lib/foo ")
2807 ensureContains(t, cmd, "/lib/foo/bar ")
2808 ensureContains(t, cmd, "/bin ")
2809 ensureContains(t, cmd, "/bin/foo ")
2810 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002811 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002812}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002813
Jooyung Han35155c42020-02-06 17:33:20 +09002814func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002815 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002816 apex {
2817 name: "myapex",
2818 key: "myapex.key",
2819 multilib: {
2820 both: {
2821 native_shared_libs: ["mylib"],
2822 binaries: ["mybin"],
2823 },
2824 },
2825 compile_multilib: "both",
2826 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002827 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002828 }
2829
2830 apex_key {
2831 name: "myapex.key",
2832 public_key: "testkey.avbpubkey",
2833 private_key: "testkey.pem",
2834 }
2835
2836 cc_library {
2837 name: "mylib",
2838 relative_install_path: "foo/bar",
2839 system_shared_libs: [],
2840 stl: "none",
2841 apex_available: [ "myapex" ],
2842 native_bridge_supported: true,
2843 }
2844
2845 cc_binary {
2846 name: "mybin",
2847 relative_install_path: "foo/bar",
2848 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002849 stl: "none",
2850 apex_available: [ "myapex" ],
2851 native_bridge_supported: true,
2852 compile_multilib: "both", // default is "first" for binary
2853 multilib: {
2854 lib64: {
2855 suffix: "64",
2856 },
2857 },
2858 }
2859 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09002860 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09002861 "bin/foo/bar/mybin",
2862 "bin/foo/bar/mybin64",
2863 "bin/arm/foo/bar/mybin",
2864 "bin/arm64/foo/bar/mybin64",
2865 "lib/foo/bar/mylib.so",
2866 "lib/arm/foo/bar/mylib.so",
2867 "lib64/foo/bar/mylib.so",
2868 "lib64/arm64/foo/bar/mylib.so",
2869 })
2870}
2871
Jooyung Han85d61762020-06-24 23:50:26 +09002872func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002873 result := android.GroupFixturePreparers(
2874 prepareForApexTest,
2875 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2876 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002877 apex {
2878 name: "myapex",
2879 key: "myapex.key",
2880 binaries: ["mybin"],
2881 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002882 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002883 }
2884 apex_key {
2885 name: "myapex.key",
2886 public_key: "testkey.avbpubkey",
2887 private_key: "testkey.pem",
2888 }
2889 cc_binary {
2890 name: "mybin",
2891 vendor: true,
2892 shared_libs: ["libfoo"],
2893 }
2894 cc_library {
2895 name: "libfoo",
2896 proprietary: true,
2897 }
2898 `)
2899
Jooyung Hana0503a52023-08-23 13:12:50 +09002900 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002901 "bin/mybin",
2902 "lib64/libfoo.so",
2903 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2904 "lib64/libc++.so",
2905 })
2906
Jooyung Hana0503a52023-08-23 13:12:50 +09002907 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08002908 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002909 name := apexBundle.BaseModuleName()
2910 prefix := "TARGET_"
2911 var builder strings.Builder
2912 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002913 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002914 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002915 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002916
Jooyung Hana0503a52023-08-23 13:12:50 +09002917 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002918 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2919 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002920}
2921
Jooyung Hanc5a96762022-02-04 11:54:50 +09002922func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2923 testApexError(t, `Trying to include a VNDK library`, `
2924 apex {
2925 name: "myapex",
2926 key: "myapex.key",
2927 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2928 vendor: true,
2929 use_vndk_as_stable: true,
2930 updatable: false,
2931 }
2932 apex_key {
2933 name: "myapex.key",
2934 public_key: "testkey.avbpubkey",
2935 private_key: "testkey.pem",
2936 }`)
2937}
2938
Jooyung Handf78e212020-07-22 15:54:47 +09002939func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002940 // myapex myapex2
2941 // | |
2942 // mybin ------. mybin2
2943 // \ \ / |
2944 // (stable) .---\--------` |
2945 // \ / \ |
2946 // \ / \ /
2947 // libvndk libvendor
2948 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002949 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002950 apex {
2951 name: "myapex",
2952 key: "myapex.key",
2953 binaries: ["mybin"],
2954 vendor: true,
2955 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002956 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002957 }
2958 apex_key {
2959 name: "myapex.key",
2960 public_key: "testkey.avbpubkey",
2961 private_key: "testkey.pem",
2962 }
2963 cc_binary {
2964 name: "mybin",
2965 vendor: true,
2966 shared_libs: ["libvndk", "libvendor"],
2967 }
2968 cc_library {
2969 name: "libvndk",
2970 vndk: {
2971 enabled: true,
2972 },
2973 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002974 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002975 }
2976 cc_library {
2977 name: "libvendor",
2978 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002979 stl: "none",
2980 }
2981 apex {
2982 name: "myapex2",
2983 key: "myapex.key",
2984 binaries: ["mybin2"],
2985 vendor: true,
2986 use_vndk_as_stable: false,
2987 updatable: false,
2988 }
2989 cc_binary {
2990 name: "mybin2",
2991 vendor: true,
2992 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002993 }
Kiyoung Kim8269cee2023-07-26 12:39:19 +09002994 `,
2995 android.FixtureModifyConfig(func(config android.Config) {
2996 config.TestProductVariables.KeepVndk = proptools.BoolPtr(true)
2997 }),
2998 )
Jooyung Handf78e212020-07-22 15:54:47 +09002999
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003000 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09003001
Jooyung Han91f92032022-02-04 12:36:33 +09003002 for _, tc := range []struct {
3003 name string
3004 apexName string
3005 moduleName string
3006 moduleVariant string
3007 libs []string
3008 contents []string
3009 requireVndkNamespace bool
3010 }{
3011 {
3012 name: "use_vndk_as_stable",
3013 apexName: "myapex",
3014 moduleName: "mybin",
3015 moduleVariant: vendorVariant + "_apex10000",
3016 libs: []string{
3017 // should link with vendor variants of VNDK libs(libvndk/libc++)
3018 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3019 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3020 // unstable Vendor libs as APEX variant
3021 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3022 },
3023 contents: []string{
3024 "bin/mybin",
3025 "lib64/libvendor.so",
3026 // VNDK libs (libvndk/libc++) are not included
3027 },
3028 requireVndkNamespace: true,
3029 },
3030 {
3031 name: "!use_vndk_as_stable",
3032 apexName: "myapex2",
3033 moduleName: "mybin2",
3034 moduleVariant: vendorVariant + "_myapex2",
3035 libs: []string{
3036 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3037 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3038 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3039 // unstable vendor libs have "merged" APEX variants
3040 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3041 },
3042 contents: []string{
3043 "bin/mybin2",
3044 "lib64/libvendor.so",
3045 // VNDK libs are included as well
3046 "lib64/libvndk.so",
3047 "lib64/libc++.so",
3048 },
3049 requireVndkNamespace: false,
3050 },
3051 } {
3052 t.Run(tc.name, func(t *testing.T) {
3053 // Check linked libs
3054 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3055 libs := names(ldRule.Args["libFlags"])
3056 for _, lib := range tc.libs {
3057 ensureListContains(t, libs, lib)
3058 }
3059 // Check apex contents
Jooyung Hana0503a52023-08-23 13:12:50 +09003060 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName, tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003061
Jooyung Han91f92032022-02-04 12:36:33 +09003062 // Check "requireNativeLibs"
Jooyung Hana0503a52023-08-23 13:12:50 +09003063 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName).Rule("apexManifestRule")
Jooyung Han91f92032022-02-04 12:36:33 +09003064 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3065 if tc.requireVndkNamespace {
3066 ensureListContains(t, requireNativeLibs, ":vndk")
3067 } else {
3068 ensureListNotContains(t, requireNativeLibs, ":vndk")
3069 }
3070 })
3071 }
Jooyung Handf78e212020-07-22 15:54:47 +09003072}
3073
Justin Yun13decfb2021-03-08 19:25:55 +09003074func TestProductVariant(t *testing.T) {
3075 ctx := testApex(t, `
3076 apex {
3077 name: "myapex",
3078 key: "myapex.key",
3079 updatable: false,
3080 product_specific: true,
3081 binaries: ["foo"],
3082 }
3083
3084 apex_key {
3085 name: "myapex.key",
3086 public_key: "testkey.avbpubkey",
3087 private_key: "testkey.pem",
3088 }
3089
3090 cc_binary {
3091 name: "foo",
3092 product_available: true,
3093 apex_available: ["myapex"],
3094 srcs: ["foo.cpp"],
3095 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003096 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003097
3098 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003099 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003100 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3101 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3102 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3103 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3104}
3105
Jooyung Han8e5685d2020-09-21 11:02:57 +09003106func TestApex_withPrebuiltFirmware(t *testing.T) {
3107 testCases := []struct {
3108 name string
3109 additionalProp string
3110 }{
3111 {"system apex with prebuilt_firmware", ""},
3112 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3113 }
3114 for _, tc := range testCases {
3115 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003116 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003117 apex {
3118 name: "myapex",
3119 key: "myapex.key",
3120 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003121 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003122 `+tc.additionalProp+`
3123 }
3124 apex_key {
3125 name: "myapex.key",
3126 public_key: "testkey.avbpubkey",
3127 private_key: "testkey.pem",
3128 }
3129 prebuilt_firmware {
3130 name: "myfirmware",
3131 src: "myfirmware.bin",
3132 filename_from_src: true,
3133 `+tc.additionalProp+`
3134 }
3135 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003136 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003137 "etc/firmware/myfirmware.bin",
3138 })
3139 })
3140 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003141}
3142
Jooyung Hanefb184e2020-06-25 17:14:25 +09003143func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003144 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003145 apex {
3146 name: "myapex",
3147 key: "myapex.key",
3148 vendor: true,
3149 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003150 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003151 }
3152
3153 apex_key {
3154 name: "myapex.key",
3155 public_key: "testkey.avbpubkey",
3156 private_key: "testkey.pem",
3157 }
3158
3159 cc_library {
3160 name: "mylib",
3161 vendor_available: true,
3162 }
3163 `)
3164
Jooyung Hana0503a52023-08-23 13:12:50 +09003165 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003166 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003167 name := apexBundle.BaseModuleName()
3168 prefix := "TARGET_"
3169 var builder strings.Builder
3170 data.Custom(&builder, name, prefix, "", data)
3171 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003172 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 +09003173}
3174
Jooyung Han2ed99d02020-06-24 23:26:26 +09003175func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003176 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003177 apex {
3178 name: "myapex",
3179 key: "myapex.key",
3180 vintf_fragments: ["fragment.xml"],
3181 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003182 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003183 }
3184 apex_key {
3185 name: "myapex.key",
3186 public_key: "testkey.avbpubkey",
3187 private_key: "testkey.pem",
3188 }
3189 cc_binary {
3190 name: "mybin",
3191 }
3192 `)
3193
Jooyung Hana0503a52023-08-23 13:12:50 +09003194 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003195 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003196 name := apexBundle.BaseModuleName()
3197 prefix := "TARGET_"
3198 var builder strings.Builder
3199 data.Custom(&builder, name, prefix, "", data)
3200 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003201 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003202 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003203}
3204
Jiyong Park16e91a02018-12-20 18:18:08 +09003205func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003206 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003207 apex {
3208 name: "myapex",
3209 key: "myapex.key",
3210 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003211 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003212 }
3213
3214 apex_key {
3215 name: "myapex.key",
3216 public_key: "testkey.avbpubkey",
3217 private_key: "testkey.pem",
3218 }
3219
3220 cc_library {
3221 name: "mylib",
3222 srcs: ["mylib.cpp"],
3223 system_shared_libs: [],
3224 stl: "none",
3225 stubs: {
3226 versions: ["1", "2", "3"],
3227 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003228 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003229 }
3230
3231 cc_binary {
3232 name: "not_in_apex",
3233 srcs: ["mylib.cpp"],
3234 static_libs: ["mylib"],
3235 static_executable: true,
3236 system_shared_libs: [],
3237 stl: "none",
3238 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003239 `)
3240
Colin Cross7113d202019-11-20 16:39:12 -08003241 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003242
3243 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003244 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003245}
Jiyong Park9335a262018-12-24 11:31:58 +09003246
3247func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003248 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003249 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003250 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003251 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003252 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003253 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003254 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003255 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003256 }
3257
3258 cc_library {
3259 name: "mylib",
3260 srcs: ["mylib.cpp"],
3261 system_shared_libs: [],
3262 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003263 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003264 }
3265
3266 apex_key {
3267 name: "myapex.key",
3268 public_key: "testkey.avbpubkey",
3269 private_key: "testkey.pem",
3270 }
3271
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003272 android_app_certificate {
3273 name: "myapex.certificate",
3274 certificate: "testkey",
3275 }
3276
3277 android_app_certificate {
3278 name: "myapex.certificate.override",
3279 certificate: "testkey.override",
3280 }
3281
Jiyong Park9335a262018-12-24 11:31:58 +09003282 `)
3283
3284 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003285 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003286
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003287 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3288 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003289 "vendor/foo/devkeys/testkey.avbpubkey")
3290 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003291 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3292 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003293 "vendor/foo/devkeys/testkey.pem")
3294 }
3295
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003296 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003297 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003298 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003299 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003300 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003301 }
3302}
Jiyong Park58e364a2019-01-19 19:24:06 +09003303
Jooyung Hanf121a652019-12-17 14:30:11 +09003304func TestCertificate(t *testing.T) {
3305 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003306 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003307 apex {
3308 name: "myapex",
3309 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003310 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003311 }
3312 apex_key {
3313 name: "myapex.key",
3314 public_key: "testkey.avbpubkey",
3315 private_key: "testkey.pem",
3316 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003317 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003318 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3319 if actual := rule.Args["certificates"]; actual != expected {
3320 t.Errorf("certificates should be %q, not %q", expected, actual)
3321 }
3322 })
3323 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003324 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003325 apex {
3326 name: "myapex_keytest",
3327 key: "myapex.key",
3328 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003329 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003330 }
3331 apex_key {
3332 name: "myapex.key",
3333 public_key: "testkey.avbpubkey",
3334 private_key: "testkey.pem",
3335 }
3336 android_app_certificate {
3337 name: "myapex.certificate.override",
3338 certificate: "testkey.override",
3339 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003340 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003341 expected := "testkey.override.x509.pem testkey.override.pk8"
3342 if actual := rule.Args["certificates"]; actual != expected {
3343 t.Errorf("certificates should be %q, not %q", expected, actual)
3344 }
3345 })
3346 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003347 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003348 apex {
3349 name: "myapex",
3350 key: "myapex.key",
3351 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003352 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003353 }
3354 apex_key {
3355 name: "myapex.key",
3356 public_key: "testkey.avbpubkey",
3357 private_key: "testkey.pem",
3358 }
3359 android_app_certificate {
3360 name: "myapex.certificate",
3361 certificate: "testkey",
3362 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003363 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003364 expected := "testkey.x509.pem testkey.pk8"
3365 if actual := rule.Args["certificates"]; actual != expected {
3366 t.Errorf("certificates should be %q, not %q", expected, actual)
3367 }
3368 })
3369 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003370 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003371 apex {
3372 name: "myapex_keytest",
3373 key: "myapex.key",
3374 file_contexts: ":myapex-file_contexts",
3375 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003376 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003377 }
3378 apex_key {
3379 name: "myapex.key",
3380 public_key: "testkey.avbpubkey",
3381 private_key: "testkey.pem",
3382 }
3383 android_app_certificate {
3384 name: "myapex.certificate.override",
3385 certificate: "testkey.override",
3386 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003387 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003388 expected := "testkey.override.x509.pem testkey.override.pk8"
3389 if actual := rule.Args["certificates"]; actual != expected {
3390 t.Errorf("certificates should be %q, not %q", expected, actual)
3391 }
3392 })
3393 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003394 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003395 apex {
3396 name: "myapex",
3397 key: "myapex.key",
3398 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003399 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003400 }
3401 apex_key {
3402 name: "myapex.key",
3403 public_key: "testkey.avbpubkey",
3404 private_key: "testkey.pem",
3405 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003406 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003407 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3408 if actual := rule.Args["certificates"]; actual != expected {
3409 t.Errorf("certificates should be %q, not %q", expected, actual)
3410 }
3411 })
3412 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003413 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003414 apex {
3415 name: "myapex_keytest",
3416 key: "myapex.key",
3417 file_contexts: ":myapex-file_contexts",
3418 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003419 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003420 }
3421 apex_key {
3422 name: "myapex.key",
3423 public_key: "testkey.avbpubkey",
3424 private_key: "testkey.pem",
3425 }
3426 android_app_certificate {
3427 name: "myapex.certificate.override",
3428 certificate: "testkey.override",
3429 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003430 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003431 expected := "testkey.override.x509.pem testkey.override.pk8"
3432 if actual := rule.Args["certificates"]; actual != expected {
3433 t.Errorf("certificates should be %q, not %q", expected, actual)
3434 }
3435 })
3436}
3437
Jiyong Park58e364a2019-01-19 19:24:06 +09003438func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003439 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003440 apex {
3441 name: "myapex",
3442 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003443 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003444 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003445 }
3446
3447 apex {
3448 name: "otherapex",
3449 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003450 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003451 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003452 }
3453
3454 apex_key {
3455 name: "myapex.key",
3456 public_key: "testkey.avbpubkey",
3457 private_key: "testkey.pem",
3458 }
3459
3460 cc_library {
3461 name: "mylib",
3462 srcs: ["mylib.cpp"],
3463 system_shared_libs: [],
3464 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003465 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003466 "myapex",
3467 "otherapex",
3468 ],
Jooyung Han24282772020-03-21 23:20:55 +09003469 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003470 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003471 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003472 cc_library {
3473 name: "mylib2",
3474 srcs: ["mylib.cpp"],
3475 system_shared_libs: [],
3476 stl: "none",
3477 apex_available: [
3478 "myapex",
3479 "otherapex",
3480 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003481 static_libs: ["mylib3"],
3482 recovery_available: true,
3483 min_sdk_version: "29",
3484 }
3485 cc_library {
3486 name: "mylib3",
3487 srcs: ["mylib.cpp"],
3488 system_shared_libs: [],
3489 stl: "none",
3490 apex_available: [
3491 "myapex",
3492 "otherapex",
3493 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003494 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003495 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003496 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003497 `)
3498
Jooyung Hanc87a0592020-03-02 17:44:33 +09003499 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003500 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003501 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003502
Vinh Tranf9754732023-01-19 22:41:46 -05003503 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003504 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003505 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003506
Vinh Tranf9754732023-01-19 22:41:46 -05003507 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003508 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003509 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003510
Colin Crossaede88c2020-08-11 12:17:01 -07003511 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3512 // each variant defines additional macros to distinguish which apex variant it is built for
3513
3514 // non-APEX variant does not have __ANDROID_APEX__ defined
3515 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3516 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3517
Vinh Tranf9754732023-01-19 22:41:46 -05003518 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003519 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3520 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003521
Jooyung Hanc87a0592020-03-02 17:44:33 +09003522 // non-APEX variant does not have __ANDROID_APEX__ defined
3523 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3524 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3525
Vinh Tranf9754732023-01-19 22:41:46 -05003526 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003527 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003528 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003529}
Jiyong Park7e636d02019-01-28 16:16:54 +09003530
3531func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003532 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003533 apex {
3534 name: "myapex",
3535 key: "myapex.key",
3536 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003537 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003538 }
3539
3540 apex_key {
3541 name: "myapex.key",
3542 public_key: "testkey.avbpubkey",
3543 private_key: "testkey.pem",
3544 }
3545
3546 cc_library_headers {
3547 name: "mylib_headers",
3548 export_include_dirs: ["my_include"],
3549 system_shared_libs: [],
3550 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003551 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003552 }
3553
3554 cc_library {
3555 name: "mylib",
3556 srcs: ["mylib.cpp"],
3557 system_shared_libs: [],
3558 stl: "none",
3559 header_libs: ["mylib_headers"],
3560 export_header_lib_headers: ["mylib_headers"],
3561 stubs: {
3562 versions: ["1", "2", "3"],
3563 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003564 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003565 }
3566
3567 cc_library {
3568 name: "otherlib",
3569 srcs: ["mylib.cpp"],
3570 system_shared_libs: [],
3571 stl: "none",
3572 shared_libs: ["mylib"],
3573 }
3574 `)
3575
Colin Cross7113d202019-11-20 16:39:12 -08003576 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003577
3578 // Ensure that the include path of the header lib is exported to 'otherlib'
3579 ensureContains(t, cFlags, "-Imy_include")
3580}
Alex Light9670d332019-01-29 18:07:33 -08003581
Jiyong Park7cd10e32020-01-14 09:22:18 +09003582type fileInApex struct {
3583 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003584 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003585 isLink bool
3586}
3587
Jooyung Han1724d582022-12-21 10:17:44 +09003588func (f fileInApex) String() string {
3589 return f.src + ":" + f.path
3590}
3591
3592func (f fileInApex) match(expectation string) bool {
3593 parts := strings.Split(expectation, ":")
3594 if len(parts) == 1 {
3595 match, _ := path.Match(parts[0], f.path)
3596 return match
3597 }
3598 if len(parts) == 2 {
3599 matchSrc, _ := path.Match(parts[0], f.src)
3600 matchDst, _ := path.Match(parts[1], f.path)
3601 return matchSrc && matchDst
3602 }
3603 panic("invalid expected file specification: " + expectation)
3604}
3605
Jooyung Hana57af4a2020-01-23 05:36:59 +00003606func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003607 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003608 module := ctx.ModuleForTests(moduleName, variant)
3609 apexRule := module.MaybeRule("apexRule")
3610 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003611 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003612 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003613 for _, cmd := range strings.Split(copyCmds, "&&") {
3614 cmd = strings.TrimSpace(cmd)
3615 if cmd == "" {
3616 continue
3617 }
3618 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003619 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003620 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003621 switch terms[0] {
3622 case "mkdir":
3623 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003624 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003625 t.Fatal("copyCmds contains invalid cp command", cmd)
3626 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003627 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003628 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003629 isLink = false
3630 case "ln":
3631 if len(terms) != 3 && len(terms) != 4 {
3632 // ln LINK TARGET or ln -s LINK TARGET
3633 t.Fatal("copyCmds contains invalid ln command", cmd)
3634 }
3635 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003636 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003637 isLink = true
3638 default:
3639 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3640 }
3641 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003642 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003643 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003644 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003645 }
Jooyung Han1724d582022-12-21 10:17:44 +09003646 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003647 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003648 }
3649 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003650 return ret
3651}
3652
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003653func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003654 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003655 var failed bool
3656 var surplus []string
3657 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003658 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003659 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003660 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003661 if file.match(expected) {
3662 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003663 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003664 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003665 }
3666 }
Jooyung Han1724d582022-12-21 10:17:44 +09003667 if !matchFound {
3668 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003669 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003670 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003671
Jooyung Han31c470b2019-10-18 16:26:59 +09003672 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003673 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003674 t.Log("surplus files", surplus)
3675 failed = true
3676 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003677
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003678 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003679 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003680 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003681 if !filesMatched[expected] {
3682 missing = append(missing, expected)
3683 }
3684 }
3685 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003686 t.Log("missing files", missing)
3687 failed = true
3688 }
3689 if failed {
3690 t.Fail()
3691 }
3692}
3693
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003694func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3695 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3696}
3697
3698func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3699 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3700 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3701 if deapexer.Output != nil {
3702 outputs = append(outputs, deapexer.Output.String())
3703 }
3704 for _, output := range deapexer.ImplicitOutputs {
3705 outputs = append(outputs, output.String())
3706 }
3707 actualFiles := make([]fileInApex, 0, len(outputs))
3708 for _, output := range outputs {
3709 dir := "/deapexer/"
3710 pos := strings.LastIndex(output, dir)
3711 if pos == -1 {
3712 t.Fatal("Unknown deapexer output ", output)
3713 }
3714 path := output[pos+len(dir):]
3715 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3716 }
3717 assertFileListEquals(t, files, actualFiles)
3718}
3719
Jooyung Han344d5432019-08-23 11:17:39 +09003720func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003721 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003722 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003723 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003724 "etc/llndk.libraries.29.txt",
3725 "etc/vndkcore.libraries.29.txt",
3726 "etc/vndksp.libraries.29.txt",
3727 "etc/vndkprivate.libraries.29.txt",
3728 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003729 }
3730 testCases := []struct {
3731 vndkVersion string
3732 expectedFiles []string
3733 }{
3734 {
3735 vndkVersion: "current",
3736 expectedFiles: append(commonFiles,
3737 "lib/libvndk.so",
3738 "lib/libvndksp.so",
3739 "lib64/libvndk.so",
3740 "lib64/libvndksp.so"),
3741 },
3742 {
3743 vndkVersion: "",
3744 expectedFiles: append(commonFiles,
3745 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3746 "lib/libvndksp.so",
3747 "lib64/libvndksp.so"),
3748 },
3749 }
3750 for _, tc := range testCases {
3751 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3752 ctx := testApex(t, `
3753 apex_vndk {
3754 name: "com.android.vndk.current",
3755 key: "com.android.vndk.current.key",
3756 updatable: false,
3757 }
3758
3759 apex_key {
3760 name: "com.android.vndk.current.key",
3761 public_key: "testkey.avbpubkey",
3762 private_key: "testkey.pem",
3763 }
3764
3765 cc_library {
3766 name: "libvndk",
3767 srcs: ["mylib.cpp"],
3768 vendor_available: true,
3769 product_available: true,
3770 vndk: {
3771 enabled: true,
3772 },
3773 system_shared_libs: [],
3774 stl: "none",
3775 apex_available: [ "com.android.vndk.current" ],
3776 }
3777
3778 cc_library {
3779 name: "libvndksp",
3780 srcs: ["mylib.cpp"],
3781 vendor_available: true,
3782 product_available: true,
3783 vndk: {
3784 enabled: true,
3785 support_system_process: true,
3786 },
3787 system_shared_libs: [],
3788 stl: "none",
3789 apex_available: [ "com.android.vndk.current" ],
3790 }
3791
3792 // VNDK-Ext should not cause any problems
3793
3794 cc_library {
3795 name: "libvndk.ext",
3796 srcs: ["mylib2.cpp"],
3797 vendor: true,
3798 vndk: {
3799 enabled: true,
3800 extends: "libvndk",
3801 },
3802 system_shared_libs: [],
3803 stl: "none",
3804 }
3805
3806 cc_library {
3807 name: "libvndksp.ext",
3808 srcs: ["mylib2.cpp"],
3809 vendor: true,
3810 vndk: {
3811 enabled: true,
3812 support_system_process: true,
3813 extends: "libvndksp",
3814 },
3815 system_shared_libs: [],
3816 stl: "none",
3817 }
3818 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3819 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
Kiyoung Kima2d6dee2023-08-11 10:14:43 +09003820 variables.KeepVndk = proptools.BoolPtr(true)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003821 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003822 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", tc.expectedFiles)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003823 })
3824 }
Jooyung Han344d5432019-08-23 11:17:39 +09003825}
3826
3827func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003828 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003829 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003830 name: "com.android.vndk.current",
3831 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003832 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003833 }
3834
3835 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003836 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003837 public_key: "testkey.avbpubkey",
3838 private_key: "testkey.pem",
3839 }
3840
3841 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003842 name: "libvndk",
3843 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003844 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003845 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003846 vndk: {
3847 enabled: true,
3848 },
3849 system_shared_libs: [],
3850 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003851 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003852 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003853
3854 cc_prebuilt_library_shared {
3855 name: "libvndk.arm",
3856 srcs: ["libvndk.arm.so"],
3857 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003858 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003859 vndk: {
3860 enabled: true,
3861 },
3862 enabled: false,
3863 arch: {
3864 arm: {
3865 enabled: true,
3866 },
3867 },
3868 system_shared_libs: [],
3869 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003870 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003871 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003872 `+vndkLibrariesTxtFiles("current"),
3873 withFiles(map[string][]byte{
3874 "libvndk.so": nil,
3875 "libvndk.arm.so": nil,
3876 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003877 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003878 "lib/libvndk.so",
3879 "lib/libvndk.arm.so",
3880 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003881 "lib/libc++.so",
3882 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003883 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003884 })
Jooyung Han344d5432019-08-23 11:17:39 +09003885}
3886
Jooyung Han39edb6c2019-11-06 16:53:07 +09003887func vndkLibrariesTxtFiles(vers ...string) (result string) {
3888 for _, v := range vers {
3889 if v == "current" {
Justin Yund5784122023-10-25 13:25:32 +09003890 for _, txt := range []string{"vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003891 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003892 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003893 name: "` + txt + `.libraries.txt",
Justin Yund5784122023-10-25 13:25:32 +09003894 insert_vndk_version: true,
Jooyung Han39edb6c2019-11-06 16:53:07 +09003895 }
3896 `
3897 }
Justin Yund5784122023-10-25 13:25:32 +09003898 result += `
3899 llndk_libraries_txt {
3900 name: "llndk.libraries.txt",
3901 }
3902 llndk_libraries_txt_for_apex {
3903 name: "llndk.libraries.txt.apex",
3904 stem: "llndk.libraries.txt",
3905 insert_vndk_version: true,
3906 }
3907 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003908 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003909 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003910 result += `
3911 prebuilt_etc {
3912 name: "` + txt + `.libraries.` + v + `.txt",
3913 src: "dummy.txt",
3914 }
3915 `
3916 }
3917 }
3918 }
3919 return
3920}
3921
Jooyung Han344d5432019-08-23 11:17:39 +09003922func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003923 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003924 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003925 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003926 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003927 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003928 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003929 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003930 }
3931
3932 apex_key {
3933 name: "myapex.key",
3934 public_key: "testkey.avbpubkey",
3935 private_key: "testkey.pem",
3936 }
3937
Jooyung Han31c470b2019-10-18 16:26:59 +09003938 vndk_prebuilt_shared {
3939 name: "libvndk27",
3940 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003941 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003942 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003943 vndk: {
3944 enabled: true,
3945 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003946 target_arch: "arm64",
3947 arch: {
3948 arm: {
3949 srcs: ["libvndk27_arm.so"],
3950 },
3951 arm64: {
3952 srcs: ["libvndk27_arm64.so"],
3953 },
3954 },
Colin Cross2807f002021-03-02 10:15:29 -08003955 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003956 }
3957
3958 vndk_prebuilt_shared {
3959 name: "libvndk27",
3960 version: "27",
3961 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003962 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003963 vndk: {
3964 enabled: true,
3965 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003966 target_arch: "x86_64",
3967 arch: {
3968 x86: {
3969 srcs: ["libvndk27_x86.so"],
3970 },
3971 x86_64: {
3972 srcs: ["libvndk27_x86_64.so"],
3973 },
3974 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003975 }
3976 `+vndkLibrariesTxtFiles("27"),
3977 withFiles(map[string][]byte{
3978 "libvndk27_arm.so": nil,
3979 "libvndk27_arm64.so": nil,
3980 "libvndk27_x86.so": nil,
3981 "libvndk27_x86_64.so": nil,
3982 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003983
Jooyung Hana0503a52023-08-23 13:12:50 +09003984 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003985 "lib/libvndk27_arm.so",
3986 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003987 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003988 })
Jooyung Han344d5432019-08-23 11:17:39 +09003989}
3990
Jooyung Han90eee022019-10-01 20:02:42 +09003991func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003992 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003993 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003994 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003995 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003996 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003997 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003998 }
3999 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004000 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004001 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004002 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004003 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004004 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004005 }
4006 apex_key {
4007 name: "myapex.key",
4008 public_key: "testkey.avbpubkey",
4009 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004010 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004011
4012 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004013 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004014 apexManifestRule := module.Rule("apexManifestRule")
4015 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004016 }
4017
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004018 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004019 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004020}
4021
Jooyung Han344d5432019-08-23 11:17:39 +09004022func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004023 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004024 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004025 name: "com.android.vndk.current",
4026 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004027 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004028 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004029 }
4030
4031 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004032 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004033 public_key: "testkey.avbpubkey",
4034 private_key: "testkey.pem",
4035 }
4036
4037 cc_library {
4038 name: "libvndk",
4039 srcs: ["mylib.cpp"],
4040 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004041 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004042 native_bridge_supported: true,
4043 host_supported: true,
4044 vndk: {
4045 enabled: true,
4046 },
4047 system_shared_libs: [],
4048 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004049 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004050 }
Colin Cross2807f002021-03-02 10:15:29 -08004051 `+vndkLibrariesTxtFiles("current"),
4052 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004053
Jooyung Hana0503a52023-08-23 13:12:50 +09004054 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004055 "lib/libvndk.so",
4056 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004057 "lib/libc++.so",
4058 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004059 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004060 })
Jooyung Han344d5432019-08-23 11:17:39 +09004061}
4062
4063func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004064 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004065 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004066 name: "com.android.vndk.current",
4067 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004068 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004069 native_bridge_supported: true,
4070 }
4071
4072 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004073 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004074 public_key: "testkey.avbpubkey",
4075 private_key: "testkey.pem",
4076 }
4077
4078 cc_library {
4079 name: "libvndk",
4080 srcs: ["mylib.cpp"],
4081 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004082 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004083 native_bridge_supported: true,
4084 host_supported: true,
4085 vndk: {
4086 enabled: true,
4087 },
4088 system_shared_libs: [],
4089 stl: "none",
4090 }
4091 `)
4092}
4093
Jooyung Han31c470b2019-10-18 16:26:59 +09004094func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004095 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004096 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004097 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004098 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004099 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004100 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004101 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004102 }
4103
4104 apex_key {
4105 name: "myapex.key",
4106 public_key: "testkey.avbpubkey",
4107 private_key: "testkey.pem",
4108 }
4109
4110 vndk_prebuilt_shared {
4111 name: "libvndk27",
4112 version: "27",
4113 target_arch: "arm",
4114 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004115 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004116 vndk: {
4117 enabled: true,
4118 },
4119 arch: {
4120 arm: {
4121 srcs: ["libvndk27.so"],
4122 }
4123 },
4124 }
4125
4126 vndk_prebuilt_shared {
4127 name: "libvndk27",
4128 version: "27",
4129 target_arch: "arm",
4130 binder32bit: true,
4131 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004132 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004133 vndk: {
4134 enabled: true,
4135 },
4136 arch: {
4137 arm: {
4138 srcs: ["libvndk27binder32.so"],
4139 }
4140 },
Colin Cross2807f002021-03-02 10:15:29 -08004141 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004142 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004143 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004144 withFiles(map[string][]byte{
4145 "libvndk27.so": nil,
4146 "libvndk27binder32.so": nil,
4147 }),
4148 withBinder32bit,
4149 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004150 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004151 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4152 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004153 },
4154 }),
4155 )
4156
Jooyung Hana0503a52023-08-23 13:12:50 +09004157 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004158 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004159 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004160 })
4161}
4162
Jooyung Han45a96772020-06-15 14:59:42 +09004163func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004164 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004165 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004166 name: "com.android.vndk.current",
4167 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004168 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004169 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004170 }
4171
4172 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004173 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004174 public_key: "testkey.avbpubkey",
4175 private_key: "testkey.pem",
4176 }
4177
4178 cc_library {
4179 name: "libz",
4180 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004181 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004182 vndk: {
4183 enabled: true,
4184 },
4185 stubs: {
4186 symbol_file: "libz.map.txt",
4187 versions: ["30"],
4188 }
4189 }
4190 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4191 "libz.map.txt": nil,
4192 }))
4193
Jooyung Hana0503a52023-08-23 13:12:50 +09004194 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004195 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4196 ensureListEmpty(t, provideNativeLibs)
Jooyung Hana0503a52023-08-23 13:12:50 +09004197 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han1724d582022-12-21 10:17:44 +09004198 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4199 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4200 "*/*",
4201 })
Jooyung Han45a96772020-06-15 14:59:42 +09004202}
4203
Jooyung Hane3f02812023-05-08 13:54:50 +09004204func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4205 ctx := testApex(t, "",
4206 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4207 variables.DeviceVndkVersion = proptools.StringPtr("27")
4208 }),
4209 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4210 cc.RegisterVendorSnapshotModules(ctx)
4211 }),
4212 withFiles(map[string][]byte{
4213 "vendor/foo/Android.bp": []byte(`
4214 apex {
4215 name: "myapex",
4216 binaries: ["foo"],
4217 key: "myapex.key",
4218 min_sdk_version: "27",
4219 vendor: true,
4220 }
4221
4222 cc_binary {
4223 name: "foo",
4224 vendor: true,
4225 srcs: ["abc.cpp"],
4226 shared_libs: [
4227 "libllndk",
4228 "libvndk",
4229 ],
4230 nocrt: true,
4231 system_shared_libs: [],
4232 min_sdk_version: "27",
4233 }
4234
4235 apex_key {
4236 name: "myapex.key",
4237 public_key: "testkey.avbpubkey",
4238 private_key: "testkey.pem",
4239 }
4240 `),
4241 // Simulate VNDK prebuilts with vendor_snapshot
4242 "prebuilts/vndk/Android.bp": []byte(`
4243 vndk_prebuilt_shared {
4244 name: "libllndk",
4245 version: "27",
4246 vendor_available: true,
4247 product_available: true,
4248 target_arch: "arm64",
4249 arch: {
4250 arm64: {
4251 srcs: ["libllndk.so"],
4252 },
4253 },
4254 }
4255
4256 vndk_prebuilt_shared {
4257 name: "libvndk",
4258 version: "27",
4259 vendor_available: true,
4260 product_available: true,
4261 target_arch: "arm64",
4262 arch: {
4263 arm64: {
4264 srcs: ["libvndk.so"],
4265 },
4266 },
4267 vndk: {
4268 enabled: true,
4269 },
4270 min_sdk_version: "27",
4271 }
4272
4273 vndk_prebuilt_shared {
4274 name: "libc++",
4275 version: "27",
4276 target_arch: "arm64",
4277 vendor_available: true,
4278 product_available: true,
4279 vndk: {
4280 enabled: true,
4281 support_system_process: true,
4282 },
4283 arch: {
4284 arm64: {
4285 srcs: ["libc++.so"],
4286 },
4287 },
4288 min_sdk_version: "apex_inherit",
4289 }
4290
4291 vendor_snapshot {
4292 name: "vendor_snapshot",
4293 version: "27",
4294 arch: {
4295 arm64: {
4296 vndk_libs: [
4297 "libc++",
4298 "libllndk",
4299 "libvndk",
4300 ],
4301 static_libs: [
4302 "libc++demangle",
4303 "libclang_rt.builtins",
4304 "libunwind",
4305 ],
4306 },
4307 }
4308 }
4309
4310 vendor_snapshot_static {
4311 name: "libclang_rt.builtins",
4312 version: "27",
4313 target_arch: "arm64",
4314 vendor: true,
4315 arch: {
4316 arm64: {
4317 src: "libclang_rt.builtins-aarch64-android.a",
4318 },
4319 },
4320 }
4321
4322 vendor_snapshot_static {
4323 name: "libc++demangle",
4324 version: "27",
4325 target_arch: "arm64",
4326 compile_multilib: "64",
4327 vendor: true,
4328 arch: {
4329 arm64: {
4330 src: "libc++demangle.a",
4331 },
4332 },
4333 min_sdk_version: "apex_inherit",
4334 }
4335
4336 vendor_snapshot_static {
4337 name: "libunwind",
4338 version: "27",
4339 target_arch: "arm64",
4340 compile_multilib: "64",
4341 vendor: true,
4342 arch: {
4343 arm64: {
4344 src: "libunwind.a",
4345 },
4346 },
4347 min_sdk_version: "apex_inherit",
4348 }
4349 `),
4350 }))
4351
4352 // Should embed the prebuilt VNDK libraries in the apex
Jooyung Hana0503a52023-08-23 13:12:50 +09004353 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hane3f02812023-05-08 13:54:50 +09004354 "bin/foo",
4355 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4356 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4357 })
4358
4359 // Should link foo with prebuilt libraries (shared/static)
4360 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4361 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4362 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4363 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4364 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4365
4366 // Should declare the LLNDK library as a "required" external dependency
Jooyung Hana0503a52023-08-23 13:12:50 +09004367 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hane3f02812023-05-08 13:54:50 +09004368 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4369 ensureListContains(t, requireNativeLibs, "libllndk.so")
4370}
4371
Jooyung Hane1633032019-08-01 17:41:43 +09004372func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004373 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004374 apex {
4375 name: "myapex_nodep",
4376 key: "myapex.key",
4377 native_shared_libs: ["lib_nodep"],
4378 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004379 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004380 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004381 }
4382
4383 apex {
4384 name: "myapex_dep",
4385 key: "myapex.key",
4386 native_shared_libs: ["lib_dep"],
4387 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004388 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004389 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004390 }
4391
4392 apex {
4393 name: "myapex_provider",
4394 key: "myapex.key",
4395 native_shared_libs: ["libfoo"],
4396 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004397 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004398 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004399 }
4400
4401 apex {
4402 name: "myapex_selfcontained",
4403 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004404 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004405 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004406 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004407 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004408 }
4409
4410 apex_key {
4411 name: "myapex.key",
4412 public_key: "testkey.avbpubkey",
4413 private_key: "testkey.pem",
4414 }
4415
4416 cc_library {
4417 name: "lib_nodep",
4418 srcs: ["mylib.cpp"],
4419 system_shared_libs: [],
4420 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004421 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004422 }
4423
4424 cc_library {
4425 name: "lib_dep",
4426 srcs: ["mylib.cpp"],
4427 shared_libs: ["libfoo"],
4428 system_shared_libs: [],
4429 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004430 apex_available: [
4431 "myapex_dep",
4432 "myapex_provider",
4433 "myapex_selfcontained",
4434 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004435 }
4436
4437 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004438 name: "lib_dep_on_bar",
4439 srcs: ["mylib.cpp"],
4440 shared_libs: ["libbar"],
4441 system_shared_libs: [],
4442 stl: "none",
4443 apex_available: [
4444 "myapex_selfcontained",
4445 ],
4446 }
4447
4448
4449 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004450 name: "libfoo",
4451 srcs: ["mytest.cpp"],
4452 stubs: {
4453 versions: ["1"],
4454 },
4455 system_shared_libs: [],
4456 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004457 apex_available: [
4458 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004459 ],
4460 }
4461
4462 cc_library {
4463 name: "libbar",
4464 srcs: ["mytest.cpp"],
4465 stubs: {
4466 versions: ["1"],
4467 },
4468 system_shared_libs: [],
4469 stl: "none",
4470 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004471 "myapex_selfcontained",
4472 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004473 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004474
Jooyung Hane1633032019-08-01 17:41:43 +09004475 `)
4476
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004477 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004478 var provideNativeLibs, requireNativeLibs []string
4479
Jooyung Hana0503a52023-08-23 13:12:50 +09004480 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004481 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4482 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004483 ensureListEmpty(t, provideNativeLibs)
4484 ensureListEmpty(t, requireNativeLibs)
4485
Jooyung Hana0503a52023-08-23 13:12:50 +09004486 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004487 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4488 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004489 ensureListEmpty(t, provideNativeLibs)
4490 ensureListContains(t, requireNativeLibs, "libfoo.so")
4491
Jooyung Hana0503a52023-08-23 13:12:50 +09004492 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004493 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4494 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004495 ensureListContains(t, provideNativeLibs, "libfoo.so")
4496 ensureListEmpty(t, requireNativeLibs)
4497
Jooyung Hana0503a52023-08-23 13:12:50 +09004498 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004499 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4500 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004501 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004502 ensureListEmpty(t, requireNativeLibs)
4503}
4504
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004505func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4506 ctx := testApex(t, `
4507 apex {
4508 name: "myapex",
4509 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004510 native_shared_libs: ["mylib"],
4511 updatable: false,
4512 }
4513
4514 apex_key {
4515 name: "myapex.key",
4516 public_key: "testkey.avbpubkey",
4517 private_key: "testkey.pem",
4518 }
4519
4520 cc_library {
4521 name: "mylib",
4522 srcs: ["mylib.cpp"],
4523 system_shared_libs: [],
4524 stl: "none",
4525 apex_available: [
4526 "//apex_available:platform",
4527 "myapex",
4528 ],
4529 }
4530 `, android.FixtureMergeEnv(map[string]string{
4531 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4532 }))
4533
Jooyung Hana0503a52023-08-23 13:12:50 +09004534 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004535 apexManifestRule := module.Rule("apexManifestRule")
4536 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4537}
4538
Vinh Tran8f5310f2022-10-07 18:16:47 -04004539func TestCompileMultilibProp(t *testing.T) {
4540 testCases := []struct {
4541 compileMultiLibProp string
4542 containedLibs []string
4543 notContainedLibs []string
4544 }{
4545 {
4546 containedLibs: []string{
4547 "image.apex/lib64/mylib.so",
4548 "image.apex/lib/mylib.so",
4549 },
4550 compileMultiLibProp: `compile_multilib: "both",`,
4551 },
4552 {
4553 containedLibs: []string{"image.apex/lib64/mylib.so"},
4554 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4555 compileMultiLibProp: `compile_multilib: "first",`,
4556 },
4557 {
4558 containedLibs: []string{"image.apex/lib64/mylib.so"},
4559 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4560 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4561 },
4562 {
4563 containedLibs: []string{"image.apex/lib64/mylib.so"},
4564 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4565 compileMultiLibProp: `compile_multilib: "64",`,
4566 },
4567 {
4568 containedLibs: []string{"image.apex/lib/mylib.so"},
4569 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4570 compileMultiLibProp: `compile_multilib: "32",`,
4571 },
4572 }
4573 for _, testCase := range testCases {
4574 ctx := testApex(t, fmt.Sprintf(`
4575 apex {
4576 name: "myapex",
4577 key: "myapex.key",
4578 %s
4579 native_shared_libs: ["mylib"],
4580 updatable: false,
4581 }
4582 apex_key {
4583 name: "myapex.key",
4584 public_key: "testkey.avbpubkey",
4585 private_key: "testkey.pem",
4586 }
4587 cc_library {
4588 name: "mylib",
4589 srcs: ["mylib.cpp"],
4590 apex_available: [
4591 "//apex_available:platform",
4592 "myapex",
4593 ],
4594 }
4595 `, testCase.compileMultiLibProp),
4596 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004597 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004598 apexRule := module.Rule("apexRule")
4599 copyCmds := apexRule.Args["copy_commands"]
4600 for _, containedLib := range testCase.containedLibs {
4601 ensureContains(t, copyCmds, containedLib)
4602 }
4603 for _, notContainedLib := range testCase.notContainedLibs {
4604 ensureNotContains(t, copyCmds, notContainedLib)
4605 }
4606 }
4607}
4608
Alex Light0851b882019-02-07 13:20:53 -08004609func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004610 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004611 apex {
4612 name: "myapex",
4613 key: "myapex.key",
4614 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004615 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004616 }
4617
4618 apex_key {
4619 name: "myapex.key",
4620 public_key: "testkey.avbpubkey",
4621 private_key: "testkey.pem",
4622 }
4623
4624 cc_library {
4625 name: "mylib_common",
4626 srcs: ["mylib.cpp"],
4627 system_shared_libs: [],
4628 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004629 apex_available: [
4630 "//apex_available:platform",
4631 "myapex",
4632 ],
Alex Light0851b882019-02-07 13:20:53 -08004633 }
4634 `)
4635
Jooyung Hana0503a52023-08-23 13:12:50 +09004636 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004637 apexRule := module.Rule("apexRule")
4638 copyCmds := apexRule.Args["copy_commands"]
4639
4640 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4641 t.Log("Apex was a test apex!")
4642 t.Fail()
4643 }
4644 // Ensure that main rule creates an output
4645 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4646
4647 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004648 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004649
4650 // Ensure that both direct and indirect deps are copied into apex
4651 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4652
Colin Cross7113d202019-11-20 16:39:12 -08004653 // Ensure that the platform variant ends with _shared
4654 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004655
Colin Cross56a83212020-09-15 18:30:11 -07004656 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004657 t.Log("Found mylib_common not in any apex!")
4658 t.Fail()
4659 }
4660}
4661
4662func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004663 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004664 apex_test {
4665 name: "myapex",
4666 key: "myapex.key",
4667 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004668 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004669 }
4670
4671 apex_key {
4672 name: "myapex.key",
4673 public_key: "testkey.avbpubkey",
4674 private_key: "testkey.pem",
4675 }
4676
4677 cc_library {
4678 name: "mylib_common_test",
4679 srcs: ["mylib.cpp"],
4680 system_shared_libs: [],
4681 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004682 // TODO: remove //apex_available:platform
4683 apex_available: [
4684 "//apex_available:platform",
4685 "myapex",
4686 ],
Alex Light0851b882019-02-07 13:20:53 -08004687 }
4688 `)
4689
Jooyung Hana0503a52023-08-23 13:12:50 +09004690 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004691 apexRule := module.Rule("apexRule")
4692 copyCmds := apexRule.Args["copy_commands"]
4693
4694 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4695 t.Log("Apex was not a test apex!")
4696 t.Fail()
4697 }
4698 // Ensure that main rule creates an output
4699 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4700
4701 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004702 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004703
4704 // Ensure that both direct and indirect deps are copied into apex
4705 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4706
Colin Cross7113d202019-11-20 16:39:12 -08004707 // Ensure that the platform variant ends with _shared
4708 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004709}
4710
Alex Light9670d332019-01-29 18:07:33 -08004711func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004712 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004713 apex {
4714 name: "myapex",
4715 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004716 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004717 multilib: {
4718 first: {
4719 native_shared_libs: ["mylib_common"],
4720 }
4721 },
4722 target: {
4723 android: {
4724 multilib: {
4725 first: {
4726 native_shared_libs: ["mylib"],
4727 }
4728 }
4729 },
4730 host: {
4731 multilib: {
4732 first: {
4733 native_shared_libs: ["mylib2"],
4734 }
4735 }
4736 }
4737 }
4738 }
4739
4740 apex_key {
4741 name: "myapex.key",
4742 public_key: "testkey.avbpubkey",
4743 private_key: "testkey.pem",
4744 }
4745
4746 cc_library {
4747 name: "mylib",
4748 srcs: ["mylib.cpp"],
4749 system_shared_libs: [],
4750 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004751 // TODO: remove //apex_available:platform
4752 apex_available: [
4753 "//apex_available:platform",
4754 "myapex",
4755 ],
Alex Light9670d332019-01-29 18:07:33 -08004756 }
4757
4758 cc_library {
4759 name: "mylib_common",
4760 srcs: ["mylib.cpp"],
4761 system_shared_libs: [],
4762 stl: "none",
4763 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004764 // TODO: remove //apex_available:platform
4765 apex_available: [
4766 "//apex_available:platform",
4767 "myapex",
4768 ],
Alex Light9670d332019-01-29 18:07:33 -08004769 }
4770
4771 cc_library {
4772 name: "mylib2",
4773 srcs: ["mylib.cpp"],
4774 system_shared_libs: [],
4775 stl: "none",
4776 compile_multilib: "first",
4777 }
4778 `)
4779
Jooyung Hana0503a52023-08-23 13:12:50 +09004780 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004781 copyCmds := apexRule.Args["copy_commands"]
4782
4783 // Ensure that main rule creates an output
4784 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4785
4786 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004787 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4788 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4789 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004790
4791 // Ensure that both direct and indirect deps are copied into apex
4792 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4793 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4794 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4795
Colin Cross7113d202019-11-20 16:39:12 -08004796 // Ensure that the platform variant ends with _shared
4797 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4798 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4799 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004800}
Jiyong Park04480cf2019-02-06 00:16:29 +09004801
Jiyong Park59140302020-12-14 18:44:04 +09004802func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004803 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004804 apex {
4805 name: "myapex",
4806 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004807 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004808 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004809 arch: {
4810 arm64: {
4811 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004812 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004813 },
4814 x86_64: {
4815 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004816 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004817 },
4818 }
4819 }
4820
4821 apex_key {
4822 name: "myapex.key",
4823 public_key: "testkey.avbpubkey",
4824 private_key: "testkey.pem",
4825 }
4826
4827 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004828 name: "mylib.generic",
4829 srcs: ["mylib.cpp"],
4830 system_shared_libs: [],
4831 stl: "none",
4832 // TODO: remove //apex_available:platform
4833 apex_available: [
4834 "//apex_available:platform",
4835 "myapex",
4836 ],
4837 }
4838
4839 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004840 name: "mylib.arm64",
4841 srcs: ["mylib.cpp"],
4842 system_shared_libs: [],
4843 stl: "none",
4844 // TODO: remove //apex_available:platform
4845 apex_available: [
4846 "//apex_available:platform",
4847 "myapex",
4848 ],
4849 }
4850
4851 cc_library {
4852 name: "mylib.x64",
4853 srcs: ["mylib.cpp"],
4854 system_shared_libs: [],
4855 stl: "none",
4856 // TODO: remove //apex_available:platform
4857 apex_available: [
4858 "//apex_available:platform",
4859 "myapex",
4860 ],
4861 }
4862 `)
4863
Jooyung Hana0503a52023-08-23 13:12:50 +09004864 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004865 copyCmds := apexRule.Args["copy_commands"]
4866
4867 // Ensure that apex variant is created for the direct dep
4868 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004869 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004870 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4871
4872 // Ensure that both direct and indirect deps are copied into apex
4873 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4874 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4875}
4876
Jiyong Park04480cf2019-02-06 00:16:29 +09004877func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004878 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004879 apex {
4880 name: "myapex",
4881 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004882 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004883 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004884 }
4885
4886 apex_key {
4887 name: "myapex.key",
4888 public_key: "testkey.avbpubkey",
4889 private_key: "testkey.pem",
4890 }
4891
4892 sh_binary {
4893 name: "myscript",
4894 src: "mylib.cpp",
4895 filename: "myscript.sh",
4896 sub_dir: "script",
4897 }
4898 `)
4899
Jooyung Hana0503a52023-08-23 13:12:50 +09004900 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004901 copyCmds := apexRule.Args["copy_commands"]
4902
4903 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4904}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004905
Jooyung Han91df2082019-11-20 01:49:42 +09004906func TestApexInVariousPartition(t *testing.T) {
4907 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004908 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004909 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004910 {"", "system"},
4911 {"product_specific: true", "product"},
4912 {"soc_specific: true", "vendor"},
4913 {"proprietary: true", "vendor"},
4914 {"vendor: true", "vendor"},
4915 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004916 }
4917 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004918 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004919 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004920 apex {
4921 name: "myapex",
4922 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004923 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004924 `+tc.propName+`
4925 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004926
Jooyung Han91df2082019-11-20 01:49:42 +09004927 apex_key {
4928 name: "myapex.key",
4929 public_key: "testkey.avbpubkey",
4930 private_key: "testkey.pem",
4931 }
4932 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004933
Jooyung Hana0503a52023-08-23 13:12:50 +09004934 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004935 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004936 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004937 if actual != expected {
4938 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4939 }
Jooyung Han91df2082019-11-20 01:49:42 +09004940 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004941 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004942}
Jiyong Park67882562019-03-21 01:11:21 +09004943
Jooyung Han580eb4f2020-06-24 19:33:06 +09004944func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004945 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004946 apex {
4947 name: "myapex",
4948 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004949 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004950 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004951
Jooyung Han580eb4f2020-06-24 19:33:06 +09004952 apex_key {
4953 name: "myapex.key",
4954 public_key: "testkey.avbpubkey",
4955 private_key: "testkey.pem",
4956 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004957 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004958 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004959 rule := module.Output("file_contexts")
4960 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4961}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004962
Jooyung Han580eb4f2020-06-24 19:33:06 +09004963func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004964 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004965 apex {
4966 name: "myapex",
4967 key: "myapex.key",
4968 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004969 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004970 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004971
Jooyung Han580eb4f2020-06-24 19:33:06 +09004972 apex_key {
4973 name: "myapex.key",
4974 public_key: "testkey.avbpubkey",
4975 private_key: "testkey.pem",
4976 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004977 `, withFiles(map[string][]byte{
4978 "my_own_file_contexts": nil,
4979 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004980}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004981
Jooyung Han580eb4f2020-06-24 19:33:06 +09004982func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004983 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004984 apex {
4985 name: "myapex",
4986 key: "myapex.key",
4987 product_specific: true,
4988 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004989 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004990 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004991
Jooyung Han580eb4f2020-06-24 19:33:06 +09004992 apex_key {
4993 name: "myapex.key",
4994 public_key: "testkey.avbpubkey",
4995 private_key: "testkey.pem",
4996 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004997 `)
4998
Colin Cross1c460562021-02-16 17:55:47 -08004999 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005000 apex {
5001 name: "myapex",
5002 key: "myapex.key",
5003 product_specific: true,
5004 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005005 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005006 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005007
Jooyung Han580eb4f2020-06-24 19:33:06 +09005008 apex_key {
5009 name: "myapex.key",
5010 public_key: "testkey.avbpubkey",
5011 private_key: "testkey.pem",
5012 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005013 `, withFiles(map[string][]byte{
5014 "product_specific_file_contexts": nil,
5015 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005016 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005017 rule := module.Output("file_contexts")
5018 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5019}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005020
Jooyung Han580eb4f2020-06-24 19:33:06 +09005021func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005022 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005023 apex {
5024 name: "myapex",
5025 key: "myapex.key",
5026 product_specific: true,
5027 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005028 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005029 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005030
Jooyung Han580eb4f2020-06-24 19:33:06 +09005031 apex_key {
5032 name: "myapex.key",
5033 public_key: "testkey.avbpubkey",
5034 private_key: "testkey.pem",
5035 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005036
Jooyung Han580eb4f2020-06-24 19:33:06 +09005037 filegroup {
5038 name: "my-file-contexts",
5039 srcs: ["product_specific_file_contexts"],
5040 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005041 `, withFiles(map[string][]byte{
5042 "product_specific_file_contexts": nil,
5043 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005044 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005045 rule := module.Output("file_contexts")
5046 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005047}
5048
Jiyong Park67882562019-03-21 01:11:21 +09005049func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005050 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005051 apex_key {
5052 name: "myapex.key",
5053 public_key: ":my.avbpubkey",
5054 private_key: ":my.pem",
5055 product_specific: true,
5056 }
5057
5058 filegroup {
5059 name: "my.avbpubkey",
5060 srcs: ["testkey2.avbpubkey"],
5061 }
5062
5063 filegroup {
5064 name: "my.pem",
5065 srcs: ["testkey2.pem"],
5066 }
5067 `)
5068
5069 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5070 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005071 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005072 if actual_pubkey != expected_pubkey {
5073 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5074 }
5075 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005076 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005077 if actual_privkey != expected_privkey {
5078 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5079 }
5080}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005081
5082func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005083 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005084 prebuilt_apex {
5085 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005086 arch: {
5087 arm64: {
5088 src: "myapex-arm64.apex",
5089 },
5090 arm: {
5091 src: "myapex-arm.apex",
5092 },
5093 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005094 }
5095 `)
5096
Wei Li340ee8e2022-03-18 17:33:24 -07005097 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5098 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005099
Jiyong Parkc95714e2019-03-29 14:23:10 +09005100 expectedInput := "myapex-arm64.apex"
5101 if prebuilt.inputApex.String() != expectedInput {
5102 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5103 }
Wei Li340ee8e2022-03-18 17:33:24 -07005104 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5105 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5106 rule := testingModule.Rule("genProvenanceMetaData")
5107 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5108 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5109 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5110 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005111
5112 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5113 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005114}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005115
Paul Duffinc0609c62021-03-01 17:27:16 +00005116func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005117 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005118 prebuilt_apex {
5119 name: "myapex",
5120 }
5121 `)
5122}
5123
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005124func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005125 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005126 prebuilt_apex {
5127 name: "myapex",
5128 src: "myapex-arm.apex",
5129 filename: "notmyapex.apex",
5130 }
5131 `)
5132
Wei Li340ee8e2022-03-18 17:33:24 -07005133 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5134 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005135
5136 expected := "notmyapex.apex"
5137 if p.installFilename != expected {
5138 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5139 }
Wei Li340ee8e2022-03-18 17:33:24 -07005140 rule := testingModule.Rule("genProvenanceMetaData")
5141 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5142 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5143 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5144 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005145}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005146
Samiul Islam7c02e262021-09-08 17:48:28 +01005147func TestApexSetFilenameOverride(t *testing.T) {
5148 testApex(t, `
5149 apex_set {
5150 name: "com.company.android.myapex",
5151 apex_name: "com.android.myapex",
5152 set: "company-myapex.apks",
5153 filename: "com.company.android.myapex.apex"
5154 }
5155 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5156
5157 testApex(t, `
5158 apex_set {
5159 name: "com.company.android.myapex",
5160 apex_name: "com.android.myapex",
5161 set: "company-myapex.apks",
5162 filename: "com.company.android.myapex.capex"
5163 }
5164 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5165
5166 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5167 apex_set {
5168 name: "com.company.android.myapex",
5169 apex_name: "com.android.myapex",
5170 set: "company-myapex.apks",
5171 filename: "some-random-suffix"
5172 }
5173 `)
5174}
5175
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005176func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005177 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005178 prebuilt_apex {
5179 name: "myapex.prebuilt",
5180 src: "myapex-arm.apex",
5181 overrides: [
5182 "myapex",
5183 ],
5184 }
5185 `)
5186
Wei Li340ee8e2022-03-18 17:33:24 -07005187 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5188 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005189
5190 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005191 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005192 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005193 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005194 }
Wei Li340ee8e2022-03-18 17:33:24 -07005195 rule := testingModule.Rule("genProvenanceMetaData")
5196 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5197 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5198 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5199 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005200}
5201
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005202func TestPrebuiltApexName(t *testing.T) {
5203 testApex(t, `
5204 prebuilt_apex {
5205 name: "com.company.android.myapex",
5206 apex_name: "com.android.myapex",
5207 src: "company-myapex-arm.apex",
5208 }
5209 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5210
5211 testApex(t, `
5212 apex_set {
5213 name: "com.company.android.myapex",
5214 apex_name: "com.android.myapex",
5215 set: "company-myapex.apks",
5216 }
5217 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5218}
5219
5220func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5221 _ = android.GroupFixturePreparers(
5222 java.PrepareForTestWithJavaDefaultModules,
5223 PrepareForTestWithApexBuildComponents,
5224 android.FixtureWithRootAndroidBp(`
5225 platform_bootclasspath {
5226 name: "platform-bootclasspath",
5227 fragments: [
5228 {
5229 apex: "com.android.art",
5230 module: "art-bootclasspath-fragment",
5231 },
5232 ],
5233 }
5234
5235 prebuilt_apex {
5236 name: "com.company.android.art",
5237 apex_name: "com.android.art",
5238 src: "com.company.android.art-arm.apex",
5239 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5240 }
5241
5242 prebuilt_bootclasspath_fragment {
5243 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005244 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005245 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005246 hidden_api: {
5247 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5248 metadata: "my-bootclasspath-fragment/metadata.csv",
5249 index: "my-bootclasspath-fragment/index.csv",
5250 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5251 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5252 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005253 }
5254
5255 java_import {
5256 name: "core-oj",
5257 jars: ["prebuilt.jar"],
5258 }
5259 `),
5260 ).RunTest(t)
5261}
5262
Paul Duffin092153d2021-01-26 11:42:39 +00005263// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5264// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005265func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005266 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005267
Paul Duffin89886cb2021-02-05 16:44:03 +00005268 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005269 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005270 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005271 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005272 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005273 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005274 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5275 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5276 android.NormalizePathForTesting(dexJarBuildPath))
5277 }
5278
5279 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005280 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005281 // Make sure the import has been given the correct path to the dex jar.
5282 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5283 dexJarBuildPath := p.DexJarInstallPath()
5284 stem := android.RemoveOptionalPrebuiltPrefix(name)
5285 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5286 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5287 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005288 }
5289
Paul Duffin39853512021-02-26 11:09:39 +00005290 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005291 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005292 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005293 android.AssertArrayString(t, "Check if there is no source variant",
5294 []string{"android_common"},
5295 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005296 }
5297
5298 t.Run("prebuilt only", func(t *testing.T) {
5299 bp := `
5300 prebuilt_apex {
5301 name: "myapex",
5302 arch: {
5303 arm64: {
5304 src: "myapex-arm64.apex",
5305 },
5306 arm: {
5307 src: "myapex-arm.apex",
5308 },
5309 },
Paul Duffin39853512021-02-26 11:09:39 +00005310 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005311 }
5312
5313 java_import {
5314 name: "libfoo",
5315 jars: ["libfoo.jar"],
5316 }
Paul Duffin39853512021-02-26 11:09:39 +00005317
5318 java_sdk_library_import {
5319 name: "libbar",
5320 public: {
5321 jars: ["libbar.jar"],
5322 },
5323 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005324 `
5325
5326 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5327 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5328
Martin Stjernholm44825602021-09-17 01:44:12 +01005329 deapexerName := deapexerModuleName("myapex")
5330 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5331
Paul Duffinf6932af2021-02-26 18:21:56 +00005332 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005333 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005334 rule := deapexer.Rule("deapexer")
5335 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5336 t.Errorf("expected: %q, found: %q", expected, actual)
5337 }
5338
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005339 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005340 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005341 rule = prebuiltApex.Rule("android/soong/android.Cp")
5342 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5343 t.Errorf("expected: %q, found: %q", expected, actual)
5344 }
5345
Paul Duffin89886cb2021-02-05 16:44:03 +00005346 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005347 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005348
5349 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005350 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005351 })
5352
5353 t.Run("prebuilt with source preferred", func(t *testing.T) {
5354
5355 bp := `
5356 prebuilt_apex {
5357 name: "myapex",
5358 arch: {
5359 arm64: {
5360 src: "myapex-arm64.apex",
5361 },
5362 arm: {
5363 src: "myapex-arm.apex",
5364 },
5365 },
Paul Duffin39853512021-02-26 11:09:39 +00005366 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005367 }
5368
5369 java_import {
5370 name: "libfoo",
5371 jars: ["libfoo.jar"],
5372 }
5373
5374 java_library {
5375 name: "libfoo",
5376 }
Paul Duffin39853512021-02-26 11:09:39 +00005377
5378 java_sdk_library_import {
5379 name: "libbar",
5380 public: {
5381 jars: ["libbar.jar"],
5382 },
5383 }
5384
5385 java_sdk_library {
5386 name: "libbar",
5387 srcs: ["foo/bar/MyClass.java"],
5388 unsafe_ignore_missing_latest_api: true,
5389 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005390 `
5391
5392 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5393 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5394
Paul Duffin89886cb2021-02-05 16:44:03 +00005395 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005396 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005397 ensureNoSourceVariant(t, ctx, "libfoo")
5398
5399 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005400 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005401 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005402 })
5403
5404 t.Run("prebuilt preferred with source", func(t *testing.T) {
5405 bp := `
5406 prebuilt_apex {
5407 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005408 arch: {
5409 arm64: {
5410 src: "myapex-arm64.apex",
5411 },
5412 arm: {
5413 src: "myapex-arm.apex",
5414 },
5415 },
Paul Duffin39853512021-02-26 11:09:39 +00005416 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005417 }
5418
5419 java_import {
5420 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005421 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005422 jars: ["libfoo.jar"],
5423 }
5424
5425 java_library {
5426 name: "libfoo",
5427 }
Paul Duffin39853512021-02-26 11:09:39 +00005428
5429 java_sdk_library_import {
5430 name: "libbar",
5431 prefer: true,
5432 public: {
5433 jars: ["libbar.jar"],
5434 },
5435 }
5436
5437 java_sdk_library {
5438 name: "libbar",
5439 srcs: ["foo/bar/MyClass.java"],
5440 unsafe_ignore_missing_latest_api: true,
5441 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005442 `
5443
5444 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5445 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5446
Paul Duffin89886cb2021-02-05 16:44:03 +00005447 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005448 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005449 ensureNoSourceVariant(t, ctx, "libfoo")
5450
5451 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005452 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005453 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005454 })
5455}
5456
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005457func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005458 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005459 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005460 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5461 // is disabled.
5462 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5463 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005464
Paul Duffin37856732021-02-26 14:24:15 +00005465 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5466 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005467 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005468 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005469 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005470 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005471 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005472 foundLibfooJar = true
5473 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005474 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005475 }
5476 }
5477 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005478 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 +00005479 }
5480 }
5481
Paul Duffin40a3f652021-07-19 13:11:24 +01005482 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005483 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005484 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005485 var rule android.TestingBuildParams
5486
5487 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5488 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005489 }
5490
Paul Duffin40a3f652021-07-19 13:11:24 +01005491 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5492 t.Helper()
5493 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5494 var rule android.TestingBuildParams
5495
5496 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5497 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5498 }
5499
Paul Duffin89f570a2021-06-16 01:42:33 +01005500 fragment := java.ApexVariantReference{
5501 Apex: proptools.StringPtr("myapex"),
5502 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5503 }
5504
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005505 t.Run("prebuilt only", func(t *testing.T) {
5506 bp := `
5507 prebuilt_apex {
5508 name: "myapex",
5509 arch: {
5510 arm64: {
5511 src: "myapex-arm64.apex",
5512 },
5513 arm: {
5514 src: "myapex-arm.apex",
5515 },
5516 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005517 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5518 }
5519
5520 prebuilt_bootclasspath_fragment {
5521 name: "my-bootclasspath-fragment",
5522 contents: ["libfoo", "libbar"],
5523 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005524 hidden_api: {
5525 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5526 metadata: "my-bootclasspath-fragment/metadata.csv",
5527 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005528 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5529 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5530 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005531 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005532 }
5533
5534 java_import {
5535 name: "libfoo",
5536 jars: ["libfoo.jar"],
5537 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005538 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005539 }
Paul Duffin37856732021-02-26 14:24:15 +00005540
5541 java_sdk_library_import {
5542 name: "libbar",
5543 public: {
5544 jars: ["libbar.jar"],
5545 },
5546 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005547 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005548 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005549 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005550 `
5551
Paul Duffin89f570a2021-06-16 01:42:33 +01005552 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005553 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5554 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005555
Paul Duffin537ea3d2021-05-14 10:38:00 +01005556 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005557 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005558 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005559 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005560 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005561 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 +01005562 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005563 })
5564
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005565 t.Run("apex_set only", func(t *testing.T) {
5566 bp := `
5567 apex_set {
5568 name: "myapex",
5569 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005570 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005571 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005572 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5573 }
5574
5575 java_import {
5576 name: "myjavalib",
5577 jars: ["myjavalib.jar"],
5578 apex_available: ["myapex"],
5579 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005580 }
5581
5582 prebuilt_bootclasspath_fragment {
5583 name: "my-bootclasspath-fragment",
5584 contents: ["libfoo", "libbar"],
5585 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005586 hidden_api: {
5587 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5588 metadata: "my-bootclasspath-fragment/metadata.csv",
5589 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005590 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5591 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5592 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005593 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005594 }
5595
Liz Kammer2dc72442023-04-20 10:10:48 -04005596 prebuilt_systemserverclasspath_fragment {
5597 name: "my-systemserverclasspath-fragment",
5598 contents: ["libbaz"],
5599 apex_available: ["myapex"],
5600 }
5601
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005602 java_import {
5603 name: "libfoo",
5604 jars: ["libfoo.jar"],
5605 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005606 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005607 }
5608
5609 java_sdk_library_import {
5610 name: "libbar",
5611 public: {
5612 jars: ["libbar.jar"],
5613 },
5614 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005615 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005616 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005617 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005618
5619 java_sdk_library_import {
5620 name: "libbaz",
5621 public: {
5622 jars: ["libbaz.jar"],
5623 },
5624 apex_available: ["myapex"],
5625 shared_library: false,
5626 permitted_packages: ["baz"],
5627 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005628 `
5629
Paul Duffin89f570a2021-06-16 01:42:33 +01005630 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005631 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5632 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5633
Paul Duffin537ea3d2021-05-14 10:38:00 +01005634 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005635 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005636 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005637 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005638 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005639 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 +01005640 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005641
5642 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5643
5644 overrideNames := []string{
5645 "",
5646 "myjavalib.myapex",
5647 "libfoo.myapex",
5648 "libbar.myapex",
5649 "libbaz.myapex",
5650 }
5651 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5652 for i, e := range mkEntries {
5653 g := e.OverrideName
5654 if w := overrideNames[i]; w != g {
5655 t.Errorf("Expected override name %q, got %q", w, g)
5656 }
5657 }
5658
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005659 })
5660
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005661 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5662 bp := `
5663 prebuilt_apex {
5664 name: "myapex",
5665 arch: {
5666 arm64: {
5667 src: "myapex-arm64.apex",
5668 },
5669 arm: {
5670 src: "myapex-arm.apex",
5671 },
5672 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005673 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5674 }
5675
5676 prebuilt_bootclasspath_fragment {
5677 name: "my-bootclasspath-fragment",
5678 contents: ["libfoo", "libbar"],
5679 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005680 hidden_api: {
5681 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5682 metadata: "my-bootclasspath-fragment/metadata.csv",
5683 index: "my-bootclasspath-fragment/index.csv",
5684 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5685 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5686 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005687 }
5688
5689 java_import {
5690 name: "libfoo",
5691 jars: ["libfoo.jar"],
5692 apex_available: ["myapex"],
5693 }
5694
5695 java_library {
5696 name: "libfoo",
5697 srcs: ["foo/bar/MyClass.java"],
5698 apex_available: ["myapex"],
5699 }
Paul Duffin37856732021-02-26 14:24:15 +00005700
5701 java_sdk_library_import {
5702 name: "libbar",
5703 public: {
5704 jars: ["libbar.jar"],
5705 },
5706 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005707 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005708 }
5709
5710 java_sdk_library {
5711 name: "libbar",
5712 srcs: ["foo/bar/MyClass.java"],
5713 unsafe_ignore_missing_latest_api: true,
5714 apex_available: ["myapex"],
5715 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005716 `
5717
5718 // In this test the source (java_library) libfoo is active since the
5719 // prebuilt (java_import) defaults to prefer:false. However the
5720 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5721 // find the dex boot jar in it. We either need to disable the source libfoo
5722 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005723 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005724 // dexbootjar check is skipped if AllowMissingDependencies is true
5725 preparerAllowMissingDeps := android.GroupFixturePreparers(
5726 preparer,
5727 android.PrepareForTestWithAllowMissingDependencies,
5728 )
5729 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005730 })
5731
5732 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5733 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005734 apex {
5735 name: "myapex",
5736 key: "myapex.key",
5737 updatable: false,
5738 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5739 }
5740
5741 apex_key {
5742 name: "myapex.key",
5743 public_key: "testkey.avbpubkey",
5744 private_key: "testkey.pem",
5745 }
5746
5747 bootclasspath_fragment {
5748 name: "my-bootclasspath-fragment",
5749 contents: ["libfoo", "libbar"],
5750 apex_available: ["myapex"],
5751 hidden_api: {
5752 split_packages: ["*"],
5753 },
5754 }
5755
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005756 prebuilt_apex {
5757 name: "myapex",
5758 arch: {
5759 arm64: {
5760 src: "myapex-arm64.apex",
5761 },
5762 arm: {
5763 src: "myapex-arm.apex",
5764 },
5765 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005766 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5767 }
5768
5769 prebuilt_bootclasspath_fragment {
5770 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005771 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005772 contents: ["libfoo", "libbar"],
5773 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005774 hidden_api: {
5775 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5776 metadata: "my-bootclasspath-fragment/metadata.csv",
5777 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005778 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5779 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5780 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005781 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005782 }
5783
5784 java_import {
5785 name: "libfoo",
5786 prefer: true,
5787 jars: ["libfoo.jar"],
5788 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005789 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005790 }
5791
5792 java_library {
5793 name: "libfoo",
5794 srcs: ["foo/bar/MyClass.java"],
5795 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005796 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005797 }
Paul Duffin37856732021-02-26 14:24:15 +00005798
5799 java_sdk_library_import {
5800 name: "libbar",
5801 prefer: true,
5802 public: {
5803 jars: ["libbar.jar"],
5804 },
5805 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005806 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005807 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005808 }
5809
5810 java_sdk_library {
5811 name: "libbar",
5812 srcs: ["foo/bar/MyClass.java"],
5813 unsafe_ignore_missing_latest_api: true,
5814 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005815 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005816 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005817 `
5818
Paul Duffin89f570a2021-06-16 01:42:33 +01005819 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005820 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5821 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005822
Paul Duffin537ea3d2021-05-14 10:38:00 +01005823 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005824 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005825 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005826 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005827 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005828 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 +01005829 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005830 })
5831
5832 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5833 bp := `
5834 apex {
5835 name: "myapex",
5836 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005837 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005838 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005839 }
5840
5841 apex_key {
5842 name: "myapex.key",
5843 public_key: "testkey.avbpubkey",
5844 private_key: "testkey.pem",
5845 }
5846
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005847 bootclasspath_fragment {
5848 name: "my-bootclasspath-fragment",
5849 contents: ["libfoo", "libbar"],
5850 apex_available: ["myapex"],
5851 hidden_api: {
5852 split_packages: ["*"],
5853 },
5854 }
5855
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005856 prebuilt_apex {
5857 name: "myapex",
5858 arch: {
5859 arm64: {
5860 src: "myapex-arm64.apex",
5861 },
5862 arm: {
5863 src: "myapex-arm.apex",
5864 },
5865 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005866 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5867 }
5868
5869 prebuilt_bootclasspath_fragment {
5870 name: "my-bootclasspath-fragment",
5871 contents: ["libfoo", "libbar"],
5872 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005873 hidden_api: {
5874 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5875 metadata: "my-bootclasspath-fragment/metadata.csv",
5876 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005877 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5878 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5879 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005880 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005881 }
5882
5883 java_import {
5884 name: "libfoo",
5885 jars: ["libfoo.jar"],
5886 apex_available: ["myapex"],
5887 }
5888
5889 java_library {
5890 name: "libfoo",
5891 srcs: ["foo/bar/MyClass.java"],
5892 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005893 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005894 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005895 }
Paul Duffin37856732021-02-26 14:24:15 +00005896
5897 java_sdk_library_import {
5898 name: "libbar",
5899 public: {
5900 jars: ["libbar.jar"],
5901 },
5902 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005903 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005904 }
5905
5906 java_sdk_library {
5907 name: "libbar",
5908 srcs: ["foo/bar/MyClass.java"],
5909 unsafe_ignore_missing_latest_api: true,
5910 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005911 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005912 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005913 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005914 `
5915
Paul Duffin89f570a2021-06-16 01:42:33 +01005916 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005917 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
5918 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005919
Paul Duffin537ea3d2021-05-14 10:38:00 +01005920 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005921 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005922 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5923 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005924 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5925 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 +01005926 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005927 })
5928
5929 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5930 bp := `
5931 apex {
5932 name: "myapex",
5933 enabled: false,
5934 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005935 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005936 }
5937
5938 apex_key {
5939 name: "myapex.key",
5940 public_key: "testkey.avbpubkey",
5941 private_key: "testkey.pem",
5942 }
5943
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005944 bootclasspath_fragment {
5945 name: "my-bootclasspath-fragment",
5946 enabled: false,
5947 contents: ["libfoo", "libbar"],
5948 apex_available: ["myapex"],
5949 hidden_api: {
5950 split_packages: ["*"],
5951 },
5952 }
5953
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005954 prebuilt_apex {
5955 name: "myapex",
5956 arch: {
5957 arm64: {
5958 src: "myapex-arm64.apex",
5959 },
5960 arm: {
5961 src: "myapex-arm.apex",
5962 },
5963 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005964 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5965 }
5966
5967 prebuilt_bootclasspath_fragment {
5968 name: "my-bootclasspath-fragment",
5969 contents: ["libfoo", "libbar"],
5970 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005971 hidden_api: {
5972 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5973 metadata: "my-bootclasspath-fragment/metadata.csv",
5974 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005975 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5976 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5977 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005978 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005979 }
5980
5981 java_import {
5982 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005983 jars: ["libfoo.jar"],
5984 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005985 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005986 }
5987
5988 java_library {
5989 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005990 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005991 srcs: ["foo/bar/MyClass.java"],
5992 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005993 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005994 }
Paul Duffin37856732021-02-26 14:24:15 +00005995
5996 java_sdk_library_import {
5997 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005998 public: {
5999 jars: ["libbar.jar"],
6000 },
6001 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006002 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01006003 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00006004 }
6005
6006 java_sdk_library {
6007 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006008 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00006009 srcs: ["foo/bar/MyClass.java"],
6010 unsafe_ignore_missing_latest_api: true,
6011 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006012 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006013 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006014 `
6015
Paul Duffin89f570a2021-06-16 01:42:33 +01006016 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01006017 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6018 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006019
Paul Duffin537ea3d2021-05-14 10:38:00 +01006020 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006021 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006022 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006023 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006024 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006025 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 +01006026 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006027 })
6028}
6029
Roland Levillain630846d2019-06-26 12:48:34 +01006030func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006031 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006032 apex_test {
6033 name: "myapex",
6034 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006035 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006036 tests: [
6037 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006038 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006039 ],
6040 }
6041
6042 apex_key {
6043 name: "myapex.key",
6044 public_key: "testkey.avbpubkey",
6045 private_key: "testkey.pem",
6046 }
6047
Liz Kammer1c14a212020-05-12 15:26:55 -07006048 filegroup {
6049 name: "fg",
6050 srcs: [
6051 "baz",
6052 "bar/baz"
6053 ],
6054 }
6055
Roland Levillain630846d2019-06-26 12:48:34 +01006056 cc_test {
6057 name: "mytest",
6058 gtest: false,
6059 srcs: ["mytest.cpp"],
6060 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006061 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006062 system_shared_libs: [],
6063 static_executable: true,
6064 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006065 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006066 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006067
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006068 cc_library {
6069 name: "mylib",
6070 srcs: ["mylib.cpp"],
6071 system_shared_libs: [],
6072 stl: "none",
6073 }
6074
Liz Kammer5bd365f2020-05-27 15:15:11 -07006075 filegroup {
6076 name: "fg2",
6077 srcs: [
6078 "testdata/baz"
6079 ],
6080 }
6081
Roland Levillain9b5fde92019-06-28 15:41:19 +01006082 cc_test {
6083 name: "mytests",
6084 gtest: false,
6085 srcs: [
6086 "mytest1.cpp",
6087 "mytest2.cpp",
6088 "mytest3.cpp",
6089 ],
6090 test_per_src: true,
6091 relative_install_path: "test",
6092 system_shared_libs: [],
6093 static_executable: true,
6094 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006095 data: [
6096 ":fg",
6097 ":fg2",
6098 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006099 }
Roland Levillain630846d2019-06-26 12:48:34 +01006100 `)
6101
Jooyung Hana0503a52023-08-23 13:12:50 +09006102 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006103 copyCmds := apexRule.Args["copy_commands"]
6104
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006105 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006106 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006107 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006108
Liz Kammer1c14a212020-05-12 15:26:55 -07006109 //Ensure that test data are copied into apex.
6110 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6111 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6112
Roland Levillain9b5fde92019-06-28 15:41:19 +01006113 // Ensure that test deps built with `test_per_src` are copied into apex.
6114 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6115 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6116 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006117
6118 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006119 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006120 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006121 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006122 prefix := "TARGET_"
6123 var builder strings.Builder
6124 data.Custom(&builder, name, prefix, "", data)
6125 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006126 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6127 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6128 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6129 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006130 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006131}
6132
Jooyung Hand48f3c32019-08-23 11:18:57 +09006133func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6134 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6135 apex {
6136 name: "myapex",
6137 key: "myapex.key",
6138 native_shared_libs: ["libfoo"],
6139 }
6140
6141 apex_key {
6142 name: "myapex.key",
6143 public_key: "testkey.avbpubkey",
6144 private_key: "testkey.pem",
6145 }
6146
6147 cc_library {
6148 name: "libfoo",
6149 stl: "none",
6150 system_shared_libs: [],
6151 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006152 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006153 }
6154 `)
6155 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6156 apex {
6157 name: "myapex",
6158 key: "myapex.key",
6159 java_libs: ["myjar"],
6160 }
6161
6162 apex_key {
6163 name: "myapex.key",
6164 public_key: "testkey.avbpubkey",
6165 private_key: "testkey.pem",
6166 }
6167
6168 java_library {
6169 name: "myjar",
6170 srcs: ["foo/bar/MyClass.java"],
6171 sdk_version: "none",
6172 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006173 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006174 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006175 }
6176 `)
6177}
6178
Bill Peckhama41a6962021-01-11 10:58:54 -08006179func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006180 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006181 apex {
6182 name: "myapex",
6183 key: "myapex.key",
6184 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006185 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006186 }
6187
6188 apex_key {
6189 name: "myapex.key",
6190 public_key: "testkey.avbpubkey",
6191 private_key: "testkey.pem",
6192 }
6193
6194 java_import {
6195 name: "myjavaimport",
6196 apex_available: ["myapex"],
6197 jars: ["my.jar"],
6198 compile_dex: true,
6199 }
6200 `)
6201
Jooyung Hana0503a52023-08-23 13:12:50 +09006202 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006203 apexRule := module.Rule("apexRule")
6204 copyCmds := apexRule.Args["copy_commands"]
6205 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6206}
6207
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006208func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006209 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006210 apex {
6211 name: "myapex",
6212 key: "myapex.key",
6213 apps: [
6214 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006215 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006216 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006217 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006218 }
6219
6220 apex_key {
6221 name: "myapex.key",
6222 public_key: "testkey.avbpubkey",
6223 private_key: "testkey.pem",
6224 }
6225
6226 android_app {
6227 name: "AppFoo",
6228 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006229 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006230 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006231 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006232 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006233 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006234 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006235
6236 android_app {
6237 name: "AppFooPriv",
6238 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006239 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006240 system_modules: "none",
6241 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006242 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006243 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006244 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006245 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006246
6247 cc_library_shared {
6248 name: "libjni",
6249 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006250 shared_libs: ["libfoo"],
6251 stl: "none",
6252 system_shared_libs: [],
6253 apex_available: [ "myapex" ],
6254 sdk_version: "current",
6255 }
6256
6257 cc_library_shared {
6258 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006259 stl: "none",
6260 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006261 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006262 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006263 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006264 `)
6265
Jooyung Hana0503a52023-08-23 13:12:50 +09006266 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006267 apexRule := module.Rule("apexRule")
6268 copyCmds := apexRule.Args["copy_commands"]
6269
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006270 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6271 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006272 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006273
Colin Crossaede88c2020-08-11 12:17:01 -07006274 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006275 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006276 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006277 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006278 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006279 // JNI libraries including transitive deps are
6280 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006281 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006282 // ... embedded inside APK (jnilibs.zip)
6283 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6284 // ... and not directly inside the APEX
6285 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6286 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006287
6288 apexBundle := module.Module().(*apexBundle)
6289 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6290 var builder strings.Builder
6291 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6292 androidMk := builder.String()
6293 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6294 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6295 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6296 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6297 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6298 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 +01006299}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006300
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006301func TestApexWithAppImportBuildId(t *testing.T) {
6302 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6303 for _, id := range invalidBuildIds {
6304 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6305 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6306 variables.BuildId = proptools.StringPtr(id)
6307 })
6308 testApexError(t, message, `apex {
6309 name: "myapex",
6310 key: "myapex.key",
6311 apps: ["AppFooPrebuilt"],
6312 updatable: false,
6313 }
6314
6315 apex_key {
6316 name: "myapex.key",
6317 public_key: "testkey.avbpubkey",
6318 private_key: "testkey.pem",
6319 }
6320
6321 android_app_import {
6322 name: "AppFooPrebuilt",
6323 apk: "PrebuiltAppFoo.apk",
6324 presigned: true,
6325 apex_available: ["myapex"],
6326 }
6327 `, fixture)
6328 }
6329}
6330
Dario Frenicde2a032019-10-27 00:29:22 +01006331func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006332 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006333 apex {
6334 name: "myapex",
6335 key: "myapex.key",
6336 apps: [
6337 "AppFooPrebuilt",
6338 "AppFooPrivPrebuilt",
6339 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006340 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006341 }
6342
6343 apex_key {
6344 name: "myapex.key",
6345 public_key: "testkey.avbpubkey",
6346 private_key: "testkey.pem",
6347 }
6348
6349 android_app_import {
6350 name: "AppFooPrebuilt",
6351 apk: "PrebuiltAppFoo.apk",
6352 presigned: true,
6353 dex_preopt: {
6354 enabled: false,
6355 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006356 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006357 }
6358
6359 android_app_import {
6360 name: "AppFooPrivPrebuilt",
6361 apk: "PrebuiltAppFooPriv.apk",
6362 privileged: true,
6363 presigned: true,
6364 dex_preopt: {
6365 enabled: false,
6366 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006367 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006368 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006369 }
6370 `)
6371
Jooyung Hana0503a52023-08-23 13:12:50 +09006372 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006373 apexRule := module.Rule("apexRule")
6374 copyCmds := apexRule.Args["copy_commands"]
6375
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006376 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6377 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006378}
6379
6380func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006381 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006382 apex {
6383 name: "myapex",
6384 key: "myapex.key",
6385 apps: [
6386 "AppFoo",
6387 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006388 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006389 }
6390
6391 apex_key {
6392 name: "myapex.key",
6393 public_key: "testkey.avbpubkey",
6394 private_key: "testkey.pem",
6395 }
6396
6397 android_app {
6398 name: "AppFoo",
6399 srcs: ["foo/bar/MyClass.java"],
6400 sdk_version: "none",
6401 system_modules: "none",
6402 apex_available: [ "myapex" ],
6403 }
6404
6405 android_app_import {
6406 name: "AppFoo",
6407 apk: "AppFooPrebuilt.apk",
6408 filename: "AppFooPrebuilt.apk",
6409 presigned: true,
6410 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006411 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006412 }
6413 `, withFiles(map[string][]byte{
6414 "AppFooPrebuilt.apk": nil,
6415 }))
6416
Jooyung Hana0503a52023-08-23 13:12:50 +09006417 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006418 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006419 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006420}
6421
Dario Freni6f3937c2019-12-20 22:58:03 +00006422func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006423 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006424 apex {
6425 name: "myapex",
6426 key: "myapex.key",
6427 apps: [
6428 "TesterHelpAppFoo",
6429 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006430 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006431 }
6432
6433 apex_key {
6434 name: "myapex.key",
6435 public_key: "testkey.avbpubkey",
6436 private_key: "testkey.pem",
6437 }
6438
6439 android_test_helper_app {
6440 name: "TesterHelpAppFoo",
6441 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006442 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006443 }
6444
6445 `)
6446
Jooyung Hana0503a52023-08-23 13:12:50 +09006447 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006448 apexRule := module.Rule("apexRule")
6449 copyCmds := apexRule.Args["copy_commands"]
6450
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006451 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006452}
6453
Jooyung Han18020ea2019-11-13 10:50:48 +09006454func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6455 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006456 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006457 apex {
6458 name: "myapex",
6459 key: "myapex.key",
6460 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006461 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006462 }
6463
6464 apex_key {
6465 name: "myapex.key",
6466 public_key: "testkey.avbpubkey",
6467 private_key: "testkey.pem",
6468 }
6469
6470 apex {
6471 name: "otherapex",
6472 key: "myapex.key",
6473 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006474 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006475 }
6476
6477 cc_defaults {
6478 name: "libfoo-defaults",
6479 apex_available: ["otherapex"],
6480 }
6481
6482 cc_library {
6483 name: "libfoo",
6484 defaults: ["libfoo-defaults"],
6485 stl: "none",
6486 system_shared_libs: [],
6487 }`)
6488}
6489
Paul Duffine52e66f2020-03-30 17:54:29 +01006490func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006491 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006492 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006493 apex {
6494 name: "myapex",
6495 key: "myapex.key",
6496 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006497 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006498 }
6499
6500 apex_key {
6501 name: "myapex.key",
6502 public_key: "testkey.avbpubkey",
6503 private_key: "testkey.pem",
6504 }
6505
6506 apex {
6507 name: "otherapex",
6508 key: "otherapex.key",
6509 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006510 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006511 }
6512
6513 apex_key {
6514 name: "otherapex.key",
6515 public_key: "testkey.avbpubkey",
6516 private_key: "testkey.pem",
6517 }
6518
6519 cc_library {
6520 name: "libfoo",
6521 stl: "none",
6522 system_shared_libs: [],
6523 apex_available: ["otherapex"],
6524 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006525}
Jiyong Park127b40b2019-09-30 16:04:35 +09006526
Paul Duffine52e66f2020-03-30 17:54:29 +01006527func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006528 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006529 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006530.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006531.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006532.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006533.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006534.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006535.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006536 apex {
6537 name: "myapex",
6538 key: "myapex.key",
6539 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006540 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006541 }
6542
6543 apex_key {
6544 name: "myapex.key",
6545 public_key: "testkey.avbpubkey",
6546 private_key: "testkey.pem",
6547 }
6548
Jiyong Park127b40b2019-09-30 16:04:35 +09006549 cc_library {
6550 name: "libfoo",
6551 stl: "none",
6552 shared_libs: ["libbar"],
6553 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006554 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006555 }
6556
6557 cc_library {
6558 name: "libbar",
6559 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006560 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006561 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006562 apex_available: ["myapex"],
6563 }
6564
6565 cc_library {
6566 name: "libbaz",
6567 stl: "none",
6568 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006569 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006570}
Jiyong Park127b40b2019-09-30 16:04:35 +09006571
Liz Kammer5f108fa2023-05-11 14:33:17 -04006572func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6573 testApex(t, `
6574 apex {
6575 name: "myapex",
6576 key: "myapex.key",
6577 native_shared_libs: ["libfoo"],
6578 updatable: false,
6579 }
6580
6581 apex_key {
6582 name: "myapex.key",
6583 public_key: "testkey.avbpubkey",
6584 private_key: "testkey.pem",
6585 }
6586
6587 cc_library {
6588 name: "libfoo",
6589 stl: "none",
6590 static_libs: ["libbar"],
6591 system_shared_libs: [],
6592 apex_available: ["myapex"],
6593 }
6594
6595 cc_library {
6596 name: "libbar",
6597 stl: "none",
6598 shared_libs: ["libbaz"],
6599 system_shared_libs: [],
6600 apex_available: ["myapex"],
6601 }
6602
6603 cc_library {
6604 name: "libbaz",
6605 stl: "none",
6606 system_shared_libs: [],
6607 }`)
6608
6609 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6610 apex {
6611 name: "myapex",
6612 key: "myapex.key",
6613 native_shared_libs: ["libfoo"],
6614 updatable: false,
6615 }
6616
6617 apex_key {
6618 name: "myapex.key",
6619 public_key: "testkey.avbpubkey",
6620 private_key: "testkey.pem",
6621 }
6622
6623 cc_library {
6624 name: "libfoo",
6625 stl: "none",
6626 static_libs: ["libbar"],
6627 system_shared_libs: [],
6628 apex_available: ["myapex"],
6629 }
6630
6631 cc_library {
6632 name: "libbar",
6633 stl: "none",
6634 system_shared_libs: [],
6635 }`)
6636}
6637
Paul Duffine52e66f2020-03-30 17:54:29 +01006638func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006639 testApexError(t, "\"otherapex\" is not a valid module name", `
6640 apex {
6641 name: "myapex",
6642 key: "myapex.key",
6643 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006644 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006645 }
6646
6647 apex_key {
6648 name: "myapex.key",
6649 public_key: "testkey.avbpubkey",
6650 private_key: "testkey.pem",
6651 }
6652
6653 cc_library {
6654 name: "libfoo",
6655 stl: "none",
6656 system_shared_libs: [],
6657 apex_available: ["otherapex"],
6658 }`)
6659
Paul Duffine52e66f2020-03-30 17:54:29 +01006660 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006661 apex {
6662 name: "myapex",
6663 key: "myapex.key",
6664 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006665 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006666 }
6667
6668 apex_key {
6669 name: "myapex.key",
6670 public_key: "testkey.avbpubkey",
6671 private_key: "testkey.pem",
6672 }
6673
6674 cc_library {
6675 name: "libfoo",
6676 stl: "none",
6677 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006678 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006679 apex_available: ["myapex"],
6680 }
6681
6682 cc_library {
6683 name: "libbar",
6684 stl: "none",
6685 system_shared_libs: [],
6686 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006687 }
6688
6689 cc_library {
6690 name: "libbaz",
6691 stl: "none",
6692 system_shared_libs: [],
6693 stubs: {
6694 versions: ["10", "20", "30"],
6695 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006696 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006697}
Jiyong Park127b40b2019-09-30 16:04:35 +09006698
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006699func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6700 t.Run("negative variant_version produces error", func(t *testing.T) {
6701 testApexError(t, "expected an integer between 0-9; got -1", `
6702 apex {
6703 name: "myapex",
6704 key: "myapex.key",
6705 apex_available_name: "com.android.foo",
6706 variant_version: "-1",
6707 updatable: false,
6708 }
6709 apex_key {
6710 name: "myapex.key",
6711 public_key: "testkey.avbpubkey",
6712 private_key: "testkey.pem",
6713 }
6714 `)
6715 })
6716
6717 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6718 testApexError(t, "expected an integer between 0-9; got 10", `
6719 apex {
6720 name: "myapex",
6721 key: "myapex.key",
6722 apex_available_name: "com.android.foo",
6723 variant_version: "10",
6724 updatable: false,
6725 }
6726 apex_key {
6727 name: "myapex.key",
6728 public_key: "testkey.avbpubkey",
6729 private_key: "testkey.pem",
6730 }
6731 `)
6732 })
6733}
6734
6735func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6736 context := android.GroupFixturePreparers(
6737 android.PrepareForIntegrationTestWithAndroid,
6738 PrepareForTestWithApexBuildComponents,
6739 android.FixtureMergeMockFs(android.MockFS{
6740 "system/sepolicy/apex/foo-file_contexts": nil,
6741 "system/sepolicy/apex/bar-file_contexts": nil,
6742 }),
6743 )
6744 result := context.RunTestWithBp(t, `
6745 apex {
6746 name: "foo",
6747 key: "myapex.key",
6748 apex_available_name: "com.android.foo",
6749 variant_version: "0",
6750 updatable: false,
6751 }
6752 apex {
6753 name: "bar",
6754 key: "myapex.key",
6755 apex_available_name: "com.android.foo",
6756 variant_version: "3",
6757 updatable: false,
6758 }
6759 apex_key {
6760 name: "myapex.key",
6761 public_key: "testkey.avbpubkey",
6762 private_key: "testkey.pem",
6763 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006764 override_apex {
6765 name: "myoverrideapex",
6766 base: "bar",
6767 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006768 `)
6769
Jooyung Hana0503a52023-08-23 13:12:50 +09006770 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006771 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6772 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6773 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6774 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6775 }
6776
Jooyung Hana0503a52023-08-23 13:12:50 +09006777 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006778 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6779 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6780 barActualDefaultVersion := barManifestRule.Args["default_version"]
6781 if barActualDefaultVersion != barExpectedDefaultVersion {
6782 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6783 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006784
Jooyung Hana0503a52023-08-23 13:12:50 +09006785 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006786 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6787 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6788 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6789 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006790}
6791
Sam Delmericoca816532023-06-02 14:09:50 -04006792func TestApexAvailable_ApexAvailableName(t *testing.T) {
6793 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6794 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6795 apex {
6796 name: "myapex_sminus",
6797 key: "myapex.key",
6798 apps: ["AppFoo"],
6799 apex_available_name: "myapex",
6800 updatable: false,
6801 }
6802 apex {
6803 name: "myapex",
6804 key: "myapex.key",
6805 apps: ["AppFoo"],
6806 updatable: false,
6807 }
6808 apex_key {
6809 name: "myapex.key",
6810 public_key: "testkey.avbpubkey",
6811 private_key: "testkey.pem",
6812 }
6813 android_app {
6814 name: "AppFoo",
6815 srcs: ["foo/bar/MyClass.java"],
6816 sdk_version: "none",
6817 system_modules: "none",
6818 apex_available: [ "myapex_sminus" ],
6819 }`,
6820 android.FixtureMergeMockFs(android.MockFS{
6821 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6822 }),
6823 )
6824 })
6825
6826 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6827 testApex(t, `
6828 apex {
6829 name: "myapex_sminus",
6830 key: "myapex.key",
6831 apps: ["AppFoo"],
6832 apex_available_name: "myapex",
6833 updatable: false,
6834 }
6835 apex {
6836 name: "myapex",
6837 key: "myapex.key",
6838 apps: ["AppFoo"],
6839 updatable: false,
6840 }
6841 apex_key {
6842 name: "myapex.key",
6843 public_key: "testkey.avbpubkey",
6844 private_key: "testkey.pem",
6845 }
6846 android_app {
6847 name: "AppFoo",
6848 srcs: ["foo/bar/MyClass.java"],
6849 sdk_version: "none",
6850 system_modules: "none",
6851 apex_available: [ "myapex" ],
6852 }`,
6853 android.FixtureMergeMockFs(android.MockFS{
6854 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6855 }),
6856 )
6857 })
6858
6859 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6860 testApex(t, `
6861 override_apex {
6862 name: "myoverrideapex_sminus",
6863 base: "myapex_sminus",
6864 key: "myapex.key",
6865 apps: ["AppFooOverride"],
6866 }
6867 override_apex {
6868 name: "myoverrideapex",
6869 base: "myapex",
6870 key: "myapex.key",
6871 apps: ["AppFooOverride"],
6872 }
6873 apex {
6874 name: "myapex_sminus",
6875 key: "myapex.key",
6876 apps: ["AppFoo"],
6877 apex_available_name: "myapex",
6878 updatable: false,
6879 }
6880 apex {
6881 name: "myapex",
6882 key: "myapex.key",
6883 apps: ["AppFoo"],
6884 updatable: false,
6885 }
6886 apex_key {
6887 name: "myapex.key",
6888 public_key: "testkey.avbpubkey",
6889 private_key: "testkey.pem",
6890 }
6891 android_app {
6892 name: "AppFooOverride",
6893 srcs: ["foo/bar/MyClass.java"],
6894 sdk_version: "none",
6895 system_modules: "none",
6896 apex_available: [ "myapex" ],
6897 }
6898 android_app {
6899 name: "AppFoo",
6900 srcs: ["foo/bar/MyClass.java"],
6901 sdk_version: "none",
6902 system_modules: "none",
6903 apex_available: [ "myapex" ],
6904 }`,
6905 android.FixtureMergeMockFs(android.MockFS{
6906 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6907 }),
6908 )
6909 })
6910}
6911
6912func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6913 context := android.GroupFixturePreparers(
6914 android.PrepareForIntegrationTestWithAndroid,
6915 PrepareForTestWithApexBuildComponents,
6916 java.PrepareForTestWithDexpreopt,
6917 android.FixtureMergeMockFs(android.MockFS{
6918 "system/sepolicy/apex/myapex-file_contexts": nil,
6919 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6920 }),
6921 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6922 variables.BuildId = proptools.StringPtr("buildid")
6923 }),
6924 )
6925 context.RunTestWithBp(t, `
6926 override_apex {
6927 name: "myoverrideapex_sminus",
6928 base: "myapex_sminus",
6929 }
6930 override_apex {
6931 name: "myoverrideapex",
6932 base: "myapex",
6933 }
6934 apex {
6935 name: "myapex",
6936 key: "myapex.key",
6937 apps: ["AppFoo"],
6938 updatable: false,
6939 }
6940 apex {
6941 name: "myapex_sminus",
6942 apex_available_name: "myapex",
6943 key: "myapex.key",
6944 apps: ["AppFoo_sminus"],
6945 updatable: false,
6946 }
6947 apex_key {
6948 name: "myapex.key",
6949 public_key: "testkey.avbpubkey",
6950 private_key: "testkey.pem",
6951 }
6952 android_app {
6953 name: "AppFoo",
6954 srcs: ["foo/bar/MyClass.java"],
6955 sdk_version: "none",
6956 system_modules: "none",
6957 apex_available: [ "myapex" ],
6958 }
6959 android_app {
6960 name: "AppFoo_sminus",
6961 srcs: ["foo/bar/MyClass.java"],
6962 sdk_version: "none",
6963 min_sdk_version: "29",
6964 system_modules: "none",
6965 apex_available: [ "myapex" ],
6966 }`)
6967}
6968
Jiyong Park89e850a2020-04-07 16:37:39 +09006969func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006970 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006971 apex {
6972 name: "myapex",
6973 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006974 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006975 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006976 }
6977
6978 apex_key {
6979 name: "myapex.key",
6980 public_key: "testkey.avbpubkey",
6981 private_key: "testkey.pem",
6982 }
6983
6984 cc_library {
6985 name: "libfoo",
6986 stl: "none",
6987 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006988 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006989 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006990 }
6991
6992 cc_library {
6993 name: "libfoo2",
6994 stl: "none",
6995 system_shared_libs: [],
6996 shared_libs: ["libbaz"],
6997 apex_available: ["//apex_available:platform"],
6998 }
6999
7000 cc_library {
7001 name: "libbar",
7002 stl: "none",
7003 system_shared_libs: [],
7004 apex_available: ["myapex"],
7005 }
7006
7007 cc_library {
7008 name: "libbaz",
7009 stl: "none",
7010 system_shared_libs: [],
7011 apex_available: ["myapex"],
7012 stubs: {
7013 versions: ["1"],
7014 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007015 }`)
7016
Jiyong Park89e850a2020-04-07 16:37:39 +09007017 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7018 // because it depends on libbar which isn't available to platform
7019 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7020 if libfoo.NotAvailableForPlatform() != true {
7021 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7022 }
7023
7024 // libfoo2 however can be available to platform because it depends on libbaz which provides
7025 // stubs
7026 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7027 if libfoo2.NotAvailableForPlatform() == true {
7028 t.Errorf("%q should be available to platform", libfoo2.String())
7029 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007030}
Jiyong Parka90ca002019-10-07 15:47:24 +09007031
Paul Duffine52e66f2020-03-30 17:54:29 +01007032func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007033 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007034 apex {
7035 name: "myapex",
7036 key: "myapex.key",
7037 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007038 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007039 }
7040
7041 apex_key {
7042 name: "myapex.key",
7043 public_key: "testkey.avbpubkey",
7044 private_key: "testkey.pem",
7045 }
7046
7047 cc_library {
7048 name: "libfoo",
7049 stl: "none",
7050 system_shared_libs: [],
7051 apex_available: ["myapex"],
7052 static: {
7053 apex_available: ["//apex_available:platform"],
7054 },
7055 }`)
7056
Jiyong Park89e850a2020-04-07 16:37:39 +09007057 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7058 if libfooShared.NotAvailableForPlatform() != true {
7059 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7060 }
7061 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7062 if libfooStatic.NotAvailableForPlatform() != false {
7063 t.Errorf("%q should be available to platform", libfooStatic.String())
7064 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007065}
7066
Jiyong Park5d790c32019-11-15 18:40:32 +09007067func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007068 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007069 apex {
7070 name: "myapex",
7071 key: "myapex.key",
7072 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007073 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007074 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007075 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007076 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007077 }
7078
7079 override_apex {
7080 name: "override_myapex",
7081 base: "myapex",
7082 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007083 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007084 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007085 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007086 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007087 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007088 key: "mynewapex.key",
7089 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007090 }
7091
7092 apex_key {
7093 name: "myapex.key",
7094 public_key: "testkey.avbpubkey",
7095 private_key: "testkey.pem",
7096 }
7097
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007098 apex_key {
7099 name: "mynewapex.key",
7100 public_key: "testkey2.avbpubkey",
7101 private_key: "testkey2.pem",
7102 }
7103
7104 android_app_certificate {
7105 name: "myapex.certificate",
7106 certificate: "testkey",
7107 }
7108
Jiyong Park5d790c32019-11-15 18:40:32 +09007109 android_app {
7110 name: "app",
7111 srcs: ["foo/bar/MyClass.java"],
7112 package_name: "foo",
7113 sdk_version: "none",
7114 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007115 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007116 }
7117
7118 override_android_app {
7119 name: "override_app",
7120 base: "app",
7121 package_name: "bar",
7122 }
markchien7c803b82021-08-26 22:10:06 +08007123
7124 bpf {
7125 name: "bpf",
7126 srcs: ["bpf.c"],
7127 }
7128
7129 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007130 name: "overrideBpf",
7131 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007132 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007133
7134 prebuilt_etc {
7135 name: "myetc",
7136 src: "myprebuilt",
7137 }
7138
7139 prebuilt_etc {
7140 name: "override_myetc",
7141 src: "override_myprebuilt",
7142 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007143 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007144
Jooyung Hana0503a52023-08-23 13:12:50 +09007145 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
7146 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007147 if originalVariant.GetOverriddenBy() != "" {
7148 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7149 }
7150 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7151 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7152 }
7153
Jooyung Hana0503a52023-08-23 13:12:50 +09007154 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007155 apexRule := module.Rule("apexRule")
7156 copyCmds := apexRule.Args["copy_commands"]
7157
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007158 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7159 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007160
markchien7c803b82021-08-26 22:10:06 +08007161 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007162 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007163
Daniel Norman5a3ce132021-08-26 15:44:43 -07007164 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7165 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7166
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007167 apexBundle := module.Module().(*apexBundle)
7168 name := apexBundle.Name()
7169 if name != "override_myapex" {
7170 t.Errorf("name should be \"override_myapex\", but was %q", name)
7171 }
7172
Baligh Uddin004d7172020-02-19 21:29:28 -08007173 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7174 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7175 }
7176
Jiyong Park20bacab2020-03-03 11:45:41 +09007177 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007178 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007179 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7180
7181 signApkRule := module.Rule("signapk")
7182 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007183
Colin Crossaa255532020-07-03 13:18:24 -07007184 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007185 var builder strings.Builder
7186 data.Custom(&builder, name, "TARGET_", "", data)
7187 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007188 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7189 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007190 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007191 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007192 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007193 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007194 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007195 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007196}
7197
Albert Martineefabcf2022-03-21 20:11:16 +00007198func TestMinSdkVersionOverride(t *testing.T) {
7199 // Override from 29 to 31
7200 minSdkOverride31 := "31"
7201 ctx := testApex(t, `
7202 apex {
7203 name: "myapex",
7204 key: "myapex.key",
7205 native_shared_libs: ["mylib"],
7206 updatable: true,
7207 min_sdk_version: "29"
7208 }
7209
7210 override_apex {
7211 name: "override_myapex",
7212 base: "myapex",
7213 logging_parent: "com.foo.bar",
7214 package_name: "test.overridden.package"
7215 }
7216
7217 apex_key {
7218 name: "myapex.key",
7219 public_key: "testkey.avbpubkey",
7220 private_key: "testkey.pem",
7221 }
7222
7223 cc_library {
7224 name: "mylib",
7225 srcs: ["mylib.cpp"],
7226 runtime_libs: ["libbar"],
7227 system_shared_libs: [],
7228 stl: "none",
7229 apex_available: [ "myapex" ],
7230 min_sdk_version: "apex_inherit"
7231 }
7232
7233 cc_library {
7234 name: "libbar",
7235 srcs: ["mylib.cpp"],
7236 system_shared_libs: [],
7237 stl: "none",
7238 apex_available: [ "myapex" ],
7239 min_sdk_version: "apex_inherit"
7240 }
7241
7242 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7243
Jooyung Hana0503a52023-08-23 13:12:50 +09007244 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007245 copyCmds := apexRule.Args["copy_commands"]
7246
7247 // Ensure that direct non-stubs dep is always included
7248 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7249
7250 // Ensure that runtime_libs dep in included
7251 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7252
7253 // Ensure libraries target overridden min_sdk_version value
7254 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7255}
7256
7257func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7258 // Attempt to override from 31 to 29, should be a NOOP
7259 minSdkOverride29 := "29"
7260 ctx := testApex(t, `
7261 apex {
7262 name: "myapex",
7263 key: "myapex.key",
7264 native_shared_libs: ["mylib"],
7265 updatable: true,
7266 min_sdk_version: "31"
7267 }
7268
7269 override_apex {
7270 name: "override_myapex",
7271 base: "myapex",
7272 logging_parent: "com.foo.bar",
7273 package_name: "test.overridden.package"
7274 }
7275
7276 apex_key {
7277 name: "myapex.key",
7278 public_key: "testkey.avbpubkey",
7279 private_key: "testkey.pem",
7280 }
7281
7282 cc_library {
7283 name: "mylib",
7284 srcs: ["mylib.cpp"],
7285 runtime_libs: ["libbar"],
7286 system_shared_libs: [],
7287 stl: "none",
7288 apex_available: [ "myapex" ],
7289 min_sdk_version: "apex_inherit"
7290 }
7291
7292 cc_library {
7293 name: "libbar",
7294 srcs: ["mylib.cpp"],
7295 system_shared_libs: [],
7296 stl: "none",
7297 apex_available: [ "myapex" ],
7298 min_sdk_version: "apex_inherit"
7299 }
7300
7301 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7302
Jooyung Hana0503a52023-08-23 13:12:50 +09007303 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007304 copyCmds := apexRule.Args["copy_commands"]
7305
7306 // Ensure that direct non-stubs dep is always included
7307 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7308
7309 // Ensure that runtime_libs dep in included
7310 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7311
7312 // Ensure libraries target the original min_sdk_version value rather than the overridden
7313 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7314}
7315
Jooyung Han214bf372019-11-12 13:03:50 +09007316func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007317 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007318 apex {
7319 name: "myapex",
7320 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007321 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007322 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007323 }
7324
7325 apex_key {
7326 name: "myapex.key",
7327 public_key: "testkey.avbpubkey",
7328 private_key: "testkey.pem",
7329 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007330
7331 cc_library {
7332 name: "mylib",
7333 srcs: ["mylib.cpp"],
7334 stl: "libc++",
7335 system_shared_libs: [],
7336 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007337 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007338 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007339 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007340
Jooyung Hana0503a52023-08-23 13:12:50 +09007341 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007342 args := module.Rule("apexRule").Args
7343 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007344 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007345
7346 // The copies of the libraries in the apex should have one more dependency than
7347 // the ones outside the apex, namely the unwinder. Ideally we should check
7348 // the dependency names directly here but for some reason the names are blank in
7349 // this test.
7350 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007351 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007352 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7353 if len(apexImplicits) != len(nonApexImplicits)+1 {
7354 t.Errorf("%q missing unwinder dep", lib)
7355 }
7356 }
Jooyung Han214bf372019-11-12 13:03:50 +09007357}
7358
Paul Duffine05480a2021-03-08 15:07:14 +00007359var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007360 "api/current.txt": nil,
7361 "api/removed.txt": nil,
7362 "api/system-current.txt": nil,
7363 "api/system-removed.txt": nil,
7364 "api/test-current.txt": nil,
7365 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007366
Anton Hanssondff2c782020-12-21 17:10:01 +00007367 "100/public/api/foo.txt": nil,
7368 "100/public/api/foo-removed.txt": nil,
7369 "100/system/api/foo.txt": nil,
7370 "100/system/api/foo-removed.txt": nil,
7371
Paul Duffineedc5d52020-06-12 17:46:39 +01007372 // For java_sdk_library_import
7373 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007374}
7375
Jooyung Han58f26ab2019-12-18 15:34:32 +09007376func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007377 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007378 apex {
7379 name: "myapex",
7380 key: "myapex.key",
7381 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007382 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007383 }
7384
7385 apex_key {
7386 name: "myapex.key",
7387 public_key: "testkey.avbpubkey",
7388 private_key: "testkey.pem",
7389 }
7390
7391 java_sdk_library {
7392 name: "foo",
7393 srcs: ["a.java"],
7394 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007395 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007396 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007397
7398 prebuilt_apis {
7399 name: "sdk",
7400 api_dirs: ["100"],
7401 }
Paul Duffin9b879592020-05-26 13:21:35 +01007402 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007403
7404 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007405 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007406 "javalib/foo.jar",
7407 "etc/permissions/foo.xml",
7408 })
7409 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007410 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007411 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 +09007412}
7413
Paul Duffin9b879592020-05-26 13:21:35 +01007414func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007415 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007416 apex {
7417 name: "myapex",
7418 key: "myapex.key",
7419 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007420 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007421 }
7422
7423 apex_key {
7424 name: "myapex.key",
7425 public_key: "testkey.avbpubkey",
7426 private_key: "testkey.pem",
7427 }
7428
7429 java_sdk_library {
7430 name: "foo",
7431 srcs: ["a.java"],
7432 api_packages: ["foo"],
7433 apex_available: ["myapex"],
7434 sdk_version: "none",
7435 system_modules: "none",
7436 }
7437
7438 java_library {
7439 name: "bar",
7440 srcs: ["a.java"],
7441 libs: ["foo"],
7442 apex_available: ["myapex"],
7443 sdk_version: "none",
7444 system_modules: "none",
7445 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007446
7447 prebuilt_apis {
7448 name: "sdk",
7449 api_dirs: ["100"],
7450 }
Paul Duffin9b879592020-05-26 13:21:35 +01007451 `, withFiles(filesForSdkLibrary))
7452
7453 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007454 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007455 "javalib/bar.jar",
7456 "javalib/foo.jar",
7457 "etc/permissions/foo.xml",
7458 })
7459
7460 // The bar library should depend on the implementation jar.
7461 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007462 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007463 t.Errorf("expected %q, found %#q", expected, actual)
7464 }
7465}
7466
7467func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007468 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007469 apex {
7470 name: "myapex",
7471 key: "myapex.key",
7472 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007473 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007474 }
7475
7476 apex_key {
7477 name: "myapex.key",
7478 public_key: "testkey.avbpubkey",
7479 private_key: "testkey.pem",
7480 }
7481
7482 java_sdk_library {
7483 name: "foo",
7484 srcs: ["a.java"],
7485 api_packages: ["foo"],
7486 apex_available: ["myapex"],
7487 sdk_version: "none",
7488 system_modules: "none",
7489 }
7490
7491 java_library {
7492 name: "bar",
7493 srcs: ["a.java"],
7494 libs: ["foo"],
7495 sdk_version: "none",
7496 system_modules: "none",
7497 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007498
7499 prebuilt_apis {
7500 name: "sdk",
7501 api_dirs: ["100"],
7502 }
Paul Duffin9b879592020-05-26 13:21:35 +01007503 `, withFiles(filesForSdkLibrary))
7504
7505 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007506 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007507 "javalib/foo.jar",
7508 "etc/permissions/foo.xml",
7509 })
7510
7511 // The bar library should depend on the stubs jar.
7512 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007513 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007514 t.Errorf("expected %q, found %#q", expected, actual)
7515 }
7516}
7517
Paul Duffineedc5d52020-06-12 17:46:39 +01007518func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007519 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007520 prebuilt_apis {
7521 name: "sdk",
7522 api_dirs: ["100"],
7523 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007524 withFiles(map[string][]byte{
7525 "apex/a.java": nil,
7526 "apex/apex_manifest.json": nil,
7527 "apex/Android.bp": []byte(`
7528 package {
7529 default_visibility: ["//visibility:private"],
7530 }
7531
7532 apex {
7533 name: "myapex",
7534 key: "myapex.key",
7535 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007536 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007537 }
7538
7539 apex_key {
7540 name: "myapex.key",
7541 public_key: "testkey.avbpubkey",
7542 private_key: "testkey.pem",
7543 }
7544
7545 java_library {
7546 name: "bar",
7547 srcs: ["a.java"],
7548 libs: ["foo"],
7549 apex_available: ["myapex"],
7550 sdk_version: "none",
7551 system_modules: "none",
7552 }
7553`),
7554 "source/a.java": nil,
7555 "source/api/current.txt": nil,
7556 "source/api/removed.txt": nil,
7557 "source/Android.bp": []byte(`
7558 package {
7559 default_visibility: ["//visibility:private"],
7560 }
7561
7562 java_sdk_library {
7563 name: "foo",
7564 visibility: ["//apex"],
7565 srcs: ["a.java"],
7566 api_packages: ["foo"],
7567 apex_available: ["myapex"],
7568 sdk_version: "none",
7569 system_modules: "none",
7570 public: {
7571 enabled: true,
7572 },
7573 }
7574`),
7575 "prebuilt/a.jar": nil,
7576 "prebuilt/Android.bp": []byte(`
7577 package {
7578 default_visibility: ["//visibility:private"],
7579 }
7580
7581 java_sdk_library_import {
7582 name: "foo",
7583 visibility: ["//apex", "//source"],
7584 apex_available: ["myapex"],
7585 prefer: true,
7586 public: {
7587 jars: ["a.jar"],
7588 },
7589 }
7590`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007591 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007592 )
7593
7594 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007595 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007596 "javalib/bar.jar",
7597 "javalib/foo.jar",
7598 "etc/permissions/foo.xml",
7599 })
7600
7601 // The bar library should depend on the implementation jar.
7602 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007603 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007604 t.Errorf("expected %q, found %#q", expected, actual)
7605 }
7606}
7607
7608func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7609 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7610 apex {
7611 name: "myapex",
7612 key: "myapex.key",
7613 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007614 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007615 }
7616
7617 apex_key {
7618 name: "myapex.key",
7619 public_key: "testkey.avbpubkey",
7620 private_key: "testkey.pem",
7621 }
7622
7623 java_sdk_library_import {
7624 name: "foo",
7625 apex_available: ["myapex"],
7626 prefer: true,
7627 public: {
7628 jars: ["a.jar"],
7629 },
7630 }
7631
7632 `, withFiles(filesForSdkLibrary))
7633}
7634
atrost6e126252020-01-27 17:01:16 +00007635func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007636 result := android.GroupFixturePreparers(
7637 prepareForApexTest,
7638 java.PrepareForTestWithPlatformCompatConfig,
7639 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007640 apex {
7641 name: "myapex",
7642 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007643 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007644 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007645 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007646 }
7647
7648 apex_key {
7649 name: "myapex.key",
7650 public_key: "testkey.avbpubkey",
7651 private_key: "testkey.pem",
7652 }
7653
7654 platform_compat_config {
7655 name: "myjar-platform-compat-config",
7656 src: ":myjar",
7657 }
7658
7659 java_library {
7660 name: "myjar",
7661 srcs: ["foo/bar/MyClass.java"],
7662 sdk_version: "none",
7663 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007664 apex_available: [ "myapex" ],
7665 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007666
7667 // Make sure that a preferred prebuilt does not affect the apex contents.
7668 prebuilt_platform_compat_config {
7669 name: "myjar-platform-compat-config",
7670 metadata: "compat-config/metadata.xml",
7671 prefer: true,
7672 }
atrost6e126252020-01-27 17:01:16 +00007673 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007674 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007675 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007676 "etc/compatconfig/myjar-platform-compat-config.xml",
7677 "javalib/myjar.jar",
7678 })
7679}
7680
Jooyung Han862c0d62022-12-21 10:15:37 +09007681func TestNoDupeApexFiles(t *testing.T) {
7682 android.GroupFixturePreparers(
7683 android.PrepareForTestWithAndroidBuildComponents,
7684 PrepareForTestWithApexBuildComponents,
7685 prepareForTestWithMyapex,
7686 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7687 ).
7688 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7689 RunTestWithBp(t, `
7690 apex {
7691 name: "myapex",
7692 key: "myapex.key",
7693 prebuilts: ["foo", "bar"],
7694 updatable: false,
7695 }
7696
7697 apex_key {
7698 name: "myapex.key",
7699 public_key: "testkey.avbpubkey",
7700 private_key: "testkey.pem",
7701 }
7702
7703 prebuilt_etc {
7704 name: "foo",
7705 src: "myprebuilt",
7706 filename_from_src: true,
7707 }
7708
7709 prebuilt_etc {
7710 name: "bar",
7711 src: "myprebuilt",
7712 filename_from_src: true,
7713 }
7714 `)
7715}
7716
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007717func TestApexUnwantedTransitiveDeps(t *testing.T) {
7718 bp := `
7719 apex {
7720 name: "myapex",
7721 key: "myapex.key",
7722 native_shared_libs: ["libfoo"],
7723 updatable: false,
7724 unwanted_transitive_deps: ["libbar"],
7725 }
7726
7727 apex_key {
7728 name: "myapex.key",
7729 public_key: "testkey.avbpubkey",
7730 private_key: "testkey.pem",
7731 }
7732
7733 cc_library {
7734 name: "libfoo",
7735 srcs: ["foo.cpp"],
7736 shared_libs: ["libbar"],
7737 apex_available: ["myapex"],
7738 }
7739
7740 cc_library {
7741 name: "libbar",
7742 srcs: ["bar.cpp"],
7743 apex_available: ["myapex"],
7744 }`
7745 ctx := testApex(t, bp)
7746 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7747 "*/libc++.so",
7748 "*/libfoo.so",
7749 // not libbar.so
7750 })
7751}
7752
Jiyong Park479321d2019-12-16 11:47:12 +09007753func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7754 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7755 apex {
7756 name: "myapex",
7757 key: "myapex.key",
7758 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007759 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007760 }
7761
7762 apex_key {
7763 name: "myapex.key",
7764 public_key: "testkey.avbpubkey",
7765 private_key: "testkey.pem",
7766 }
7767
7768 java_library {
7769 name: "myjar",
7770 srcs: ["foo/bar/MyClass.java"],
7771 sdk_version: "none",
7772 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007773 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007774 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007775 }
7776 `)
7777}
7778
Jiyong Park7afd1072019-12-30 16:56:33 +09007779func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007780 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007781 apex {
7782 name: "myapex",
7783 key: "myapex.key",
7784 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007785 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007786 }
7787
7788 apex_key {
7789 name: "myapex.key",
7790 public_key: "testkey.avbpubkey",
7791 private_key: "testkey.pem",
7792 }
7793
7794 cc_library {
7795 name: "mylib",
7796 srcs: ["mylib.cpp"],
7797 system_shared_libs: [],
7798 stl: "none",
7799 required: ["a", "b"],
7800 host_required: ["c", "d"],
7801 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007802 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007803 }
7804 `)
7805
Jooyung Hana0503a52023-08-23 13:12:50 +09007806 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007807 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007808 name := apexBundle.BaseModuleName()
7809 prefix := "TARGET_"
7810 var builder strings.Builder
7811 data.Custom(&builder, name, prefix, "", data)
7812 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007813 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007814 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7815 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007816}
7817
Jiyong Park7cd10e32020-01-14 09:22:18 +09007818func TestSymlinksFromApexToSystem(t *testing.T) {
7819 bp := `
7820 apex {
7821 name: "myapex",
7822 key: "myapex.key",
7823 native_shared_libs: ["mylib"],
7824 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007825 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007826 }
7827
Jiyong Park9d677202020-02-19 16:29:35 +09007828 apex {
7829 name: "myapex.updatable",
7830 key: "myapex.key",
7831 native_shared_libs: ["mylib"],
7832 java_libs: ["myjar"],
7833 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007834 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007835 }
7836
Jiyong Park7cd10e32020-01-14 09:22:18 +09007837 apex_key {
7838 name: "myapex.key",
7839 public_key: "testkey.avbpubkey",
7840 private_key: "testkey.pem",
7841 }
7842
7843 cc_library {
7844 name: "mylib",
7845 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007846 shared_libs: [
7847 "myotherlib",
7848 "myotherlib_ext",
7849 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007850 system_shared_libs: [],
7851 stl: "none",
7852 apex_available: [
7853 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007854 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007855 "//apex_available:platform",
7856 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007857 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007858 }
7859
7860 cc_library {
7861 name: "myotherlib",
7862 srcs: ["mylib.cpp"],
7863 system_shared_libs: [],
7864 stl: "none",
7865 apex_available: [
7866 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007867 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007868 "//apex_available:platform",
7869 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007870 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007871 }
7872
Jiyong Parkce243632023-02-17 18:22:25 +09007873 cc_library {
7874 name: "myotherlib_ext",
7875 srcs: ["mylib.cpp"],
7876 system_shared_libs: [],
7877 system_ext_specific: true,
7878 stl: "none",
7879 apex_available: [
7880 "myapex",
7881 "myapex.updatable",
7882 "//apex_available:platform",
7883 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007884 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007885 }
7886
Jiyong Park7cd10e32020-01-14 09:22:18 +09007887 java_library {
7888 name: "myjar",
7889 srcs: ["foo/bar/MyClass.java"],
7890 sdk_version: "none",
7891 system_modules: "none",
7892 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007893 apex_available: [
7894 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007895 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007896 "//apex_available:platform",
7897 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007898 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007899 }
7900
7901 java_library {
7902 name: "myotherjar",
7903 srcs: ["foo/bar/MyClass.java"],
7904 sdk_version: "none",
7905 system_modules: "none",
7906 apex_available: [
7907 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007908 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007909 "//apex_available:platform",
7910 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007911 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007912 }
7913 `
7914
7915 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7916 for _, f := range files {
7917 if f.path == file {
7918 if f.isLink {
7919 t.Errorf("%q is not a real file", file)
7920 }
7921 return
7922 }
7923 }
7924 t.Errorf("%q is not found", file)
7925 }
7926
Jiyong Parkce243632023-02-17 18:22:25 +09007927 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007928 for _, f := range files {
7929 if f.path == file {
7930 if !f.isLink {
7931 t.Errorf("%q is not a symlink", file)
7932 }
Jiyong Parkce243632023-02-17 18:22:25 +09007933 if f.src != target {
7934 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7935 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007936 return
7937 }
7938 }
7939 t.Errorf("%q is not found", file)
7940 }
7941
Jiyong Park9d677202020-02-19 16:29:35 +09007942 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7943 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007944 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007945 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007946 ensureRealfileExists(t, files, "javalib/myjar.jar")
7947 ensureRealfileExists(t, files, "lib64/mylib.so")
7948 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007949 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007950
Jooyung Hana0503a52023-08-23 13:12:50 +09007951 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007952 ensureRealfileExists(t, files, "javalib/myjar.jar")
7953 ensureRealfileExists(t, files, "lib64/mylib.so")
7954 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007955 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007956
7957 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007958 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007959 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007960 ensureRealfileExists(t, files, "javalib/myjar.jar")
7961 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007962 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7963 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007964
Jooyung Hana0503a52023-08-23 13:12:50 +09007965 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007966 ensureRealfileExists(t, files, "javalib/myjar.jar")
7967 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007968 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7969 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007970}
7971
Yo Chiange8128052020-07-23 20:09:18 +08007972func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007973 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007974 apex {
7975 name: "myapex",
7976 key: "myapex.key",
7977 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007978 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007979 }
7980
7981 apex_key {
7982 name: "myapex.key",
7983 public_key: "testkey.avbpubkey",
7984 private_key: "testkey.pem",
7985 }
7986
7987 cc_library_shared {
7988 name: "mylib",
7989 srcs: ["mylib.cpp"],
7990 shared_libs: ["myotherlib"],
7991 system_shared_libs: [],
7992 stl: "none",
7993 apex_available: [
7994 "myapex",
7995 "//apex_available:platform",
7996 ],
7997 }
7998
7999 cc_prebuilt_library_shared {
8000 name: "myotherlib",
8001 srcs: ["prebuilt.so"],
8002 system_shared_libs: [],
8003 stl: "none",
8004 apex_available: [
8005 "myapex",
8006 "//apex_available:platform",
8007 ],
8008 }
8009 `)
8010
Jooyung Hana0503a52023-08-23 13:12:50 +09008011 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008012 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008013 var builder strings.Builder
8014 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8015 androidMk := builder.String()
8016 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008017 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008018 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8019 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8020 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008021 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008022}
8023
Jooyung Han643adc42020-02-27 13:50:06 +09008024func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008025 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008026 apex {
8027 name: "myapex",
8028 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008029 binaries: ["mybin"],
8030 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008031 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008032 }
8033
8034 apex_key {
8035 name: "myapex.key",
8036 public_key: "testkey.avbpubkey",
8037 private_key: "testkey.pem",
8038 }
8039
8040 cc_library {
8041 name: "mylib",
8042 srcs: ["mylib.cpp"],
8043 shared_libs: ["mylib2"],
8044 system_shared_libs: [],
8045 stl: "none",
8046 apex_available: [ "myapex" ],
8047 }
8048
8049 cc_library {
8050 name: "mylib2",
8051 srcs: ["mylib.cpp"],
8052 system_shared_libs: [],
8053 stl: "none",
8054 apex_available: [ "myapex" ],
8055 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008056
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008057 // Used as both a JNI library and a regular shared library.
8058 cc_library {
8059 name: "mylib3",
8060 srcs: ["mylib.cpp"],
8061 system_shared_libs: [],
8062 stl: "none",
8063 apex_available: [ "myapex" ],
8064 }
8065
8066 cc_binary {
8067 name: "mybin",
8068 srcs: ["mybin.cpp"],
8069 shared_libs: ["mylib3"],
8070 system_shared_libs: [],
8071 stl: "none",
8072 apex_available: [ "myapex" ],
8073 }
8074
Jiyong Park34d5c332022-02-24 18:02:44 +09008075 rust_ffi_shared {
8076 name: "libfoo.rust",
8077 crate_name: "foo",
8078 srcs: ["foo.rs"],
8079 shared_libs: ["libfoo.shared_from_rust"],
8080 prefer_rlib: true,
8081 apex_available: ["myapex"],
8082 }
8083
8084 cc_library_shared {
8085 name: "libfoo.shared_from_rust",
8086 srcs: ["mylib.cpp"],
8087 system_shared_libs: [],
8088 stl: "none",
8089 stubs: {
8090 versions: ["10", "11", "12"],
8091 },
8092 }
8093
Jooyung Han643adc42020-02-27 13:50:06 +09008094 `)
8095
Jooyung Hana0503a52023-08-23 13:12:50 +09008096 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008097 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008098 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008099 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008100 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008101 "lib64/mylib.so",
8102 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008103 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008104 "lib64/libfoo.rust.so",
8105 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8106 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008107 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008108
8109 // b/220397949
8110 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008111}
8112
Jooyung Han49f67012020-04-17 13:43:10 +09008113func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008114 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008115 apex {
8116 name: "myapex",
8117 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008118 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008119 }
8120 apex_key {
8121 name: "myapex.key",
8122 public_key: "testkey.avbpubkey",
8123 private_key: "testkey.pem",
8124 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008125 `,
8126 android.FixtureModifyConfig(func(config android.Config) {
8127 delete(config.Targets, android.Android)
8128 config.AndroidCommonTarget = android.Target{}
8129 }),
8130 )
Jooyung Han49f67012020-04-17 13:43:10 +09008131
8132 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8133 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8134 }
8135}
8136
Jiyong Parkbd159612020-02-28 15:22:21 +09008137func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008138 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008139 apex {
8140 name: "myapex",
8141 key: "myapex.key",
8142 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008143 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008144 }
8145
8146 apex_key {
8147 name: "myapex.key",
8148 public_key: "testkey.avbpubkey",
8149 private_key: "testkey.pem",
8150 }
8151
8152 android_app {
8153 name: "AppFoo",
8154 srcs: ["foo/bar/MyClass.java"],
8155 sdk_version: "none",
8156 system_modules: "none",
8157 apex_available: [ "myapex" ],
8158 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008159 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008160
Jooyung Hana0503a52023-08-23 13:12:50 +09008161 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008162 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008163
8164 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008165 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 +09008166}
8167
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008168func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008169 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008170 apex {
8171 name: "myapex",
8172 key: "myapex.key",
8173 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008174 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008175 }
8176
8177 apex_key {
8178 name: "myapex.key",
8179 public_key: "testkey.avbpubkey",
8180 private_key: "testkey.pem",
8181 }
8182
8183 android_app_set {
8184 name: "AppSet",
8185 set: "AppSet.apks",
8186 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008187 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008188 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008189 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008190 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8191 s := mod.Rule("apexRule").Args["copy_commands"]
8192 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008193 if len(copyCmds) != 4 {
8194 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008195 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008196 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8197 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008198 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8199 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008200
8201 // Ensure that canned_fs_config has an entry for the app set zip file
8202 generateFsRule := mod.Rule("generateFsConfig")
8203 cmd := generateFsRule.RuleParams.Command
8204 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008205}
8206
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008207func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008208 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008209 apex_set {
8210 name: "myapex",
8211 filename: "foo_v2.apex",
8212 sanitized: {
8213 none: { set: "myapex.apks", },
8214 hwaddress: { set: "myapex.hwasan.apks", },
8215 },
Paul Duffin24704672021-04-06 16:09:30 +01008216 }
8217 `
8218 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008219
Paul Duffin24704672021-04-06 16:09:30 +01008220 // Check that the extractor produces the correct output file from the correct input file.
8221 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008222
Paul Duffin24704672021-04-06 16:09:30 +01008223 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8224 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008225
Paul Duffin24704672021-04-06 16:09:30 +01008226 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8227
8228 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008229 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8230 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008231
8232 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008233}
8234
Pranav Guptaeba03b02022-09-27 00:27:08 +00008235func TestApexSetApksModuleAssignment(t *testing.T) {
8236 ctx := testApex(t, `
8237 apex_set {
8238 name: "myapex",
8239 set: ":myapex_apks_file",
8240 }
8241
8242 filegroup {
8243 name: "myapex_apks_file",
8244 srcs: ["myapex.apks"],
8245 }
8246 `)
8247
8248 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8249
8250 // Check that the extractor produces the correct apks file from the input module
8251 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
8252 extractedApex := m.Output(extractorOutput)
8253
8254 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8255}
8256
Paul Duffin89f570a2021-06-16 01:42:33 +01008257func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008258 t.Helper()
8259
Paul Duffin55607122021-03-30 23:32:51 +01008260 fs := android.MockFS{
8261 "a.java": nil,
8262 "a.jar": nil,
8263 "apex_manifest.json": nil,
8264 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008265 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008266 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8267 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8268 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008269 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008270 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008271
Paul Duffin55607122021-03-30 23:32:51 +01008272 errorHandler := android.FixtureExpectsNoErrors
8273 if errmsg != "" {
8274 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008275 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008276
Paul Duffin55607122021-03-30 23:32:51 +01008277 result := android.GroupFixturePreparers(
8278 cc.PrepareForTestWithCcDefaultModules,
8279 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008280 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008281 java.PrepareForTestWithJavaSdkLibraryFiles,
8282 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008283 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008284 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008285 android.FixtureModifyMockFS(func(fs android.MockFS) {
8286 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8287 insert := ""
8288 for _, fragment := range fragments {
8289 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8290 }
8291 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8292 platform_bootclasspath {
8293 name: "platform-bootclasspath",
8294 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008295 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008296 %s
8297 ],
8298 }
8299 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008300 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008301 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008302 // Dexpreopt for boot jars requires the ART boot image profile.
8303 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8304 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008305 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008306 ).
8307 ExtendWithErrorHandler(errorHandler).
8308 RunTestWithBp(t, bp)
8309
8310 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008311}
8312
Paul Duffin5556c5f2022-06-09 17:32:21 +00008313func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008314 preparers := android.GroupFixturePreparers(
8315 java.PrepareForTestWithJavaDefaultModules,
8316 PrepareForTestWithApexBuildComponents,
8317 ).
8318 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
8319 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
8320
8321 bpBase := `
8322 apex_set {
8323 name: "com.android.myapex",
8324 installable: true,
8325 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8326 set: "myapex.apks",
8327 }
8328
8329 apex_set {
8330 name: "com.mycompany.android.myapex",
8331 apex_name: "com.android.myapex",
8332 installable: true,
8333 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8334 set: "company-myapex.apks",
8335 }
8336
8337 prebuilt_bootclasspath_fragment {
8338 name: "my-bootclasspath-fragment",
8339 apex_available: ["com.android.myapex"],
8340 %s
8341 }
8342 `
8343
8344 t.Run("java_import", func(t *testing.T) {
8345 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8346 java_import {
8347 name: "libfoo",
8348 jars: ["libfoo.jar"],
8349 apex_available: ["com.android.myapex"],
8350 }
8351 `)
8352 })
8353
8354 t.Run("java_sdk_library_import", func(t *testing.T) {
8355 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8356 java_sdk_library_import {
8357 name: "libfoo",
8358 public: {
8359 jars: ["libbar.jar"],
8360 },
8361 apex_available: ["com.android.myapex"],
8362 }
8363 `)
8364 })
8365
8366 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8367 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8368 image_name: "art",
8369 contents: ["libfoo"],
8370 `)+`
8371 java_sdk_library_import {
8372 name: "libfoo",
8373 public: {
8374 jars: ["libbar.jar"],
8375 },
8376 apex_available: ["com.android.myapex"],
8377 }
8378 `)
8379 })
8380}
8381
Paul Duffin5556c5f2022-06-09 17:32:21 +00008382func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8383 preparers := android.GroupFixturePreparers(
8384 java.PrepareForTestWithJavaDefaultModules,
8385 PrepareForTestWithApexBuildComponents,
8386 )
8387
8388 bpBase := `
8389 apex_set {
8390 name: "com.android.myapex",
8391 installable: true,
8392 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8393 set: "myapex.apks",
8394 }
8395
8396 apex_set {
8397 name: "com.android.myapex_compressed",
8398 apex_name: "com.android.myapex",
8399 installable: true,
8400 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8401 set: "myapex_compressed.apks",
8402 }
8403
8404 prebuilt_bootclasspath_fragment {
8405 name: "my-bootclasspath-fragment",
8406 apex_available: [
8407 "com.android.myapex",
8408 "com.android.myapex_compressed",
8409 ],
8410 hidden_api: {
8411 annotation_flags: "annotation-flags.csv",
8412 metadata: "metadata.csv",
8413 index: "index.csv",
8414 signature_patterns: "signature_patterns.csv",
8415 },
8416 %s
8417 }
8418 `
8419
8420 t.Run("java_import", func(t *testing.T) {
8421 result := preparers.RunTestWithBp(t,
8422 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8423 java_import {
8424 name: "libfoo",
8425 jars: ["libfoo.jar"],
8426 apex_available: [
8427 "com.android.myapex",
8428 "com.android.myapex_compressed",
8429 ],
8430 }
8431 `)
8432
8433 module := result.Module("libfoo", "android_common_com.android.myapex")
8434 usesLibraryDep := module.(java.UsesLibraryDependency)
8435 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8436 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8437 usesLibraryDep.DexJarBuildPath().Path())
8438 })
8439
8440 t.Run("java_sdk_library_import", func(t *testing.T) {
8441 result := preparers.RunTestWithBp(t,
8442 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8443 java_sdk_library_import {
8444 name: "libfoo",
8445 public: {
8446 jars: ["libbar.jar"],
8447 },
8448 apex_available: [
8449 "com.android.myapex",
8450 "com.android.myapex_compressed",
8451 ],
8452 compile_dex: true,
8453 }
8454 `)
8455
8456 module := result.Module("libfoo", "android_common_com.android.myapex")
8457 usesLibraryDep := module.(java.UsesLibraryDependency)
8458 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8459 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8460 usesLibraryDep.DexJarBuildPath().Path())
8461 })
8462
8463 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8464 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8465 image_name: "art",
8466 contents: ["libfoo"],
8467 `)+`
8468 java_sdk_library_import {
8469 name: "libfoo",
8470 public: {
8471 jars: ["libbar.jar"],
8472 },
8473 apex_available: [
8474 "com.android.myapex",
8475 "com.android.myapex_compressed",
8476 ],
8477 compile_dex: true,
8478 }
8479 `)
8480 })
8481}
8482
Jooyung Han548640b2020-04-27 12:10:30 +09008483func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8484 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8485 apex {
8486 name: "myapex",
8487 key: "myapex.key",
8488 updatable: true,
8489 }
8490
8491 apex_key {
8492 name: "myapex.key",
8493 public_key: "testkey.avbpubkey",
8494 private_key: "testkey.pem",
8495 }
8496 `)
8497}
8498
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008499func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8500 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8501 apex {
8502 name: "myapex",
8503 key: "myapex.key",
8504 }
8505
8506 apex_key {
8507 name: "myapex.key",
8508 public_key: "testkey.avbpubkey",
8509 private_key: "testkey.pem",
8510 }
8511 `)
8512}
8513
Jooyung Handfc864c2023-03-20 18:19:07 +09008514func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8515 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008516 apex {
8517 name: "myapex",
8518 key: "myapex.key",
8519 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008520 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008521 soc_specific: true,
8522 }
8523
8524 apex_key {
8525 name: "myapex.key",
8526 public_key: "testkey.avbpubkey",
8527 private_key: "testkey.pem",
8528 }
8529 `)
8530}
8531
Jooyung Han02873da2023-03-22 17:41:03 +09008532func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8533 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8534 apex {
8535 name: "myapex",
8536 key: "myapex.key",
8537 updatable: false,
8538 min_sdk_version: "29",
8539 use_vndk_as_stable: true,
8540 vendor: true,
8541 }
8542
8543 apex_key {
8544 name: "myapex.key",
8545 public_key: "testkey.avbpubkey",
8546 private_key: "testkey.pem",
8547 }
8548 `)
8549}
8550
Jooyung Handfc864c2023-03-20 18:19:07 +09008551func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8552 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8553 apex {
8554 name: "myapex",
8555 key: "myapex.key",
8556 updatable: false,
8557 use_vndk_as_stable: true,
8558 }
8559
8560 apex_key {
8561 name: "myapex.key",
8562 public_key: "testkey.avbpubkey",
8563 private_key: "testkey.pem",
8564 }
8565 `)
8566}
8567
satayevb98371c2021-06-15 16:49:50 +01008568func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8569 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8570 apex {
8571 name: "myapex",
8572 key: "myapex.key",
8573 systemserverclasspath_fragments: [
8574 "mysystemserverclasspathfragment",
8575 ],
8576 min_sdk_version: "29",
8577 updatable: true,
8578 }
8579
8580 apex_key {
8581 name: "myapex.key",
8582 public_key: "testkey.avbpubkey",
8583 private_key: "testkey.pem",
8584 }
8585
8586 java_library {
8587 name: "foo",
8588 srcs: ["b.java"],
8589 min_sdk_version: "29",
8590 installable: true,
8591 apex_available: [
8592 "myapex",
8593 ],
8594 }
8595
8596 systemserverclasspath_fragment {
8597 name: "mysystemserverclasspathfragment",
8598 generate_classpaths_proto: false,
8599 contents: [
8600 "foo",
8601 ],
8602 apex_available: [
8603 "myapex",
8604 ],
8605 }
satayevabcd5972021-08-06 17:49:46 +01008606 `,
8607 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8608 )
satayevb98371c2021-06-15 16:49:50 +01008609}
8610
Paul Duffin064b70c2020-11-02 17:32:38 +00008611func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008612 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008613 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008614 fragment := java.ApexVariantReference{
8615 Apex: proptools.StringPtr("myapex"),
8616 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8617 }
8618
Paul Duffin064b70c2020-11-02 17:32:38 +00008619 testDexpreoptWithApexes(t, `
8620 prebuilt_apex {
8621 name: "myapex" ,
8622 arch: {
8623 arm64: {
8624 src: "myapex-arm64.apex",
8625 },
8626 arm: {
8627 src: "myapex-arm.apex",
8628 },
8629 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008630 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8631 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008632
Paul Duffin89f570a2021-06-16 01:42:33 +01008633 prebuilt_bootclasspath_fragment {
8634 name: "my-bootclasspath-fragment",
8635 contents: ["libfoo"],
8636 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008637 hidden_api: {
8638 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8639 metadata: "my-bootclasspath-fragment/metadata.csv",
8640 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008641 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8642 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8643 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008644 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008645 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008646
Paul Duffin89f570a2021-06-16 01:42:33 +01008647 java_import {
8648 name: "libfoo",
8649 jars: ["libfoo.jar"],
8650 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008651 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008652 }
8653 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008654 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008655}
8656
Spandan Dasf14e2542021-11-12 00:01:37 +00008657func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008658 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008659 bp += `
8660 apex_key {
8661 name: "myapex.key",
8662 public_key: "testkey.avbpubkey",
8663 private_key: "testkey.pem",
8664 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008665 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008666 "lib1/src/A.java": nil,
8667 "lib2/src/B.java": nil,
8668 "system/sepolicy/apex/myapex-file_contexts": nil,
8669 }
8670
Paul Duffin45338f02021-03-30 23:07:52 +01008671 errorHandler := android.FixtureExpectsNoErrors
8672 if errmsg != "" {
8673 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008674 }
Colin Crossae8600b2020-10-29 17:09:13 -07008675
Paul Duffin45338f02021-03-30 23:07:52 +01008676 android.GroupFixturePreparers(
8677 android.PrepareForTestWithAndroidBuildComponents,
8678 java.PrepareForTestWithJavaBuildComponents,
8679 PrepareForTestWithApexBuildComponents,
8680 android.PrepareForTestWithNeverallowRules(rules),
8681 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008682 apexBootJars := make([]string, 0, len(bootJars))
8683 for _, apexBootJar := range bootJars {
8684 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008685 }
satayevd604b212021-07-21 14:23:52 +01008686 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008687 }),
8688 fs.AddToFixture(),
8689 ).
8690 ExtendWithErrorHandler(errorHandler).
8691 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008692}
8693
8694func TestApexPermittedPackagesRules(t *testing.T) {
8695 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008696 name string
8697 expectedError string
8698 bp string
8699 bootJars []string
8700 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008701 }{
8702
8703 {
8704 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8705 expectedError: "",
8706 bp: `
8707 java_library {
8708 name: "bcp_lib1",
8709 srcs: ["lib1/src/*.java"],
8710 permitted_packages: ["foo.bar"],
8711 apex_available: ["myapex"],
8712 sdk_version: "none",
8713 system_modules: "none",
8714 }
8715 java_library {
8716 name: "nonbcp_lib2",
8717 srcs: ["lib2/src/*.java"],
8718 apex_available: ["myapex"],
8719 permitted_packages: ["a.b"],
8720 sdk_version: "none",
8721 system_modules: "none",
8722 }
8723 apex {
8724 name: "myapex",
8725 key: "myapex.key",
8726 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008727 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008728 }`,
8729 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008730 bcpPermittedPackages: map[string][]string{
8731 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008732 "foo.bar",
8733 },
8734 },
8735 },
8736 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008737 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008738 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 +01008739 bp: `
8740 java_library {
8741 name: "bcp_lib1",
8742 srcs: ["lib1/src/*.java"],
8743 apex_available: ["myapex"],
8744 permitted_packages: ["foo.bar"],
8745 sdk_version: "none",
8746 system_modules: "none",
8747 }
8748 java_library {
8749 name: "bcp_lib2",
8750 srcs: ["lib2/src/*.java"],
8751 apex_available: ["myapex"],
8752 permitted_packages: ["foo.bar", "bar.baz"],
8753 sdk_version: "none",
8754 system_modules: "none",
8755 }
8756 apex {
8757 name: "myapex",
8758 key: "myapex.key",
8759 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008760 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008761 }
8762 `,
8763 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008764 bcpPermittedPackages: map[string][]string{
8765 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008766 "foo.bar",
8767 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008768 "bcp_lib2": []string{
8769 "foo.bar",
8770 },
8771 },
8772 },
8773 {
8774 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8775 expectedError: "",
8776 bp: `
8777 java_library {
8778 name: "bcp_lib_restricted",
8779 srcs: ["lib1/src/*.java"],
8780 apex_available: ["myapex"],
8781 permitted_packages: ["foo.bar"],
8782 sdk_version: "none",
8783 min_sdk_version: "29",
8784 system_modules: "none",
8785 }
8786 java_library {
8787 name: "bcp_lib_unrestricted",
8788 srcs: ["lib2/src/*.java"],
8789 apex_available: ["myapex"],
8790 permitted_packages: ["foo.bar", "bar.baz"],
8791 sdk_version: "none",
8792 min_sdk_version: "29",
8793 system_modules: "none",
8794 }
8795 apex {
8796 name: "myapex",
8797 key: "myapex.key",
8798 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8799 updatable: true,
8800 min_sdk_version: "29",
8801 }
8802 `,
8803 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8804 bcpPermittedPackages: map[string][]string{
8805 "bcp_lib1_non_updateable": []string{
8806 "foo.bar",
8807 },
8808 // 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 +01008809 },
8810 },
8811 }
8812 for _, tc := range testcases {
8813 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008814 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8815 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008816 })
8817 }
8818}
8819
Jiyong Park62304bb2020-04-13 16:19:48 +09008820func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008821 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008822 apex {
8823 name: "myapex",
8824 key: "myapex.key",
8825 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008826 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008827 }
8828
8829 apex_key {
8830 name: "myapex.key",
8831 public_key: "testkey.avbpubkey",
8832 private_key: "testkey.pem",
8833 }
8834
8835 cc_library {
8836 name: "mylib",
8837 srcs: ["mylib.cpp"],
8838 system_shared_libs: [],
8839 stl: "none",
8840 stubs: {
8841 versions: ["1"],
8842 },
8843 apex_available: ["myapex"],
8844 }
8845
8846 cc_library {
8847 name: "myprivlib",
8848 srcs: ["mylib.cpp"],
8849 system_shared_libs: [],
8850 stl: "none",
8851 apex_available: ["myapex"],
8852 }
8853
8854
8855 cc_test {
8856 name: "mytest",
8857 gtest: false,
8858 srcs: ["mylib.cpp"],
8859 system_shared_libs: [],
8860 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008861 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008862 test_for: ["myapex"]
8863 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008864
8865 cc_library {
8866 name: "mytestlib",
8867 srcs: ["mylib.cpp"],
8868 system_shared_libs: [],
8869 shared_libs: ["mylib", "myprivlib"],
8870 stl: "none",
8871 test_for: ["myapex"],
8872 }
8873
8874 cc_benchmark {
8875 name: "mybench",
8876 srcs: ["mylib.cpp"],
8877 system_shared_libs: [],
8878 shared_libs: ["mylib", "myprivlib"],
8879 stl: "none",
8880 test_for: ["myapex"],
8881 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008882 `)
8883
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008884 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008885 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008886 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8887 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8888 }
8889
8890 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008891 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008892 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8893 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8894 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8895}
Jiyong Park46a512f2020-12-04 18:02:13 +09008896
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008897func TestIndirectTestFor(t *testing.T) {
8898 ctx := testApex(t, `
8899 apex {
8900 name: "myapex",
8901 key: "myapex.key",
8902 native_shared_libs: ["mylib", "myprivlib"],
8903 updatable: false,
8904 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008905
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008906 apex_key {
8907 name: "myapex.key",
8908 public_key: "testkey.avbpubkey",
8909 private_key: "testkey.pem",
8910 }
8911
8912 cc_library {
8913 name: "mylib",
8914 srcs: ["mylib.cpp"],
8915 system_shared_libs: [],
8916 stl: "none",
8917 stubs: {
8918 versions: ["1"],
8919 },
8920 apex_available: ["myapex"],
8921 }
8922
8923 cc_library {
8924 name: "myprivlib",
8925 srcs: ["mylib.cpp"],
8926 system_shared_libs: [],
8927 stl: "none",
8928 shared_libs: ["mylib"],
8929 apex_available: ["myapex"],
8930 }
8931
8932 cc_library {
8933 name: "mytestlib",
8934 srcs: ["mylib.cpp"],
8935 system_shared_libs: [],
8936 shared_libs: ["myprivlib"],
8937 stl: "none",
8938 test_for: ["myapex"],
8939 }
8940 `)
8941
8942 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008943 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008944 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8945 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8946 }
8947
8948 // The platform variant of mytestlib links to the platform variant of the
8949 // internal myprivlib.
8950 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8951
8952 // The platform variant of myprivlib links to the platform variant of mylib
8953 // and bypasses its stubs.
8954 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 +09008955}
8956
Martin Stjernholmec009002021-03-27 15:18:31 +00008957func TestTestForForLibInOtherApex(t *testing.T) {
8958 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8959 _ = testApex(t, `
8960 apex {
8961 name: "com.android.art",
8962 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008963 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008964 updatable: false,
8965 }
8966
8967 apex {
8968 name: "com.android.art.debug",
8969 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008970 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008971 updatable: false,
8972 }
8973
8974 apex_key {
8975 name: "myapex.key",
8976 public_key: "testkey.avbpubkey",
8977 private_key: "testkey.pem",
8978 }
8979
8980 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008981 name: "libnativebridge",
8982 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008983 system_shared_libs: [],
8984 stl: "none",
8985 stubs: {
8986 versions: ["1"],
8987 },
8988 apex_available: ["com.android.art", "com.android.art.debug"],
8989 }
8990
8991 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008992 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008993 srcs: ["mylib.cpp"],
8994 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008995 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008996 stl: "none",
8997 apex_available: ["com.android.art.debug"],
8998 test_for: ["com.android.art"],
8999 }
9000 `,
9001 android.MockFS{
9002 "system/sepolicy/apex/com.android.art-file_contexts": nil,
9003 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
9004 }.AddToFixture())
9005}
9006
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009007// TODO(jungjw): Move this to proptools
9008func intPtr(i int) *int {
9009 return &i
9010}
9011
9012func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009013 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009014 apex_set {
9015 name: "myapex",
9016 set: "myapex.apks",
9017 filename: "foo_v2.apex",
9018 overrides: ["foo"],
9019 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009020 `,
9021 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9022 variables.Platform_sdk_version = intPtr(30)
9023 }),
9024 android.FixtureModifyConfig(func(config android.Config) {
9025 config.Targets[android.Android] = []android.Target{
9026 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9027 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9028 }
9029 }),
9030 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009031
Paul Duffin24704672021-04-06 16:09:30 +01009032 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009033
9034 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009035 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009036 actual := extractedApex.Args["abis"]
9037 expected := "ARMEABI_V7A,ARM64_V8A"
9038 if actual != expected {
9039 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9040 }
9041 actual = extractedApex.Args["sdk-version"]
9042 expected = "30"
9043 if actual != expected {
9044 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9045 }
9046
Paul Duffin6717d882021-06-15 19:09:41 +01009047 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009048 a := m.Module().(*ApexSet)
9049 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009050 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009051 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9052 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9053 }
9054}
9055
Anton Hansson805e0a52022-11-25 14:06:46 +00009056func TestApexSet_NativeBridge(t *testing.T) {
9057 ctx := testApex(t, `
9058 apex_set {
9059 name: "myapex",
9060 set: "myapex.apks",
9061 filename: "foo_v2.apex",
9062 overrides: ["foo"],
9063 }
9064 `,
9065 android.FixtureModifyConfig(func(config android.Config) {
9066 config.Targets[android.Android] = []android.Target{
9067 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9068 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9069 }
9070 }),
9071 )
9072
9073 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
9074
9075 // Check extract_apks tool parameters. No native bridge arch expected
9076 extractedApex := m.Output("extracted/myapex.apks")
9077 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9078}
9079
Jiyong Park7d95a512020-05-10 15:16:24 +09009080func TestNoStaticLinkingToStubsLib(t *testing.T) {
9081 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9082 apex {
9083 name: "myapex",
9084 key: "myapex.key",
9085 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009086 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009087 }
9088
9089 apex_key {
9090 name: "myapex.key",
9091 public_key: "testkey.avbpubkey",
9092 private_key: "testkey.pem",
9093 }
9094
9095 cc_library {
9096 name: "mylib",
9097 srcs: ["mylib.cpp"],
9098 static_libs: ["otherlib"],
9099 system_shared_libs: [],
9100 stl: "none",
9101 apex_available: [ "myapex" ],
9102 }
9103
9104 cc_library {
9105 name: "otherlib",
9106 srcs: ["mylib.cpp"],
9107 system_shared_libs: [],
9108 stl: "none",
9109 stubs: {
9110 versions: ["1", "2", "3"],
9111 },
9112 apex_available: [ "myapex" ],
9113 }
9114 `)
9115}
9116
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009117func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009118 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009119 apex {
9120 name: "myapex",
9121 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009122 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009123 custom_sign_tool: "sign_myapex",
9124 }
9125
9126 apex_key {
9127 name: "myapex.key",
9128 public_key: "testkey.avbpubkey",
9129 private_key: "testkey.pem",
9130 }
9131 `)
9132
Jooyung Han286957d2023-10-30 16:17:56 +09009133 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009134 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009135 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 +09009136}
9137
9138func TestApexKeysTxtOverrides(t *testing.T) {
9139 ctx := testApex(t, `
9140 apex {
9141 name: "myapex",
9142 key: "myapex.key",
9143 updatable: false,
9144 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009145 }
9146
9147 apex_key {
9148 name: "myapex.key",
9149 public_key: "testkey.avbpubkey",
9150 private_key: "testkey.pem",
9151 }
9152
9153 prebuilt_apex {
9154 name: "myapex",
9155 prefer: true,
9156 arch: {
9157 arm64: {
9158 src: "myapex-arm64.apex",
9159 },
9160 arm: {
9161 src: "myapex-arm.apex",
9162 },
9163 },
9164 }
9165
9166 apex_set {
9167 name: "myapex_set",
9168 set: "myapex.apks",
9169 filename: "myapex_set.apex",
9170 overrides: ["myapex"],
9171 }
9172 `)
9173
Colin Crossf61d03d2023-11-02 16:56:39 -07009174 content := android.ContentFromFileRuleForTests(t, ctx,
9175 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009176 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"`)
Colin Crossf61d03d2023-11-02 16:56:39 -07009177 content = android.ContentFromFileRuleForTests(t, ctx,
9178 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009179 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 +09009180}
9181
Jooyung Han938b5932020-06-20 12:47:47 +09009182func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009183 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009184 apex {
9185 name: "myapex",
9186 key: "myapex.key",
9187 apps: ["app"],
9188 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009189 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009190 }
9191
9192 apex_key {
9193 name: "myapex.key",
9194 public_key: "testkey.avbpubkey",
9195 private_key: "testkey.pem",
9196 }
9197
9198 android_app {
9199 name: "app",
9200 srcs: ["foo/bar/MyClass.java"],
9201 package_name: "foo",
9202 sdk_version: "none",
9203 system_modules: "none",
9204 apex_available: [ "myapex" ],
9205 }
9206 `, withFiles(map[string][]byte{
9207 "sub/Android.bp": []byte(`
9208 override_apex {
9209 name: "override_myapex",
9210 base: "myapex",
9211 apps: ["override_app"],
9212 allowed_files: ":allowed",
9213 }
9214 // Overridable "path" property should be referenced indirectly
9215 filegroup {
9216 name: "allowed",
9217 srcs: ["allowed.txt"],
9218 }
9219 override_android_app {
9220 name: "override_app",
9221 base: "app",
9222 package_name: "bar",
9223 }
9224 `),
9225 }))
9226
Jooyung Hana0503a52023-08-23 13:12:50 +09009227 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009228 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9229 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9230 }
9231
Jooyung Hana0503a52023-08-23 13:12:50 +09009232 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009233 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9234 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9235 }
9236}
9237
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009238func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009239 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009240 apex {
9241 name: "myapex",
9242 key: "myapex.key",
9243 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009244 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009245 }
9246
9247 apex_key {
9248 name: "myapex.key",
9249 public_key: "testkey.avbpubkey",
9250 private_key: "testkey.pem",
9251 }
9252
9253 cc_library {
9254 name: "mylib",
9255 srcs: ["mylib.cpp"],
9256 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009257 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009258 },
9259 apex_available: ["myapex"],
9260 }
9261
9262 cc_prebuilt_library_shared {
9263 name: "mylib",
9264 prefer: false,
9265 srcs: ["prebuilt.so"],
9266 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009267 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009268 },
9269 apex_available: ["myapex"],
9270 }
9271 `)
9272}
9273
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009274func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009275 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009276 apex {
9277 name: "myapex",
9278 key: "myapex.key",
9279 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009280 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009281 }
9282 apex_key {
9283 name: "myapex.key",
9284 public_key: "testkey.avbpubkey",
9285 private_key: "testkey.pem",
9286 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009287 `,
9288 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9289 variables.CompressedApex = proptools.BoolPtr(true)
9290 }),
9291 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009292
Jooyung Hana0503a52023-08-23 13:12:50 +09009293 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009294 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9295
Jooyung Hana0503a52023-08-23 13:12:50 +09009296 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009297 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9298
9299 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009300 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009301 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9302
9303 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009304 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009305 var builder strings.Builder
9306 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9307 androidMk := builder.String()
9308 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9309}
9310
Martin Stjernholm2856c662020-12-02 15:03:42 +00009311func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009312 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009313 apex {
9314 name: "myapex",
9315 key: "myapex.key",
9316 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009317 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009318 }
9319
9320 apex_key {
9321 name: "myapex.key",
9322 public_key: "testkey.avbpubkey",
9323 private_key: "testkey.pem",
9324 }
9325
9326 cc_library {
9327 name: "mylib",
9328 srcs: ["mylib.cpp"],
9329 apex_available: ["myapex"],
9330 shared_libs: ["otherlib"],
9331 system_shared_libs: [],
9332 }
9333
9334 cc_library {
9335 name: "otherlib",
9336 srcs: ["mylib.cpp"],
9337 stubs: {
9338 versions: ["current"],
9339 },
9340 }
9341
9342 cc_prebuilt_library_shared {
9343 name: "otherlib",
9344 prefer: true,
9345 srcs: ["prebuilt.so"],
9346 stubs: {
9347 versions: ["current"],
9348 },
9349 }
9350 `)
9351
Jooyung Hana0503a52023-08-23 13:12:50 +09009352 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009353 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009354 var builder strings.Builder
9355 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9356 androidMk := builder.String()
9357
9358 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9359 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009360 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009361}
9362
Jiyong Parke3867542020-12-03 17:28:25 +09009363func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009364 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009365 apex {
9366 name: "myapex",
9367 key: "myapex.key",
9368 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009369 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009370 }
9371
9372 apex_key {
9373 name: "myapex.key",
9374 public_key: "testkey.avbpubkey",
9375 private_key: "testkey.pem",
9376 }
9377
9378 cc_library {
9379 name: "mylib",
9380 srcs: ["mylib.cpp"],
9381 system_shared_libs: [],
9382 stl: "none",
9383 apex_available: ["myapex"],
9384 shared_libs: ["mylib2"],
9385 target: {
9386 apex: {
9387 exclude_shared_libs: ["mylib2"],
9388 },
9389 },
9390 }
9391
9392 cc_library {
9393 name: "mylib2",
9394 srcs: ["mylib.cpp"],
9395 system_shared_libs: [],
9396 stl: "none",
9397 }
9398 `)
9399
9400 // Check if mylib is linked to mylib2 for the non-apex target
9401 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9402 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9403
9404 // Make sure that the link doesn't occur for the apex target
9405 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9406 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9407
9408 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009409 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009410 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9411}
9412
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009413func TestPrebuiltStubLibDep(t *testing.T) {
9414 bpBase := `
9415 apex {
9416 name: "myapex",
9417 key: "myapex.key",
9418 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009419 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009420 }
9421 apex_key {
9422 name: "myapex.key",
9423 public_key: "testkey.avbpubkey",
9424 private_key: "testkey.pem",
9425 }
9426 cc_library {
9427 name: "mylib",
9428 srcs: ["mylib.cpp"],
9429 apex_available: ["myapex"],
9430 shared_libs: ["stublib"],
9431 system_shared_libs: [],
9432 }
9433 apex {
9434 name: "otherapex",
9435 enabled: %s,
9436 key: "myapex.key",
9437 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009438 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009439 }
9440 `
9441
9442 stublibSourceBp := `
9443 cc_library {
9444 name: "stublib",
9445 srcs: ["mylib.cpp"],
9446 apex_available: ["otherapex"],
9447 system_shared_libs: [],
9448 stl: "none",
9449 stubs: {
9450 versions: ["1"],
9451 },
9452 }
9453 `
9454
9455 stublibPrebuiltBp := `
9456 cc_prebuilt_library_shared {
9457 name: "stublib",
9458 srcs: ["prebuilt.so"],
9459 apex_available: ["otherapex"],
9460 stubs: {
9461 versions: ["1"],
9462 },
9463 %s
9464 }
9465 `
9466
9467 tests := []struct {
9468 name string
9469 stublibBp string
9470 usePrebuilt bool
9471 modNames []string // Modules to collect AndroidMkEntries for
9472 otherApexEnabled []string
9473 }{
9474 {
9475 name: "only_source",
9476 stublibBp: stublibSourceBp,
9477 usePrebuilt: false,
9478 modNames: []string{"stublib"},
9479 otherApexEnabled: []string{"true", "false"},
9480 },
9481 {
9482 name: "source_preferred",
9483 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9484 usePrebuilt: false,
9485 modNames: []string{"stublib", "prebuilt_stublib"},
9486 otherApexEnabled: []string{"true", "false"},
9487 },
9488 {
9489 name: "prebuilt_preferred",
9490 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9491 usePrebuilt: true,
9492 modNames: []string{"stublib", "prebuilt_stublib"},
9493 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9494 },
9495 {
9496 name: "only_prebuilt",
9497 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9498 usePrebuilt: true,
9499 modNames: []string{"stublib"},
9500 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9501 },
9502 }
9503
9504 for _, test := range tests {
9505 t.Run(test.name, func(t *testing.T) {
9506 for _, otherApexEnabled := range test.otherApexEnabled {
9507 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009508 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009509
9510 type modAndMkEntries struct {
9511 mod *cc.Module
9512 mkEntries android.AndroidMkEntries
9513 }
9514 entries := []*modAndMkEntries{}
9515
9516 // Gather shared lib modules that are installable
9517 for _, modName := range test.modNames {
9518 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9519 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9520 continue
9521 }
9522 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009523 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009524 continue
9525 }
Colin Crossaa255532020-07-03 13:18:24 -07009526 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009527 if ent.Disabled {
9528 continue
9529 }
9530 entries = append(entries, &modAndMkEntries{
9531 mod: mod,
9532 mkEntries: ent,
9533 })
9534 }
9535 }
9536 }
9537
9538 var entry *modAndMkEntries = nil
9539 for _, ent := range entries {
9540 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9541 if entry != nil {
9542 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9543 } else {
9544 entry = ent
9545 }
9546 }
9547 }
9548
9549 if entry == nil {
9550 t.Errorf("AndroidMk entry for \"stublib\" missing")
9551 } else {
9552 isPrebuilt := entry.mod.Prebuilt() != nil
9553 if isPrebuilt != test.usePrebuilt {
9554 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9555 }
9556 if !entry.mod.IsStubs() {
9557 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9558 }
9559 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9560 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9561 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009562 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009563 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009564 if !android.InList(expected, cflags) {
9565 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9566 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009567 }
9568 })
9569 }
9570 })
9571 }
9572}
9573
Colin Crossc33e5212021-05-25 18:16:02 -07009574func TestApexJavaCoverage(t *testing.T) {
9575 bp := `
9576 apex {
9577 name: "myapex",
9578 key: "myapex.key",
9579 java_libs: ["mylib"],
9580 bootclasspath_fragments: ["mybootclasspathfragment"],
9581 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9582 updatable: false,
9583 }
9584
9585 apex_key {
9586 name: "myapex.key",
9587 public_key: "testkey.avbpubkey",
9588 private_key: "testkey.pem",
9589 }
9590
9591 java_library {
9592 name: "mylib",
9593 srcs: ["mylib.java"],
9594 apex_available: ["myapex"],
9595 compile_dex: true,
9596 }
9597
9598 bootclasspath_fragment {
9599 name: "mybootclasspathfragment",
9600 contents: ["mybootclasspathlib"],
9601 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009602 hidden_api: {
9603 split_packages: ["*"],
9604 },
Colin Crossc33e5212021-05-25 18:16:02 -07009605 }
9606
9607 java_library {
9608 name: "mybootclasspathlib",
9609 srcs: ["mybootclasspathlib.java"],
9610 apex_available: ["myapex"],
9611 compile_dex: true,
9612 }
9613
9614 systemserverclasspath_fragment {
9615 name: "mysystemserverclasspathfragment",
9616 contents: ["mysystemserverclasspathlib"],
9617 apex_available: ["myapex"],
9618 }
9619
9620 java_library {
9621 name: "mysystemserverclasspathlib",
9622 srcs: ["mysystemserverclasspathlib.java"],
9623 apex_available: ["myapex"],
9624 compile_dex: true,
9625 }
9626 `
9627
9628 result := android.GroupFixturePreparers(
9629 PrepareForTestWithApexBuildComponents,
9630 prepareForTestWithMyapex,
9631 java.PrepareForTestWithJavaDefaultModules,
9632 android.PrepareForTestWithAndroidBuildComponents,
9633 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009634 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9635 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009636 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009637 ).RunTest(t)
9638
9639 // Make sure jacoco ran on both mylib and mybootclasspathlib
9640 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9641 t.Errorf("Failed to find jacoco rule for mylib")
9642 }
9643 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9644 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9645 }
9646 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9647 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9648 }
9649}
9650
Jiyong Park192600a2021-08-03 07:52:17 +00009651func TestProhibitStaticExecutable(t *testing.T) {
9652 testApexError(t, `executable mybin is static`, `
9653 apex {
9654 name: "myapex",
9655 key: "myapex.key",
9656 binaries: ["mybin"],
9657 min_sdk_version: "29",
9658 }
9659
9660 apex_key {
9661 name: "myapex.key",
9662 public_key: "testkey.avbpubkey",
9663 private_key: "testkey.pem",
9664 }
9665
9666 cc_binary {
9667 name: "mybin",
9668 srcs: ["mylib.cpp"],
9669 relative_install_path: "foo/bar",
9670 static_executable: true,
9671 system_shared_libs: [],
9672 stl: "none",
9673 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009674 min_sdk_version: "29",
9675 }
9676 `)
9677
9678 testApexError(t, `executable mybin.rust is static`, `
9679 apex {
9680 name: "myapex",
9681 key: "myapex.key",
9682 binaries: ["mybin.rust"],
9683 min_sdk_version: "29",
9684 }
9685
9686 apex_key {
9687 name: "myapex.key",
9688 public_key: "testkey.avbpubkey",
9689 private_key: "testkey.pem",
9690 }
9691
9692 rust_binary {
9693 name: "mybin.rust",
9694 srcs: ["foo.rs"],
9695 static_executable: true,
9696 apex_available: ["myapex"],
9697 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009698 }
9699 `)
9700}
9701
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009702func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9703 ctx := testApex(t, `
9704 apex {
9705 name: "myapex",
9706 key: "myapex.key",
9707 updatable: false,
9708 java_libs: ["foo"],
9709 }
9710
9711 apex_key {
9712 name: "myapex.key",
9713 public_key: "testkey.avbpubkey",
9714 private_key: "testkey.pem",
9715 }
9716
9717 java_library {
9718 name: "foo",
9719 srcs: ["foo.java"],
9720 apex_available: ["myapex"],
9721 installable: true,
9722 }
9723 `,
9724 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9725 )
9726
Jooyung Hana0503a52023-08-23 13:12:50 +09009727 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009728 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9729 var builder strings.Builder
9730 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9731 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009732 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 +00009733}
9734
9735func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9736 ctx := testApex(t, `
9737 prebuilt_apex {
9738 name: "myapex",
9739 arch: {
9740 arm64: {
9741 src: "myapex-arm64.apex",
9742 },
9743 arm: {
9744 src: "myapex-arm.apex",
9745 },
9746 },
9747 exported_java_libs: ["foo"],
9748 }
9749
9750 java_import {
9751 name: "foo",
9752 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009753 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009754 }
9755 `,
9756 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9757 )
9758
9759 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9760 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9761 mainModuleEntries := entriesList[0]
9762 android.AssertArrayString(t,
9763 "LOCAL_REQUIRED_MODULES",
9764 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9765 []string{
9766 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9767 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9768 })
9769}
9770
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009771func TestAndroidMk_RequiredModules(t *testing.T) {
9772 ctx := testApex(t, `
9773 apex {
9774 name: "myapex",
9775 key: "myapex.key",
9776 updatable: false,
9777 java_libs: ["foo"],
9778 required: ["otherapex"],
9779 }
9780
9781 apex {
9782 name: "otherapex",
9783 key: "myapex.key",
9784 updatable: false,
9785 java_libs: ["foo"],
9786 required: ["otherapex"],
9787 }
9788
9789 apex_key {
9790 name: "myapex.key",
9791 public_key: "testkey.avbpubkey",
9792 private_key: "testkey.pem",
9793 }
9794
9795 java_library {
9796 name: "foo",
9797 srcs: ["foo.java"],
9798 apex_available: ["myapex", "otherapex"],
9799 installable: true,
9800 }
9801 `)
9802
Jooyung Hana0503a52023-08-23 13:12:50 +09009803 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009804 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9805 var builder strings.Builder
9806 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9807 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009808 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009809}
9810
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009811func TestAndroidMk_RequiredDeps(t *testing.T) {
9812 ctx := testApex(t, `
9813 apex {
9814 name: "myapex",
9815 key: "myapex.key",
9816 updatable: false,
9817 }
9818
9819 apex_key {
9820 name: "myapex.key",
9821 public_key: "testkey.avbpubkey",
9822 private_key: "testkey.pem",
9823 }
9824 `)
9825
Jooyung Hana0503a52023-08-23 13:12:50 +09009826 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009827 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009828 data := android.AndroidMkDataForTest(t, ctx, bundle)
9829 var builder strings.Builder
9830 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9831 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009832 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009833}
9834
Jooyung Hana6d36672022-02-24 13:58:07 +09009835func TestApexOutputFileProducer(t *testing.T) {
9836 for _, tc := range []struct {
9837 name string
9838 ref string
9839 expected_data []string
9840 }{
9841 {
9842 name: "test_using_output",
9843 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009844 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009845 },
9846 {
9847 name: "test_using_apex",
9848 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009849 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009850 },
9851 } {
9852 t.Run(tc.name, func(t *testing.T) {
9853 ctx := testApex(t, `
9854 apex {
9855 name: "myapex",
9856 key: "myapex.key",
9857 compressible: true,
9858 updatable: false,
9859 }
9860
9861 apex_key {
9862 name: "myapex.key",
9863 public_key: "testkey.avbpubkey",
9864 private_key: "testkey.pem",
9865 }
9866
9867 java_test {
9868 name: "`+tc.name+`",
9869 srcs: ["a.java"],
9870 data: ["`+tc.ref+`"],
9871 }
9872 `,
9873 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9874 variables.CompressedApex = proptools.BoolPtr(true)
9875 }))
9876 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9877 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9878 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9879 })
9880 }
9881}
9882
satayev758968a2021-12-06 11:42:40 +00009883func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9884 preparer := android.GroupFixturePreparers(
9885 PrepareForTestWithApexBuildComponents,
9886 prepareForTestWithMyapex,
9887 java.PrepareForTestWithJavaSdkLibraryFiles,
9888 java.PrepareForTestWithJavaDefaultModules,
9889 android.PrepareForTestWithAndroidBuildComponents,
9890 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9891 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9892 )
9893
9894 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9895 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9896 preparer.RunTestWithBp(t, `
9897 apex {
9898 name: "myapex",
9899 key: "myapex.key",
9900 bootclasspath_fragments: ["mybootclasspathfragment"],
9901 min_sdk_version: "30",
9902 updatable: false,
9903 }
9904
9905 apex_key {
9906 name: "myapex.key",
9907 public_key: "testkey.avbpubkey",
9908 private_key: "testkey.pem",
9909 }
9910
9911 bootclasspath_fragment {
9912 name: "mybootclasspathfragment",
9913 contents: ["mybootclasspathlib"],
9914 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009915 hidden_api: {
9916 split_packages: ["*"],
9917 },
satayev758968a2021-12-06 11:42:40 +00009918 }
9919
9920 java_sdk_library {
9921 name: "mybootclasspathlib",
9922 srcs: ["mybootclasspathlib.java"],
9923 apex_available: ["myapex"],
9924 compile_dex: true,
9925 unsafe_ignore_missing_latest_api: true,
9926 min_sdk_version: "31",
9927 static_libs: ["util"],
9928 }
9929
9930 java_library {
9931 name: "util",
9932 srcs: ["a.java"],
9933 apex_available: ["myapex"],
9934 min_sdk_version: "31",
9935 static_libs: ["another_util"],
9936 }
9937
9938 java_library {
9939 name: "another_util",
9940 srcs: ["a.java"],
9941 min_sdk_version: "31",
9942 apex_available: ["myapex"],
9943 }
9944 `)
9945 })
9946
9947 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9948 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9949 preparer.RunTestWithBp(t, `
9950 apex {
9951 name: "myapex",
9952 key: "myapex.key",
9953 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9954 min_sdk_version: "30",
9955 updatable: false,
9956 }
9957
9958 apex_key {
9959 name: "myapex.key",
9960 public_key: "testkey.avbpubkey",
9961 private_key: "testkey.pem",
9962 }
9963
9964 systemserverclasspath_fragment {
9965 name: "mysystemserverclasspathfragment",
9966 contents: ["mysystemserverclasspathlib"],
9967 apex_available: ["myapex"],
9968 }
9969
9970 java_sdk_library {
9971 name: "mysystemserverclasspathlib",
9972 srcs: ["mysystemserverclasspathlib.java"],
9973 apex_available: ["myapex"],
9974 compile_dex: true,
9975 min_sdk_version: "32",
9976 unsafe_ignore_missing_latest_api: true,
9977 static_libs: ["util"],
9978 }
9979
9980 java_library {
9981 name: "util",
9982 srcs: ["a.java"],
9983 apex_available: ["myapex"],
9984 min_sdk_version: "31",
9985 static_libs: ["another_util"],
9986 }
9987
9988 java_library {
9989 name: "another_util",
9990 srcs: ["a.java"],
9991 min_sdk_version: "31",
9992 apex_available: ["myapex"],
9993 }
9994 `)
9995 })
9996
9997 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9998 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9999 RunTestWithBp(t, `
10000 apex {
10001 name: "myapex",
10002 key: "myapex.key",
10003 bootclasspath_fragments: ["mybootclasspathfragment"],
10004 min_sdk_version: "30",
10005 updatable: false,
10006 }
10007
10008 apex_key {
10009 name: "myapex.key",
10010 public_key: "testkey.avbpubkey",
10011 private_key: "testkey.pem",
10012 }
10013
10014 bootclasspath_fragment {
10015 name: "mybootclasspathfragment",
10016 contents: ["mybootclasspathlib"],
10017 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010018 hidden_api: {
10019 split_packages: ["*"],
10020 },
satayev758968a2021-12-06 11:42:40 +000010021 }
10022
10023 java_sdk_library {
10024 name: "mybootclasspathlib",
10025 srcs: ["mybootclasspathlib.java"],
10026 apex_available: ["myapex"],
10027 compile_dex: true,
10028 unsafe_ignore_missing_latest_api: true,
10029 }
10030 `)
10031 })
10032
10033 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10034 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10035 RunTestWithBp(t, `
10036 apex {
10037 name: "myapex",
10038 key: "myapex.key",
10039 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10040 min_sdk_version: "30",
10041 updatable: false,
10042 }
10043
10044 apex_key {
10045 name: "myapex.key",
10046 public_key: "testkey.avbpubkey",
10047 private_key: "testkey.pem",
10048 }
10049
10050 systemserverclasspath_fragment {
10051 name: "mysystemserverclasspathfragment",
10052 contents: ["mysystemserverclasspathlib"],
10053 apex_available: ["myapex"],
10054 }
10055
10056 java_sdk_library {
10057 name: "mysystemserverclasspathlib",
10058 srcs: ["mysystemserverclasspathlib.java"],
10059 apex_available: ["myapex"],
10060 compile_dex: true,
10061 unsafe_ignore_missing_latest_api: true,
10062 }
10063 `)
10064 })
10065}
10066
Jiakai Zhang6decef92022-01-12 17:56:19 +000010067// Verifies that the APEX depends on all the Make modules in the list.
10068func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10069 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10070 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010071 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010072 }
10073}
10074
10075// Verifies that the APEX does not depend on any of the Make modules in the list.
10076func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10077 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10078 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010079 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010080 }
10081}
10082
Cole Faust1021ccd2023-02-26 21:15:25 -080010083// TODO(b/193460475): Re-enable this test
10084//func TestApexStrictUpdtabilityLint(t *testing.T) {
10085// bpTemplate := `
10086// apex {
10087// name: "myapex",
10088// key: "myapex.key",
10089// java_libs: ["myjavalib"],
10090// updatable: %v,
10091// min_sdk_version: "29",
10092// }
10093// apex_key {
10094// name: "myapex.key",
10095// }
10096// java_library {
10097// name: "myjavalib",
10098// srcs: ["MyClass.java"],
10099// apex_available: [ "myapex" ],
10100// lint: {
10101// strict_updatability_linting: %v,
10102// },
10103// sdk_version: "current",
10104// min_sdk_version: "29",
10105// }
10106// `
10107// fs := android.MockFS{
10108// "lint-baseline.xml": nil,
10109// }
10110//
10111// testCases := []struct {
10112// testCaseName string
10113// apexUpdatable bool
10114// javaStrictUpdtabilityLint bool
10115// lintFileExists bool
10116// disallowedFlagExpected bool
10117// }{
10118// {
10119// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10120// apexUpdatable: true,
10121// javaStrictUpdtabilityLint: true,
10122// lintFileExists: false,
10123// disallowedFlagExpected: false,
10124// },
10125// {
10126// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10127// apexUpdatable: false,
10128// javaStrictUpdtabilityLint: false,
10129// lintFileExists: true,
10130// disallowedFlagExpected: false,
10131// },
10132// {
10133// testCaseName: "non-updatable apex respects strict updatability of javalib",
10134// apexUpdatable: false,
10135// javaStrictUpdtabilityLint: true,
10136// lintFileExists: true,
10137// disallowedFlagExpected: true,
10138// },
10139// {
10140// testCaseName: "updatable apex sets strict updatability of javalib to true",
10141// apexUpdatable: true,
10142// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10143// lintFileExists: true,
10144// disallowedFlagExpected: true,
10145// },
10146// }
10147//
10148// for _, testCase := range testCases {
10149// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10150// fixtures := []android.FixturePreparer{}
10151// if testCase.lintFileExists {
10152// fixtures = append(fixtures, fs.AddToFixture())
10153// }
10154//
10155// result := testApex(t, bp, fixtures...)
10156// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10157// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10158// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10159//
10160// if disallowedFlagActual != testCase.disallowedFlagExpected {
10161// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10162// }
10163// }
10164//}
10165//
10166//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10167// bp := `
10168// apex {
10169// name: "myapex",
10170// key: "myapex.key",
10171// java_libs: ["myjavalib"],
10172// updatable: true,
10173// min_sdk_version: "29",
10174// }
10175// apex_key {
10176// name: "myapex.key",
10177// }
10178// java_library {
10179// name: "myjavalib",
10180// srcs: ["MyClass.java"],
10181// apex_available: [ "myapex" ],
10182// sdk_version: "current",
10183// min_sdk_version: "29",
10184// }
10185// `
10186//
10187// testCases := []struct {
10188// testCaseName string
10189// moduleDirectory string
10190// disallowedFlagExpected bool
10191// }{
10192// {
10193// testCaseName: "lintable module defined outside libcore",
10194// moduleDirectory: "",
10195// disallowedFlagExpected: true,
10196// },
10197// {
10198// testCaseName: "lintable module defined in libcore root directory",
10199// moduleDirectory: "libcore/",
10200// disallowedFlagExpected: false,
10201// },
10202// {
10203// testCaseName: "lintable module defined in libcore child directory",
10204// moduleDirectory: "libcore/childdir/",
10205// disallowedFlagExpected: true,
10206// },
10207// }
10208//
10209// for _, testCase := range testCases {
10210// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10211// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10212// result := testApex(t, "", lintFileCreator, bpFileCreator)
10213// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10214// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10215// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10216// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10217//
10218// if disallowedFlagActual != testCase.disallowedFlagExpected {
10219// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10220// }
10221// }
10222//}
10223//
10224//// checks transtive deps of an apex coming from bootclasspath_fragment
10225//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10226// bp := `
10227// apex {
10228// name: "myapex",
10229// key: "myapex.key",
10230// bootclasspath_fragments: ["mybootclasspathfragment"],
10231// updatable: true,
10232// min_sdk_version: "29",
10233// }
10234// apex_key {
10235// name: "myapex.key",
10236// }
10237// bootclasspath_fragment {
10238// name: "mybootclasspathfragment",
10239// contents: ["myjavalib"],
10240// apex_available: ["myapex"],
10241// hidden_api: {
10242// split_packages: ["*"],
10243// },
10244// }
10245// java_library {
10246// name: "myjavalib",
10247// srcs: ["MyClass.java"],
10248// apex_available: [ "myapex" ],
10249// sdk_version: "current",
10250// min_sdk_version: "29",
10251// compile_dex: true,
10252// }
10253// `
10254// fs := android.MockFS{
10255// "lint-baseline.xml": nil,
10256// }
10257//
10258// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10259// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10260// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10261// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10262// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10263// }
10264//}
Spandan Das66773252022-01-15 00:23:18 +000010265
Spandan Das42e89502022-05-06 22:12:55 +000010266// updatable apexes should propagate updatable=true to its apps
10267func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10268 bp := `
10269 apex {
10270 name: "myapex",
10271 key: "myapex.key",
10272 updatable: %v,
10273 apps: [
10274 "myapp",
10275 ],
10276 min_sdk_version: "30",
10277 }
10278 apex_key {
10279 name: "myapex.key",
10280 }
10281 android_app {
10282 name: "myapp",
10283 updatable: %v,
10284 apex_available: [
10285 "myapex",
10286 ],
10287 sdk_version: "current",
10288 min_sdk_version: "30",
10289 }
10290 `
10291 testCases := []struct {
10292 name string
10293 apex_is_updatable_bp bool
10294 app_is_updatable_bp bool
10295 app_is_updatable_expected bool
10296 }{
10297 {
10298 name: "Non-updatable apex respects updatable property of non-updatable app",
10299 apex_is_updatable_bp: false,
10300 app_is_updatable_bp: false,
10301 app_is_updatable_expected: false,
10302 },
10303 {
10304 name: "Non-updatable apex respects updatable property of updatable app",
10305 apex_is_updatable_bp: false,
10306 app_is_updatable_bp: true,
10307 app_is_updatable_expected: true,
10308 },
10309 {
10310 name: "Updatable apex respects updatable property of updatable app",
10311 apex_is_updatable_bp: true,
10312 app_is_updatable_bp: true,
10313 app_is_updatable_expected: true,
10314 },
10315 {
10316 name: "Updatable apex sets updatable=true on non-updatable app",
10317 apex_is_updatable_bp: true,
10318 app_is_updatable_bp: false,
10319 app_is_updatable_expected: true,
10320 },
10321 }
10322 for _, testCase := range testCases {
10323 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10324 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10325 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10326 }
10327}
10328
Kiyoung Kim487689e2022-07-26 09:48:22 +090010329func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10330 bp := `
10331 apex {
10332 name: "myapex",
10333 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010334 native_shared_libs: ["libbaz"],
10335 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010336 min_sdk_version: "29",
10337 }
10338 apex_key {
10339 name: "myapex.key",
10340 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010341 cc_binary {
10342 name: "binfoo",
10343 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010344 apex_available: ["myapex"],
10345 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010346 recovery_available: false,
10347 }
10348 cc_library {
10349 name: "libbar",
10350 srcs: ["libbar.cc"],
10351 stubs: {
10352 symbol_file: "libbar.map.txt",
10353 versions: [
10354 "29",
10355 ],
10356 },
10357 }
10358 cc_library {
10359 name: "libbaz",
10360 srcs: ["libbaz.cc"],
10361 apex_available: ["myapex"],
10362 min_sdk_version: "29",
10363 stubs: {
10364 symbol_file: "libbaz.map.txt",
10365 versions: [
10366 "29",
10367 ],
10368 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010369 }
10370 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010371 name: "libbar",
10372 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010373 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010374 variants: ["apex.29"],
10375 }
10376 cc_api_variant {
10377 name: "libbar",
10378 variant: "apex",
10379 version: "29",
10380 src: "libbar_apex_29.so",
10381 }
10382 cc_api_library {
10383 name: "libbaz",
10384 src: "libbaz_stub.so",
10385 min_sdk_version: "29",
10386 variants: ["apex.29"],
10387 }
10388 cc_api_variant {
10389 name: "libbaz",
10390 variant: "apex",
10391 version: "29",
10392 src: "libbaz_apex_29.so",
10393 }
10394 cc_api_library {
10395 name: "libqux",
10396 src: "libqux_stub.so",
10397 min_sdk_version: "29",
10398 variants: ["apex.29"],
10399 }
10400 cc_api_variant {
10401 name: "libqux",
10402 variant: "apex",
10403 version: "29",
10404 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010405 }
10406 api_imports {
10407 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010408 apex_shared_libs: [
10409 "libbar",
10410 "libbaz",
10411 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010412 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010413 }
10414 `
10415 result := testApex(t, bp)
10416
10417 hasDep := func(m android.Module, wantDep android.Module) bool {
10418 t.Helper()
10419 var found bool
10420 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10421 if dep == wantDep {
10422 found = true
10423 }
10424 })
10425 return found
10426 }
10427
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010428 // Library defines stubs and cc_api_library should be used with cc_api_library
10429 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10430 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10431 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010432
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010433 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10434 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010435
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010436 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10437 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10438 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10439 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10440
10441 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10442 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10443 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10444 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10445 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10446
10447 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10448 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10449 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10450
10451 // cc_api_library defined without original library should be linked with cc_api_library
10452 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10453 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10454 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10455}
10456
10457func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10458 bp := `
10459 apex {
10460 name: "myapex",
10461 key: "myapex.key",
10462 native_shared_libs: ["libbar"],
10463 min_sdk_version: "29",
10464 }
10465 apex_key {
10466 name: "myapex.key",
10467 }
10468 cc_binary {
10469 name: "binfoo",
10470 shared_libs: ["libbar"],
10471 recovery_available: false,
10472 }
10473 cc_library {
10474 name: "libbar",
10475 srcs: ["libbar.cc"],
10476 apex_available: ["myapex"],
10477 min_sdk_version: "29",
10478 stubs: {
10479 symbol_file: "libbar.map.txt",
10480 versions: [
10481 "29",
10482 ],
10483 },
10484 }
10485 cc_api_library {
10486 name: "libbar",
10487 src: "libbar_stub.so",
10488 variants: ["apex.29"],
10489 }
10490 cc_api_variant {
10491 name: "libbar",
10492 variant: "apex",
10493 version: "29",
10494 src: "libbar_apex_29.so",
10495 }
10496 api_imports {
10497 name: "api_imports",
10498 apex_shared_libs: [
10499 "libbar",
10500 ],
10501 }
10502 `
10503
10504 result := testApex(t, bp)
10505
10506 hasDep := func(m android.Module, wantDep android.Module) bool {
10507 t.Helper()
10508 var found bool
10509 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10510 if dep == wantDep {
10511 found = true
10512 }
10513 })
10514 return found
10515 }
10516
10517 // Library defines stubs and cc_api_library should be used with cc_api_library
10518 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10519 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10520 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10521
10522 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10523 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10524
10525 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10526 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10527 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10528 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010529}
Dennis Shend4f5d932023-01-31 20:27:21 +000010530
10531func TestTrimmedApex(t *testing.T) {
10532 bp := `
10533 apex {
10534 name: "myapex",
10535 key: "myapex.key",
10536 native_shared_libs: ["libfoo","libbaz"],
10537 min_sdk_version: "29",
10538 trim_against: "mydcla",
10539 }
10540 apex {
10541 name: "mydcla",
10542 key: "myapex.key",
10543 native_shared_libs: ["libfoo","libbar"],
10544 min_sdk_version: "29",
10545 file_contexts: ":myapex-file_contexts",
10546 dynamic_common_lib_apex: true,
10547 }
10548 apex_key {
10549 name: "myapex.key",
10550 }
10551 cc_library {
10552 name: "libfoo",
10553 shared_libs: ["libc"],
10554 apex_available: ["myapex","mydcla"],
10555 min_sdk_version: "29",
10556 }
10557 cc_library {
10558 name: "libbar",
10559 shared_libs: ["libc"],
10560 apex_available: ["myapex","mydcla"],
10561 min_sdk_version: "29",
10562 }
10563 cc_library {
10564 name: "libbaz",
10565 shared_libs: ["libc"],
10566 apex_available: ["myapex","mydcla"],
10567 min_sdk_version: "29",
10568 }
10569 cc_api_library {
10570 name: "libc",
10571 src: "libc.so",
10572 min_sdk_version: "29",
10573 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010574 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010575 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010576 }
10577 api_imports {
10578 name: "api_imports",
10579 shared_libs: [
10580 "libc",
10581 ],
10582 header_libs: [],
10583 }
10584 `
10585 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010586 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010587 apexRule := module.MaybeRule("apexRule")
10588 if apexRule.Rule == nil {
10589 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10590 }
10591
10592 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010593 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010594 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10595 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10596 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10597 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10598}
Jingwen Chendea7a642023-03-28 11:30:50 +000010599
10600func TestCannedFsConfig(t *testing.T) {
10601 ctx := testApex(t, `
10602 apex {
10603 name: "myapex",
10604 key: "myapex.key",
10605 updatable: false,
10606 }
10607
10608 apex_key {
10609 name: "myapex.key",
10610 public_key: "testkey.avbpubkey",
10611 private_key: "testkey.pem",
10612 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010613 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010614 generateFsRule := mod.Rule("generateFsConfig")
10615 cmd := generateFsRule.RuleParams.Command
10616
10617 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10618}
10619
10620func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10621 ctx := testApex(t, `
10622 apex {
10623 name: "myapex",
10624 key: "myapex.key",
10625 canned_fs_config: "my_config",
10626 updatable: false,
10627 }
10628
10629 apex_key {
10630 name: "myapex.key",
10631 public_key: "testkey.avbpubkey",
10632 private_key: "testkey.pem",
10633 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010634 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010635 generateFsRule := mod.Rule("generateFsConfig")
10636 cmd := generateFsRule.RuleParams.Command
10637
10638 // Ensure that canned_fs_config has "cat my_config" at the end
10639 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10640}
Spandan Das20fce2d2023-04-12 17:21:39 +000010641
10642func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10643 testCases := []struct {
10644 desc string
10645 hasStubs bool
10646 apexAvailable string
10647 expectedError string
10648 }{
10649 {
10650 desc: "non-stub library can have multiple apex_available",
10651 hasStubs: false,
10652 apexAvailable: `["myapex", "otherapex"]`,
10653 },
10654 {
10655 desc: "stub library should not be available to anyapex",
10656 hasStubs: true,
10657 apexAvailable: `["//apex_available:anyapex"]`,
10658 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10659 },
10660 {
10661 desc: "stub library should not be available to multiple apexes",
10662 hasStubs: true,
10663 apexAvailable: `["myapex", "otherapex"]`,
10664 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10665 },
10666 {
10667 desc: "stub library can be available to a core apex and a test apex",
10668 hasStubs: true,
10669 apexAvailable: `["myapex", "test_myapex"]`,
10670 },
10671 }
10672 bpTemplate := `
10673 cc_library {
10674 name: "libfoo",
10675 %v
10676 apex_available: %v,
10677 }
10678 apex {
10679 name: "myapex",
10680 key: "apex.key",
10681 updatable: false,
10682 native_shared_libs: ["libfoo"],
10683 }
10684 apex {
10685 name: "otherapex",
10686 key: "apex.key",
10687 updatable: false,
10688 }
10689 apex_test {
10690 name: "test_myapex",
10691 key: "apex.key",
10692 updatable: false,
10693 native_shared_libs: ["libfoo"],
10694 }
10695 apex_key {
10696 name: "apex.key",
10697 }
10698 `
10699 for _, tc := range testCases {
10700 stubs := ""
10701 if tc.hasStubs {
10702 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10703 }
10704 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10705 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10706 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10707 })
10708 if tc.expectedError == "" {
10709 testApex(t, bp, mockFsFixturePreparer)
10710 } else {
10711 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10712 }
10713 }
10714}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010715
10716func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10717 context := android.GroupFixturePreparers(
10718 android.PrepareForIntegrationTestWithAndroid,
10719 cc.PrepareForIntegrationTestWithCc,
10720 PrepareForTestWithApexBuildComponents,
10721 prepareForTestWithMyapex,
10722 filesystem.PrepareForTestWithFilesystemBuildComponents,
10723 )
10724 result := context.RunTestWithBp(t, `
10725 android_system_image {
10726 name: "myfilesystem",
10727 deps: [
10728 "libfoo",
10729 ],
10730 linker_config_src: "linker.config.json",
10731 }
10732
10733 cc_library {
10734 name: "libfoo",
10735 shared_libs: [
10736 "libbar",
10737 ],
10738 stl: "none",
10739 }
10740
10741 cc_library {
10742 name: "libbar",
10743 stl: "none",
10744 apex_available: ["myapex"],
10745 }
10746
10747 apex {
10748 name: "myapex",
10749 native_shared_libs: ["libbar"],
10750 key: "myapex.key",
10751 updatable: false,
10752 }
10753
10754 apex_key {
10755 name: "myapex.key",
10756 public_key: "testkey.avbpubkey",
10757 private_key: "testkey.pem",
10758 }
10759 `)
10760
10761 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10762 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10763 inputs.Strings(),
10764 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10765}