blob: a83b94db0f8a5371fdd4ddcac09e8cfbb7146268 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Kiyoung Kim487689e2022-07-26 09:48:22 +090028 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090029 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070036 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090037 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090038 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070039 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090040)
41
Jooyung Hand3639552019-08-09 12:57:43 +090042// names returns name list from white space separated string
43func names(s string) (ns []string) {
44 for _, n := range strings.Split(s, " ") {
45 if len(n) > 0 {
46 ns = append(ns, n)
47 }
48 }
49 return
50}
51
Paul Duffin40b62572021-03-20 11:39:01 +000052func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090053 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010054 android.GroupFixturePreparers(
55 prepareForApexTest,
56 android.GroupFixturePreparers(preparers...),
57 ).
Paul Duffine05480a2021-03-08 15:07:14 +000058 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000059 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090060}
61
Paul Duffin40b62572021-03-20 11:39:01 +000062func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090063 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010064
65 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000066 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010067 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000068 }
Paul Duffin284165a2021-03-29 01:50:31 +010069
70 result := android.GroupFixturePreparers(
71 prepareForApexTest,
72 android.GroupFixturePreparers(preparers...),
73 optionalBpPreparer,
74 ).RunTest(t)
75
Paul Duffine05480a2021-03-08 15:07:14 +000076 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090077}
78
Paul Duffin810f33d2021-03-09 14:12:32 +000079func withFiles(files android.MockFS) android.FixturePreparer {
80 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090081}
82
Paul Duffin810f33d2021-03-09 14:12:32 +000083func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
84 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090085 for k, v := range targets {
86 config.Targets[k] = v
87 }
Paul Duffin810f33d2021-03-09 14:12:32 +000088 })
Jooyung Han344d5432019-08-23 11:17:39 +090089}
90
Jooyung Han35155c42020-02-06 17:33:20 +090091// withNativeBridgeTargets sets configuration with targets including:
92// - X86_64 (primary)
93// - X86 (secondary)
94// - Arm64 on X86_64 (native bridge)
95// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000096var withNativeBridgeEnabled = android.FixtureModifyConfig(
97 func(config android.Config) {
98 config.Targets[android.Android] = []android.Target{
99 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
100 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
104 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
107 }
108 },
109)
110
111func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
112 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
113 variables.ManifestPackageNameOverrides = specs
114 })
Jooyung Han35155c42020-02-06 17:33:20 +0900115}
116
Albert Martineefabcf2022-03-21 20:11:16 +0000117func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
118 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
119 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
120 })
121}
122
Paul Duffin810f33d2021-03-09 14:12:32 +0000123var withBinder32bit = android.FixtureModifyProductVariables(
124 func(variables android.FixtureProductVariables) {
125 variables.Binder32bit = proptools.BoolPtr(true)
126 },
127)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900128
Paul Duffin810f33d2021-03-09 14:12:32 +0000129var withUnbundledBuild = android.FixtureModifyProductVariables(
130 func(variables android.FixtureProductVariables) {
131 variables.Unbundled_build = proptools.BoolPtr(true)
132 },
133)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900134
Paul Duffin284165a2021-03-29 01:50:31 +0100135// Legacy preparer used for running tests within the apex package.
136//
137// This includes everything that was needed to run any test in the apex package prior to the
138// introduction of the test fixtures. Tests that are being converted to use fixtures directly
139// rather than through the testApex...() methods should avoid using this and instead use the
140// various preparers directly, using android.GroupFixturePreparers(...) to group them when
141// necessary.
142//
143// deprecated
144var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000145 // General preparers in alphabetical order as test infrastructure will enforce correct
146 // registration order.
147 android.PrepareForTestWithAndroidBuildComponents,
148 bpf.PrepareForTestWithBpf,
149 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100150 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000151 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
152 rust.PrepareForTestWithRustDefaultModules,
153 sh.PrepareForTestWithShBuildComponents,
154
155 PrepareForTestWithApexBuildComponents,
156
157 // Additional apex test specific preparers.
158 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
159 filegroup {
160 name: "myapex-file_contexts",
161 srcs: [
162 "apex/myapex-file_contexts",
163 ],
164 }
165 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000166 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000167 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000168 "a.java": nil,
169 "PrebuiltAppFoo.apk": nil,
170 "PrebuiltAppFooPriv.apk": nil,
171 "apex_manifest.json": nil,
172 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000173 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
174 "system/sepolicy/apex/myapex2-file_contexts": nil,
175 "system/sepolicy/apex/otherapex-file_contexts": nil,
176 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
177 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700178 "mylib.cpp": nil,
179 "mytest.cpp": nil,
180 "mytest1.cpp": nil,
181 "mytest2.cpp": nil,
182 "mytest3.cpp": nil,
183 "myprebuilt": nil,
184 "my_include": nil,
185 "foo/bar/MyClass.java": nil,
186 "prebuilt.jar": nil,
187 "prebuilt.so": nil,
188 "vendor/foo/devkeys/test.x509.pem": nil,
189 "vendor/foo/devkeys/test.pk8": nil,
190 "testkey.x509.pem": nil,
191 "testkey.pk8": nil,
192 "testkey.override.x509.pem": nil,
193 "testkey.override.pk8": nil,
194 "vendor/foo/devkeys/testkey.avbpubkey": nil,
195 "vendor/foo/devkeys/testkey.pem": nil,
196 "NOTICE": nil,
197 "custom_notice": nil,
198 "custom_notice_for_static_lib": nil,
199 "testkey2.avbpubkey": nil,
200 "testkey2.pem": nil,
201 "myapex-arm64.apex": nil,
202 "myapex-arm.apex": nil,
203 "myapex.apks": nil,
204 "frameworks/base/api/current.txt": nil,
205 "framework/aidl/a.aidl": nil,
206 "dummy.txt": nil,
207 "baz": nil,
208 "bar/baz": nil,
209 "testdata/baz": nil,
210 "AppSet.apks": nil,
211 "foo.rs": nil,
212 "libfoo.jar": nil,
213 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000214 },
215 ),
216
217 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
218 variables.DeviceVndkVersion = proptools.StringPtr("current")
219 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
220 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
221 variables.Platform_sdk_codename = proptools.StringPtr("Q")
222 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000223 // "Tiramisu" needs to be in the next line for compatibility with soong code,
224 // not because of these tests specifically (it's not used by the tests)
225 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900226 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000227 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000228 }),
229)
230
Paul Duffin52bfaa42021-03-23 23:40:12 +0000231var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
232 "system/sepolicy/apex/myapex-file_contexts": nil,
233})
234
Jooyung Han643adc42020-02-27 13:50:06 +0900235// ensure that 'result' equals 'expected'
236func ensureEquals(t *testing.T, result string, expected string) {
237 t.Helper()
238 if result != expected {
239 t.Errorf("%q != %q", expected, result)
240 }
241}
242
Jiyong Park25fc6a92018-11-18 18:02:45 +0900243// ensure that 'result' contains 'expected'
244func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900245 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900246 if !strings.Contains(result, expected) {
247 t.Errorf("%q is not found in %q", expected, result)
248 }
249}
250
Liz Kammer5bd365f2020-05-27 15:15:11 -0700251// ensure that 'result' contains 'expected' exactly one time
252func ensureContainsOnce(t *testing.T, result string, expected string) {
253 t.Helper()
254 count := strings.Count(result, expected)
255 if count != 1 {
256 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
257 }
258}
259
Jiyong Park25fc6a92018-11-18 18:02:45 +0900260// ensures that 'result' does not contain 'notExpected'
261func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900262 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900263 if strings.Contains(result, notExpected) {
264 t.Errorf("%q is found in %q", notExpected, result)
265 }
266}
267
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700268func ensureMatches(t *testing.T, result string, expectedRex string) {
269 ok, err := regexp.MatchString(expectedRex, result)
270 if err != nil {
271 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
272 return
273 }
274 if !ok {
275 t.Errorf("%s does not match regular expession %s", result, expectedRex)
276 }
277}
278
Jiyong Park25fc6a92018-11-18 18:02:45 +0900279func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900280 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900281 if !android.InList(expected, result) {
282 t.Errorf("%q is not found in %v", expected, result)
283 }
284}
285
286func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900287 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900288 if android.InList(notExpected, result) {
289 t.Errorf("%q is found in %v", notExpected, result)
290 }
291}
292
Jooyung Hane1633032019-08-01 17:41:43 +0900293func ensureListEmpty(t *testing.T, result []string) {
294 t.Helper()
295 if len(result) > 0 {
296 t.Errorf("%q is expected to be empty", result)
297 }
298}
299
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000300func ensureListNotEmpty(t *testing.T, result []string) {
301 t.Helper()
302 if len(result) == 0 {
303 t.Errorf("%q is expected to be not empty", result)
304 }
305}
306
Jiyong Park25fc6a92018-11-18 18:02:45 +0900307// Minimal test
308func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800309 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900310 apex_defaults {
311 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900312 manifest: ":myapex.manifest",
313 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900314 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900315 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900316 native_shared_libs: [
317 "mylib",
318 "libfoo.ffi",
319 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900320 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800321 multilib: {
322 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900323 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800324 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900325 },
Jiyong Park77acec62020-06-01 21:39:15 +0900326 java_libs: [
327 "myjar",
328 "myjar_dex",
329 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000330 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900331 }
332
Jiyong Park30ca9372019-02-07 16:27:23 +0900333 apex {
334 name: "myapex",
335 defaults: ["myapex-defaults"],
336 }
337
Jiyong Park25fc6a92018-11-18 18:02:45 +0900338 apex_key {
339 name: "myapex.key",
340 public_key: "testkey.avbpubkey",
341 private_key: "testkey.pem",
342 }
343
Jiyong Park809bb722019-02-13 21:33:49 +0900344 filegroup {
345 name: "myapex.manifest",
346 srcs: ["apex_manifest.json"],
347 }
348
349 filegroup {
350 name: "myapex.androidmanifest",
351 srcs: ["AndroidManifest.xml"],
352 }
353
Jiyong Park25fc6a92018-11-18 18:02:45 +0900354 cc_library {
355 name: "mylib",
356 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900357 shared_libs: [
358 "mylib2",
359 "libbar.ffi",
360 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900361 system_shared_libs: [],
362 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000363 // TODO: remove //apex_available:platform
364 apex_available: [
365 "//apex_available:platform",
366 "myapex",
367 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900368 }
369
Alex Light3d673592019-01-18 14:37:31 -0800370 cc_binary {
371 name: "foo",
372 srcs: ["mylib.cpp"],
373 compile_multilib: "both",
374 multilib: {
375 lib32: {
376 suffix: "32",
377 },
378 lib64: {
379 suffix: "64",
380 },
381 },
382 symlinks: ["foo_link_"],
383 symlink_preferred_arch: true,
384 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800385 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700386 apex_available: [ "myapex", "com.android.gki.*" ],
387 }
388
Jiyong Park99644e92020-11-17 22:21:02 +0900389 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000390 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900391 srcs: ["foo.rs"],
392 rlibs: ["libfoo.rlib.rust"],
393 dylibs: ["libfoo.dylib.rust"],
394 apex_available: ["myapex"],
395 }
396
397 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000398 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900399 srcs: ["foo.rs"],
400 crate_name: "foo",
401 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900402 shared_libs: ["libfoo.shared_from_rust"],
403 }
404
405 cc_library_shared {
406 name: "libfoo.shared_from_rust",
407 srcs: ["mylib.cpp"],
408 system_shared_libs: [],
409 stl: "none",
410 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900411 }
412
413 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000414 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900415 srcs: ["foo.rs"],
416 crate_name: "foo",
417 apex_available: ["myapex"],
418 }
419
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900420 rust_ffi_shared {
421 name: "libfoo.ffi",
422 srcs: ["foo.rs"],
423 crate_name: "foo",
424 apex_available: ["myapex"],
425 }
426
427 rust_ffi_shared {
428 name: "libbar.ffi",
429 srcs: ["foo.rs"],
430 crate_name: "bar",
431 apex_available: ["myapex"],
432 }
433
Yifan Hongd22a84a2020-07-28 17:37:46 -0700434 apex {
435 name: "com.android.gki.fake",
436 binaries: ["foo"],
437 key: "myapex.key",
438 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000439 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800440 }
441
Paul Duffindddd5462020-04-07 15:25:44 +0100442 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900443 name: "mylib2",
444 srcs: ["mylib.cpp"],
445 system_shared_libs: [],
446 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900447 static_libs: ["libstatic"],
448 // TODO: remove //apex_available:platform
449 apex_available: [
450 "//apex_available:platform",
451 "myapex",
452 ],
453 }
454
Paul Duffindddd5462020-04-07 15:25:44 +0100455 cc_prebuilt_library_shared {
456 name: "mylib2",
457 srcs: ["prebuilt.so"],
458 // TODO: remove //apex_available:platform
459 apex_available: [
460 "//apex_available:platform",
461 "myapex",
462 ],
463 }
464
Jiyong Park9918e1a2020-03-17 19:16:40 +0900465 cc_library_static {
466 name: "libstatic",
467 srcs: ["mylib.cpp"],
468 system_shared_libs: [],
469 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000470 // TODO: remove //apex_available:platform
471 apex_available: [
472 "//apex_available:platform",
473 "myapex",
474 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900475 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476
477 java_library {
478 name: "myjar",
479 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900480 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900481 sdk_version: "none",
482 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900484 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000485 // TODO: remove //apex_available:platform
486 apex_available: [
487 "//apex_available:platform",
488 "myapex",
489 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 }
491
Jiyong Park77acec62020-06-01 21:39:15 +0900492 dex_import {
493 name: "myjar_dex",
494 jars: ["prebuilt.jar"],
495 apex_available: [
496 "//apex_available:platform",
497 "myapex",
498 ],
499 }
500
Jiyong Park7f7766d2019-07-25 22:02:35 +0900501 java_library {
502 name: "myotherjar",
503 srcs: ["foo/bar/MyClass.java"],
504 sdk_version: "none",
505 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900506 // TODO: remove //apex_available:platform
507 apex_available: [
508 "//apex_available:platform",
509 "myapex",
510 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900511 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900512
513 java_library {
514 name: "mysharedjar",
515 srcs: ["foo/bar/MyClass.java"],
516 sdk_version: "none",
517 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900518 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900519 `)
520
Paul Duffina71a67a2021-03-29 00:42:57 +0100521 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900523 // Make sure that Android.mk is created
524 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700525 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900526 var builder strings.Builder
527 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
528
529 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000530 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900531 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
532
Jiyong Park42cca6c2019-04-01 11:15:50 +0900533 optFlags := apexRule.Args["opt_flags"]
534 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700535 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100536 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900537
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538 copyCmds := apexRule.Args["copy_commands"]
539
540 // Ensure that main rule creates an output
541 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
542
543 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700544 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
546 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900547 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900548 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900549
550 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700551 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
552 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900553 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900557
558 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800559 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
560 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900561 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900562 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900563 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900564 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
565 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900567 // .. but not for java libs
568 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900569 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800570
Colin Cross7113d202019-11-20 16:39:12 -0800571 // Ensure that the platform variant ends with _shared or _common
572 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
573 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900574 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
575 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900576 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
577
578 // Ensure that dynamic dependency to java libs are not included
579 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800580
581 // Ensure that all symlinks are present.
582 found_foo_link_64 := false
583 found_foo := false
584 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900585 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800586 if strings.HasSuffix(cmd, "bin/foo") {
587 found_foo = true
588 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
589 found_foo_link_64 = true
590 }
591 }
592 }
593 good := found_foo && found_foo_link_64
594 if !good {
595 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
596 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900597
Artur Satayeva8bd1132020-04-27 18:07:06 +0100598 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100600 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
601 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
602 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100603
604 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100606 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
607 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
608 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800609}
610
Jooyung Hanf21c7972019-12-16 22:32:06 +0900611func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800612 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900613 apex_defaults {
614 name: "myapex-defaults",
615 key: "myapex.key",
616 prebuilts: ["myetc"],
617 native_shared_libs: ["mylib"],
618 java_libs: ["myjar"],
619 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900620 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800621 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000622 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900623 }
624
625 prebuilt_etc {
626 name: "myetc",
627 src: "myprebuilt",
628 }
629
630 apex {
631 name: "myapex",
632 defaults: ["myapex-defaults"],
633 }
634
635 apex_key {
636 name: "myapex.key",
637 public_key: "testkey.avbpubkey",
638 private_key: "testkey.pem",
639 }
640
641 cc_library {
642 name: "mylib",
643 system_shared_libs: [],
644 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000645 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900646 }
647
648 java_library {
649 name: "myjar",
650 srcs: ["foo/bar/MyClass.java"],
651 sdk_version: "none",
652 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000653 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900654 }
655
656 android_app {
657 name: "AppFoo",
658 srcs: ["foo/bar/MyClass.java"],
659 sdk_version: "none",
660 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000661 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900662 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900663
664 runtime_resource_overlay {
665 name: "rro",
666 theme: "blue",
667 }
668
markchien2f59ec92020-09-02 16:23:38 +0800669 bpf {
670 name: "bpf",
671 srcs: ["bpf.c", "bpf2.c"],
672 }
673
Ken Chenfad7f9d2021-11-10 22:02:57 +0800674 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800675 name: "netdTest",
676 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800677 sub_dir: "netd",
678 }
679
Jooyung Hanf21c7972019-12-16 22:32:06 +0900680 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000681 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900682 "etc/myetc",
683 "javalib/myjar.jar",
684 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000685 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900686 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800687 "etc/bpf/bpf.o",
688 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800689 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900690 })
691}
692
Jooyung Han01a3ee22019-11-02 02:52:25 +0900693func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800694 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695 apex {
696 name: "myapex",
697 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000698 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900699 }
700
701 apex_key {
702 name: "myapex.key",
703 public_key: "testkey.avbpubkey",
704 private_key: "testkey.pem",
705 }
706 `)
707
708 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900709 args := module.Rule("apexRule").Args
710 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
711 t.Error("manifest should be apex_manifest.pb, but " + manifest)
712 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900713}
714
Liz Kammer4854a7d2021-05-27 14:28:27 -0400715func TestApexManifestMinSdkVersion(t *testing.T) {
716 ctx := testApex(t, `
717 apex_defaults {
718 name: "my_defaults",
719 key: "myapex.key",
720 product_specific: true,
721 file_contexts: ":my-file-contexts",
722 updatable: false,
723 }
724 apex {
725 name: "myapex_30",
726 min_sdk_version: "30",
727 defaults: ["my_defaults"],
728 }
729
730 apex {
731 name: "myapex_current",
732 min_sdk_version: "current",
733 defaults: ["my_defaults"],
734 }
735
736 apex {
737 name: "myapex_none",
738 defaults: ["my_defaults"],
739 }
740
741 apex_key {
742 name: "myapex.key",
743 public_key: "testkey.avbpubkey",
744 private_key: "testkey.pem",
745 }
746
747 filegroup {
748 name: "my-file-contexts",
749 srcs: ["product_specific_file_contexts"],
750 }
751 `, withFiles(map[string][]byte{
752 "product_specific_file_contexts": nil,
753 }), android.FixtureModifyProductVariables(
754 func(variables android.FixtureProductVariables) {
755 variables.Unbundled_build = proptools.BoolPtr(true)
756 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
757 }), android.FixtureMergeEnv(map[string]string{
758 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
759 }))
760
761 testCases := []struct {
762 module string
763 minSdkVersion string
764 }{
765 {
766 module: "myapex_30",
767 minSdkVersion: "30",
768 },
769 {
770 module: "myapex_current",
771 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
772 },
773 {
774 module: "myapex_none",
775 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
776 },
777 }
778 for _, tc := range testCases {
779 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
780 args := module.Rule("apexRule").Args
781 optFlags := args["opt_flags"]
782 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
783 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
784 }
785 }
786}
787
Jooyung Hanaf730952023-02-28 14:13:38 +0900788func TestFileContexts(t *testing.T) {
789 for _, useFileContextsAsIs := range []bool{true, false} {
790 prop := ""
791 if useFileContextsAsIs {
792 prop = "use_file_contexts_as_is: true,\n"
793 }
794 ctx := testApex(t, `
795 apex {
796 name: "myapex",
797 key: "myapex.key",
798 file_contexts: "file_contexts",
799 updatable: false,
800 vendor: true,
801 `+prop+`
802 }
803
804 apex_key {
805 name: "myapex.key",
806 public_key: "testkey.avbpubkey",
807 private_key: "testkey.pem",
808 }
809 `, withFiles(map[string][]byte{
810 "file_contexts": nil,
811 }))
812
813 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("file_contexts")
814 forceLabellingCommand := "apex_manifest\\\\.pb u:object_r:system_file:s0"
815 if useFileContextsAsIs {
816 android.AssertStringDoesNotContain(t, "should force-label",
817 rule.RuleParams.Command, forceLabellingCommand)
818 } else {
819 android.AssertStringDoesContain(t, "shouldn't force-label",
820 rule.RuleParams.Command, forceLabellingCommand)
821 }
822 }
823}
824
Alex Light5098a612018-11-29 17:12:15 -0800825func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800826 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800827 apex {
828 name: "myapex",
829 key: "myapex.key",
830 payload_type: "zip",
831 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000832 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800833 }
834
835 apex_key {
836 name: "myapex.key",
837 public_key: "testkey.avbpubkey",
838 private_key: "testkey.pem",
839 }
840
841 cc_library {
842 name: "mylib",
843 srcs: ["mylib.cpp"],
844 shared_libs: ["mylib2"],
845 system_shared_libs: [],
846 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000847 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800848 }
849
850 cc_library {
851 name: "mylib2",
852 srcs: ["mylib.cpp"],
853 system_shared_libs: [],
854 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000855 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800856 }
857 `)
858
Sundong Ahnabb64432019-10-22 13:58:29 +0900859 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800860 copyCmds := zipApexRule.Args["copy_commands"]
861
862 // Ensure that main rule creates an output
863 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
864
865 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700866 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800867
868 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700869 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800870
871 // Ensure that both direct and indirect deps are copied into apex
872 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
873 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900874}
875
876func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800877 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900878 apex {
879 name: "myapex",
880 key: "myapex.key",
881 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900882 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000883 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900884 }
885
886 apex_key {
887 name: "myapex.key",
888 public_key: "testkey.avbpubkey",
889 private_key: "testkey.pem",
890 }
891
892 cc_library {
893 name: "mylib",
894 srcs: ["mylib.cpp"],
895 shared_libs: ["mylib2", "mylib3"],
896 system_shared_libs: [],
897 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000898 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900899 }
900
901 cc_library {
902 name: "mylib2",
903 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900904 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900905 system_shared_libs: [],
906 stl: "none",
907 stubs: {
908 versions: ["1", "2", "3"],
909 },
910 }
911
912 cc_library {
913 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900914 srcs: ["mylib.cpp"],
915 shared_libs: ["mylib4"],
916 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900917 stl: "none",
918 stubs: {
919 versions: ["10", "11", "12"],
920 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000921 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900922 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900923
924 cc_library {
925 name: "mylib4",
926 srcs: ["mylib.cpp"],
927 system_shared_libs: [],
928 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000929 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900930 }
Jiyong Park105dc322021-06-11 17:22:09 +0900931
932 rust_binary {
933 name: "foo.rust",
934 srcs: ["foo.rs"],
935 shared_libs: ["libfoo.shared_from_rust"],
936 prefer_rlib: true,
937 apex_available: ["myapex"],
938 }
939
940 cc_library_shared {
941 name: "libfoo.shared_from_rust",
942 srcs: ["mylib.cpp"],
943 system_shared_libs: [],
944 stl: "none",
945 stubs: {
946 versions: ["10", "11", "12"],
947 },
948 }
949
Jiyong Park25fc6a92018-11-18 18:02:45 +0900950 `)
951
Sundong Ahnabb64432019-10-22 13:58:29 +0900952 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900953 copyCmds := apexRule.Args["copy_commands"]
954
955 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800956 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900957
958 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800959 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900960
961 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800962 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900963
Colin Crossaede88c2020-08-11 12:17:01 -0700964 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900965
966 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900967 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900968 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900969 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900970
971 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700972 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900973 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700974 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900975
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700976 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
977 // is replaced by sharing of "cFlags" in cc/builder.go.
978 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
979 // module variable representing "cflags". So it was not detected by ensureNotContains.
980 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
981 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
982 // including the original cflags's "-include mylib.h".
983 //
Jiyong Park64379952018-12-13 18:37:29 +0900984 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700985 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
986 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900987
Jiyong Park85cc35a2022-07-17 11:30:47 +0900988 // Ensure that genstub for platform-provided lib is invoked with --systemapi
989 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
990 // Ensure that genstub for apex-provided lib is invoked with --apex
991 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900992
Jooyung Hana57af4a2020-01-23 05:36:59 +0000993 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900994 "lib64/mylib.so",
995 "lib64/mylib3.so",
996 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900997 "bin/foo.rust",
998 "lib64/libc++.so", // by the implicit dependency from foo.rust
999 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001000 })
Jiyong Park105dc322021-06-11 17:22:09 +09001001
1002 // Ensure that stub dependency from a rust module is not included
1003 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1004 // The rust module is linked to the stub cc library
Peter Collingbournee7c71c32023-03-31 20:21:19 -07001005 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001006 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1007 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001008
1009 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1010 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001011}
1012
Jiyong Park1bc84122021-06-22 20:23:05 +09001013func TestApexCanUsePrivateApis(t *testing.T) {
1014 ctx := testApex(t, `
1015 apex {
1016 name: "myapex",
1017 key: "myapex.key",
1018 native_shared_libs: ["mylib"],
1019 binaries: ["foo.rust"],
1020 updatable: false,
1021 platform_apis: true,
1022 }
1023
1024 apex_key {
1025 name: "myapex.key",
1026 public_key: "testkey.avbpubkey",
1027 private_key: "testkey.pem",
1028 }
1029
1030 cc_library {
1031 name: "mylib",
1032 srcs: ["mylib.cpp"],
1033 shared_libs: ["mylib2"],
1034 system_shared_libs: [],
1035 stl: "none",
1036 apex_available: [ "myapex" ],
1037 }
1038
1039 cc_library {
1040 name: "mylib2",
1041 srcs: ["mylib.cpp"],
1042 cflags: ["-include mylib.h"],
1043 system_shared_libs: [],
1044 stl: "none",
1045 stubs: {
1046 versions: ["1", "2", "3"],
1047 },
1048 }
1049
1050 rust_binary {
1051 name: "foo.rust",
1052 srcs: ["foo.rs"],
1053 shared_libs: ["libfoo.shared_from_rust"],
1054 prefer_rlib: true,
1055 apex_available: ["myapex"],
1056 }
1057
1058 cc_library_shared {
1059 name: "libfoo.shared_from_rust",
1060 srcs: ["mylib.cpp"],
1061 system_shared_libs: [],
1062 stl: "none",
1063 stubs: {
1064 versions: ["10", "11", "12"],
1065 },
1066 }
1067 `)
1068
1069 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1070 copyCmds := apexRule.Args["copy_commands"]
1071
1072 // Ensure that indirect stubs dep is not included
1073 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1074 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1075
1076 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1077 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001078 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001079 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1080 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Peter Collingbournee7c71c32023-03-31 20:21:19 -07001081 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001082 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1083 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1084}
1085
Colin Cross7812fd32020-09-25 12:35:10 -07001086func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1087 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001088 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001089 apex {
1090 name: "myapex",
1091 key: "myapex.key",
1092 native_shared_libs: ["mylib", "mylib3"],
1093 min_sdk_version: "29",
1094 }
1095
1096 apex_key {
1097 name: "myapex.key",
1098 public_key: "testkey.avbpubkey",
1099 private_key: "testkey.pem",
1100 }
1101
1102 cc_library {
1103 name: "mylib",
1104 srcs: ["mylib.cpp"],
1105 shared_libs: ["mylib2", "mylib3"],
1106 system_shared_libs: [],
1107 stl: "none",
1108 apex_available: [ "myapex" ],
1109 min_sdk_version: "28",
1110 }
1111
1112 cc_library {
1113 name: "mylib2",
1114 srcs: ["mylib.cpp"],
1115 cflags: ["-include mylib.h"],
1116 system_shared_libs: [],
1117 stl: "none",
1118 stubs: {
1119 versions: ["28", "29", "30", "current"],
1120 },
1121 min_sdk_version: "28",
1122 }
1123
1124 cc_library {
1125 name: "mylib3",
1126 srcs: ["mylib.cpp"],
1127 shared_libs: ["mylib4"],
1128 system_shared_libs: [],
1129 stl: "none",
1130 stubs: {
1131 versions: ["28", "29", "30", "current"],
1132 },
1133 apex_available: [ "myapex" ],
1134 min_sdk_version: "28",
1135 }
1136
1137 cc_library {
1138 name: "mylib4",
1139 srcs: ["mylib.cpp"],
1140 system_shared_libs: [],
1141 stl: "none",
1142 apex_available: [ "myapex" ],
1143 min_sdk_version: "28",
1144 }
1145 `)
1146
1147 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1148 copyCmds := apexRule.Args["copy_commands"]
1149
1150 // Ensure that direct non-stubs dep is always included
1151 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1152
1153 // Ensure that indirect stubs dep is not included
1154 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1155
1156 // Ensure that direct stubs dep is included
1157 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1158
1159 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1160
Jiyong Park55549df2021-02-26 23:57:23 +09001161 // Ensure that mylib is linking with the latest version of stub for mylib2
1162 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001163 // ... and not linking to the non-stub (impl) variant of mylib2
1164 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1165
1166 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1167 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1168 // .. and not linking to the stubs variant of mylib3
1169 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1170
1171 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001172 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001173 ensureNotContains(t, mylib2Cflags, "-include ")
1174
Jiyong Park85cc35a2022-07-17 11:30:47 +09001175 // Ensure that genstub is invoked with --systemapi
1176 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001177
1178 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1179 "lib64/mylib.so",
1180 "lib64/mylib3.so",
1181 "lib64/mylib4.so",
1182 })
1183}
1184
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001185func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1186 t.Parallel()
1187 // myapex (Z)
1188 // mylib -----------------.
1189 // |
1190 // otherapex (29) |
1191 // libstub's versions: 29 Z current
1192 // |
1193 // <platform> |
1194 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001195 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001196 apex {
1197 name: "myapex",
1198 key: "myapex.key",
1199 native_shared_libs: ["mylib"],
1200 min_sdk_version: "Z", // non-final
1201 }
1202
1203 cc_library {
1204 name: "mylib",
1205 srcs: ["mylib.cpp"],
1206 shared_libs: ["libstub"],
1207 apex_available: ["myapex"],
1208 min_sdk_version: "Z",
1209 }
1210
1211 apex_key {
1212 name: "myapex.key",
1213 public_key: "testkey.avbpubkey",
1214 private_key: "testkey.pem",
1215 }
1216
1217 apex {
1218 name: "otherapex",
1219 key: "myapex.key",
1220 native_shared_libs: ["libstub"],
1221 min_sdk_version: "29",
1222 }
1223
1224 cc_library {
1225 name: "libstub",
1226 srcs: ["mylib.cpp"],
1227 stubs: {
1228 versions: ["29", "Z", "current"],
1229 },
1230 apex_available: ["otherapex"],
1231 min_sdk_version: "29",
1232 }
1233
1234 // platform module depending on libstub from otherapex should use the latest stub("current")
1235 cc_library {
1236 name: "libplatform",
1237 srcs: ["mylib.cpp"],
1238 shared_libs: ["libstub"],
1239 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001240 `,
1241 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1242 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1243 variables.Platform_sdk_final = proptools.BoolPtr(false)
1244 variables.Platform_version_active_codenames = []string{"Z"}
1245 }),
1246 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001247
Jiyong Park55549df2021-02-26 23:57:23 +09001248 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001249 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001250 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001251 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001252 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001253
1254 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1255 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1256 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1257 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1258 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1259}
1260
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001261func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001262 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001263 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001264 name: "myapex2",
1265 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001266 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001267 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001268 }
1269
1270 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001271 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001272 public_key: "testkey.avbpubkey",
1273 private_key: "testkey.pem",
1274 }
1275
1276 cc_library {
1277 name: "mylib",
1278 srcs: ["mylib.cpp"],
1279 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001280 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001281 system_shared_libs: [],
1282 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001283 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001284 }
1285
1286 cc_library {
1287 name: "libfoo",
1288 srcs: ["mylib.cpp"],
1289 shared_libs: ["libbar"],
1290 system_shared_libs: [],
1291 stl: "none",
1292 stubs: {
1293 versions: ["10", "20", "30"],
1294 },
1295 }
1296
1297 cc_library {
1298 name: "libbar",
1299 srcs: ["mylib.cpp"],
1300 system_shared_libs: [],
1301 stl: "none",
1302 }
1303
Jiyong Park678c8812020-02-07 17:25:49 +09001304 cc_library_static {
1305 name: "libbaz",
1306 srcs: ["mylib.cpp"],
1307 system_shared_libs: [],
1308 stl: "none",
1309 apex_available: [ "myapex2" ],
1310 }
1311
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001312 `)
1313
Jiyong Park83dc74b2020-01-14 18:38:44 +09001314 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001315 copyCmds := apexRule.Args["copy_commands"]
1316
1317 // Ensure that direct non-stubs dep is always included
1318 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1319
1320 // Ensure that indirect stubs dep is not included
1321 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1322
1323 // Ensure that dependency of stubs is not included
1324 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1325
Colin Crossaede88c2020-08-11 12:17:01 -07001326 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001327
1328 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001329 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001330 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001331 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001332
Jiyong Park3ff16992019-12-27 14:11:47 +09001333 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001334
1335 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1336 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001337
Artur Satayeva8bd1132020-04-27 18:07:06 +01001338 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001339 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001340
Artur Satayeva8bd1132020-04-27 18:07:06 +01001341 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001342 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001343}
1344
Jooyung Hand3639552019-08-09 12:57:43 +09001345func TestApexWithRuntimeLibsDependency(t *testing.T) {
1346 /*
1347 myapex
1348 |
1349 v (runtime_libs)
1350 mylib ------+------> libfoo [provides stub]
1351 |
1352 `------> libbar
1353 */
Colin Cross1c460562021-02-16 17:55:47 -08001354 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001355 apex {
1356 name: "myapex",
1357 key: "myapex.key",
1358 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001359 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001360 }
1361
1362 apex_key {
1363 name: "myapex.key",
1364 public_key: "testkey.avbpubkey",
1365 private_key: "testkey.pem",
1366 }
1367
1368 cc_library {
1369 name: "mylib",
1370 srcs: ["mylib.cpp"],
1371 runtime_libs: ["libfoo", "libbar"],
1372 system_shared_libs: [],
1373 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001374 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001375 }
1376
1377 cc_library {
1378 name: "libfoo",
1379 srcs: ["mylib.cpp"],
1380 system_shared_libs: [],
1381 stl: "none",
1382 stubs: {
1383 versions: ["10", "20", "30"],
1384 },
1385 }
1386
1387 cc_library {
1388 name: "libbar",
1389 srcs: ["mylib.cpp"],
1390 system_shared_libs: [],
1391 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001392 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001393 }
1394
1395 `)
1396
Sundong Ahnabb64432019-10-22 13:58:29 +09001397 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001398 copyCmds := apexRule.Args["copy_commands"]
1399
1400 // Ensure that direct non-stubs dep is always included
1401 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1402
1403 // Ensure that indirect stubs dep is not included
1404 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1405
1406 // Ensure that runtime_libs dep in included
1407 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1408
Sundong Ahnabb64432019-10-22 13:58:29 +09001409 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001410 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1411 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001412
1413}
1414
Paul Duffina02cae32021-03-09 01:44:06 +00001415var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1416 cc.PrepareForTestWithCcBuildComponents,
1417 PrepareForTestWithApexBuildComponents,
1418 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001419 apex {
1420 name: "com.android.runtime",
1421 key: "com.android.runtime.key",
1422 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001423 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001424 }
1425
1426 apex_key {
1427 name: "com.android.runtime.key",
1428 public_key: "testkey.avbpubkey",
1429 private_key: "testkey.pem",
1430 }
Paul Duffina02cae32021-03-09 01:44:06 +00001431 `),
1432 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1433)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001434
Paul Duffina02cae32021-03-09 01:44:06 +00001435func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001436 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001437 cc_library {
1438 name: "libc",
1439 no_libcrt: true,
1440 nocrt: true,
1441 stl: "none",
1442 system_shared_libs: [],
1443 stubs: { versions: ["1"] },
1444 apex_available: ["com.android.runtime"],
1445
1446 sanitize: {
1447 hwaddress: true,
1448 }
1449 }
1450
1451 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001452 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001453 no_libcrt: true,
1454 nocrt: true,
1455 stl: "none",
1456 system_shared_libs: [],
1457 srcs: [""],
1458 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001459 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001460
1461 sanitize: {
1462 never: true,
1463 },
Paul Duffina02cae32021-03-09 01:44:06 +00001464 } `)
1465 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001466
1467 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1468 "lib64/bionic/libc.so",
1469 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1470 })
1471
Colin Cross4c4c1be2022-02-10 11:41:18 -08001472 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001473
1474 installed := hwasan.Description("install libclang_rt.hwasan")
1475 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1476
1477 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1478 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1479 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1480}
1481
1482func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001483 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001484 prepareForTestOfRuntimeApexWithHwasan,
1485 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1486 variables.SanitizeDevice = []string{"hwaddress"}
1487 }),
1488 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001489 cc_library {
1490 name: "libc",
1491 no_libcrt: true,
1492 nocrt: true,
1493 stl: "none",
1494 system_shared_libs: [],
1495 stubs: { versions: ["1"] },
1496 apex_available: ["com.android.runtime"],
1497 }
1498
1499 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001500 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001501 no_libcrt: true,
1502 nocrt: true,
1503 stl: "none",
1504 system_shared_libs: [],
1505 srcs: [""],
1506 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001507 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001508
1509 sanitize: {
1510 never: true,
1511 },
1512 }
Paul Duffina02cae32021-03-09 01:44:06 +00001513 `)
1514 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001515
1516 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1517 "lib64/bionic/libc.so",
1518 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1519 })
1520
Colin Cross4c4c1be2022-02-10 11:41:18 -08001521 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001522
1523 installed := hwasan.Description("install libclang_rt.hwasan")
1524 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1525
1526 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1527 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1528 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1529}
1530
Jooyung Han61b66e92020-03-21 14:21:46 +00001531func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1532 testcases := []struct {
1533 name string
1534 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001535 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001536 shouldLink string
1537 shouldNotLink []string
1538 }{
1539 {
Jiyong Park55549df2021-02-26 23:57:23 +09001540 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001541 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001542 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001543 shouldLink: "current",
1544 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001545 },
1546 {
Jiyong Park55549df2021-02-26 23:57:23 +09001547 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001548 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001549 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001550 shouldLink: "current",
1551 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001552 },
1553 }
1554 for _, tc := range testcases {
1555 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001556 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001557 apex {
1558 name: "myapex",
1559 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001560 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001561 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001562 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001563 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001564
Jooyung Han61b66e92020-03-21 14:21:46 +00001565 apex_key {
1566 name: "myapex.key",
1567 public_key: "testkey.avbpubkey",
1568 private_key: "testkey.pem",
1569 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001570
Jooyung Han61b66e92020-03-21 14:21:46 +00001571 cc_library {
1572 name: "mylib",
1573 srcs: ["mylib.cpp"],
1574 vendor_available: true,
1575 shared_libs: ["libbar"],
1576 system_shared_libs: [],
1577 stl: "none",
1578 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001579 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001580 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001581
Jooyung Han61b66e92020-03-21 14:21:46 +00001582 cc_library {
1583 name: "libbar",
1584 srcs: ["mylib.cpp"],
1585 system_shared_libs: [],
1586 stl: "none",
1587 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001588 llndk: {
1589 symbol_file: "libbar.map.txt",
1590 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001591 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001592 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001593 withUnbundledBuild,
1594 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001595
Jooyung Han61b66e92020-03-21 14:21:46 +00001596 // Ensure that LLNDK dep is not included
1597 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1598 "lib64/mylib.so",
1599 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001600
Jooyung Han61b66e92020-03-21 14:21:46 +00001601 // Ensure that LLNDK dep is required
1602 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1603 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1604 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001605
Steven Moreland2c4000c2021-04-27 02:08:49 +00001606 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1607 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001608 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001609 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001610 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001611
Steven Moreland2c4000c2021-04-27 02:08:49 +00001612 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001613 ver := tc.shouldLink
1614 if tc.shouldLink == "current" {
1615 ver = strconv.Itoa(android.FutureApiLevelInt)
1616 }
1617 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001618 })
1619 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001620}
1621
Jiyong Park25fc6a92018-11-18 18:02:45 +09001622func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001623 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001624 apex {
1625 name: "myapex",
1626 key: "myapex.key",
1627 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001628 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001629 }
1630
1631 apex_key {
1632 name: "myapex.key",
1633 public_key: "testkey.avbpubkey",
1634 private_key: "testkey.pem",
1635 }
1636
1637 cc_library {
1638 name: "mylib",
1639 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001640 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001641 shared_libs: ["libdl#27"],
1642 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001643 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001644 }
1645
1646 cc_library_shared {
1647 name: "mylib_shared",
1648 srcs: ["mylib.cpp"],
1649 shared_libs: ["libdl#27"],
1650 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001651 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001652 }
1653
1654 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001655 name: "libBootstrap",
1656 srcs: ["mylib.cpp"],
1657 stl: "none",
1658 bootstrap: true,
1659 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001660 `)
1661
Sundong Ahnabb64432019-10-22 13:58:29 +09001662 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001663 copyCmds := apexRule.Args["copy_commands"]
1664
1665 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001666 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001667 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1668 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001669
1670 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001671 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001672
Colin Crossaede88c2020-08-11 12:17:01 -07001673 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1674 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1675 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001676
1677 // For dependency to libc
1678 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001679 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001680 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001681 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001682 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001683 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1684 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001685
1686 // For dependency to libm
1687 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001688 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001689 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001690 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001691 // ... and is not compiling with the stub
1692 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1693 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1694
1695 // For dependency to libdl
1696 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001697 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001698 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001699 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1700 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001701 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001702 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001703 // ... Cflags from stub is correctly exported to mylib
1704 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1705 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001706
1707 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001708 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1709 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1710 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1711 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001712}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001713
Jooyung Han749dc692020-04-15 11:03:39 +09001714func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001715 // there are three links between liba --> libz.
1716 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001717 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001718 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001719 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001720 apex {
1721 name: "myapex",
1722 key: "myapex.key",
1723 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001724 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001725 }
1726
1727 apex {
1728 name: "otherapex",
1729 key: "myapex.key",
1730 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001731 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001732 }
1733
1734 apex_key {
1735 name: "myapex.key",
1736 public_key: "testkey.avbpubkey",
1737 private_key: "testkey.pem",
1738 }
1739
1740 cc_library {
1741 name: "libx",
1742 shared_libs: ["liba"],
1743 system_shared_libs: [],
1744 stl: "none",
1745 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001746 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001747 }
1748
1749 cc_library {
1750 name: "liby",
1751 shared_libs: ["liba"],
1752 system_shared_libs: [],
1753 stl: "none",
1754 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001755 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001756 }
1757
1758 cc_library {
1759 name: "liba",
1760 shared_libs: ["libz"],
1761 system_shared_libs: [],
1762 stl: "none",
1763 apex_available: [
1764 "//apex_available:anyapex",
1765 "//apex_available:platform",
1766 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001767 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001768 }
1769
1770 cc_library {
1771 name: "libz",
1772 system_shared_libs: [],
1773 stl: "none",
1774 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001775 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001776 },
1777 }
Jooyung Han749dc692020-04-15 11:03:39 +09001778 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001779
1780 expectLink := func(from, from_variant, to, to_variant string) {
1781 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1782 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1783 }
1784 expectNoLink := func(from, from_variant, to, to_variant string) {
1785 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1786 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1787 }
1788 // platform liba is linked to non-stub version
1789 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001790 // liba in myapex is linked to current
1791 expectLink("liba", "shared_apex29", "libz", "shared_current")
1792 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001793 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001794 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001795 // liba in otherapex is linked to current
1796 expectLink("liba", "shared_apex30", "libz", "shared_current")
1797 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001798 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1799 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001800}
1801
Jooyung Hanaed150d2020-04-02 01:41:41 +09001802func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001803 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001804 apex {
1805 name: "myapex",
1806 key: "myapex.key",
1807 native_shared_libs: ["libx"],
1808 min_sdk_version: "R",
1809 }
1810
1811 apex_key {
1812 name: "myapex.key",
1813 public_key: "testkey.avbpubkey",
1814 private_key: "testkey.pem",
1815 }
1816
1817 cc_library {
1818 name: "libx",
1819 shared_libs: ["libz"],
1820 system_shared_libs: [],
1821 stl: "none",
1822 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001823 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001824 }
1825
1826 cc_library {
1827 name: "libz",
1828 system_shared_libs: [],
1829 stl: "none",
1830 stubs: {
1831 versions: ["29", "R"],
1832 },
1833 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001834 `,
1835 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1836 variables.Platform_version_active_codenames = []string{"R"}
1837 }),
1838 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001839
1840 expectLink := func(from, from_variant, to, to_variant string) {
1841 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1842 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1843 }
1844 expectNoLink := func(from, from_variant, to, to_variant string) {
1845 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1846 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1847 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001848 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1849 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001850 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1851 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001852}
1853
Jooyung Han4c4da062021-06-23 10:23:16 +09001854func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1855 testApex(t, `
1856 apex {
1857 name: "myapex",
1858 key: "myapex.key",
1859 java_libs: ["libx"],
1860 min_sdk_version: "S",
1861 }
1862
1863 apex_key {
1864 name: "myapex.key",
1865 public_key: "testkey.avbpubkey",
1866 private_key: "testkey.pem",
1867 }
1868
1869 java_library {
1870 name: "libx",
1871 srcs: ["a.java"],
1872 apex_available: [ "myapex" ],
1873 sdk_version: "current",
1874 min_sdk_version: "S", // should be okay
1875 }
1876 `,
1877 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1878 variables.Platform_version_active_codenames = []string{"S"}
1879 variables.Platform_sdk_codename = proptools.StringPtr("S")
1880 }),
1881 )
1882}
1883
Jooyung Han749dc692020-04-15 11:03:39 +09001884func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001885 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001886 apex {
1887 name: "myapex",
1888 key: "myapex.key",
1889 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001890 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001891 }
1892
1893 apex_key {
1894 name: "myapex.key",
1895 public_key: "testkey.avbpubkey",
1896 private_key: "testkey.pem",
1897 }
1898
1899 cc_library {
1900 name: "libx",
1901 shared_libs: ["libz"],
1902 system_shared_libs: [],
1903 stl: "none",
1904 apex_available: [ "myapex" ],
1905 }
1906
1907 cc_library {
1908 name: "libz",
1909 system_shared_libs: [],
1910 stl: "none",
1911 stubs: {
1912 versions: ["1", "2"],
1913 },
1914 }
1915 `)
1916
1917 expectLink := func(from, from_variant, to, to_variant string) {
1918 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1919 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1920 }
1921 expectNoLink := func(from, from_variant, to, to_variant string) {
1922 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1923 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1924 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001925 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001926 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001927 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001928 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001929}
1930
Jooyung Handfc864c2023-03-20 18:19:07 +09001931func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001932 ctx := testApex(t, `
1933 apex {
1934 name: "myapex",
1935 key: "myapex.key",
1936 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001937 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001938 vendor: true,
1939 min_sdk_version: "29",
1940 }
1941
1942 apex_key {
1943 name: "myapex.key",
1944 public_key: "testkey.avbpubkey",
1945 private_key: "testkey.pem",
1946 }
1947
1948 cc_library {
1949 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001950 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001951 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001952 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001953 shared_libs: ["libbar"],
1954 }
1955
1956 cc_library {
1957 name: "libbar",
1958 stubs: { versions: ["29", "30"] },
1959 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09001960 }
1961 `)
1962
1963 vendorVariant := "android_vendor.29_arm64_armv8-a"
1964
Jooyung Handfc864c2023-03-20 18:19:07 +09001965 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
1966
1967 // Ensure that mylib links with "current" LLNDK
1968 libFlags := names(mylib.Rule("ld").Args["libFlags"])
1969 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
1970
1971 // Ensure that mylib is targeting 29
1972 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
1973 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
1974
1975 // Ensure that the correct variant of crtbegin_so is used.
1976 crtBegin := mylib.Rule("ld").Args["crtBegin"]
1977 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09001978
1979 // Ensure that the crtbegin_so used by the APEX is targeting 29
1980 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1981 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1982}
1983
Jooyung Han4495f842023-04-25 16:39:59 +09001984func TestTrackAllowedDeps(t *testing.T) {
1985 ctx := testApex(t, `
1986 apex {
1987 name: "myapex",
1988 key: "myapex.key",
1989 updatable: true,
1990 native_shared_libs: [
1991 "mylib",
1992 "yourlib",
1993 ],
1994 min_sdk_version: "29",
1995 }
1996
1997 apex {
1998 name: "myapex2",
1999 key: "myapex.key",
2000 updatable: false,
2001 native_shared_libs: ["yourlib"],
2002 }
2003
2004 apex_key {
2005 name: "myapex.key",
2006 public_key: "testkey.avbpubkey",
2007 private_key: "testkey.pem",
2008 }
2009
2010 cc_library {
2011 name: "mylib",
2012 srcs: ["mylib.cpp"],
2013 shared_libs: ["libbar"],
2014 min_sdk_version: "29",
2015 apex_available: ["myapex"],
2016 }
2017
2018 cc_library {
2019 name: "libbar",
2020 stubs: { versions: ["29", "30"] },
2021 }
2022
2023 cc_library {
2024 name: "yourlib",
2025 srcs: ["mylib.cpp"],
2026 min_sdk_version: "29",
2027 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2028 }
2029 `, withFiles(android.MockFS{
2030 "packages/modules/common/build/allowed_deps.txt": nil,
2031 }))
2032
2033 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2034 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2035 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2036 "out/soong/.intermediates/myapex/android_common_myapex_image/depsinfo/flatlist.txt")
2037 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2038 "out/soong/.intermediates/myapex2/android_common_myapex2_image/depsinfo/flatlist.txt")
2039
2040 myapex := ctx.ModuleForTests("myapex", "android_common_myapex_image")
2041 flatlist := strings.Split(myapex.Output("depsinfo/flatlist.txt").BuildParams.Args["content"], "\\n")
2042 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2043 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2044 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2045 flatlist, "mylib:(minSdkVersion:29)")
2046 android.AssertStringListContains(t, "track platform-available lib",
2047 flatlist, "yourlib(minSdkVersion:29)")
2048}
2049
2050func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2051 ctx := testApex(t, `
2052 apex {
2053 name: "myapex",
2054 key: "myapex.key",
2055 updatable: true,
2056 min_sdk_version: "29",
2057 }
2058
2059 apex_key {
2060 name: "myapex.key",
2061 public_key: "testkey.avbpubkey",
2062 private_key: "testkey.pem",
2063 }
2064 `)
2065 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2066 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2067 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2068 }
2069}
2070
Jooyung Han03b51852020-02-26 22:45:42 +09002071func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002072 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002073 apex {
2074 name: "myapex",
2075 key: "myapex.key",
2076 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002077 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002078 }
2079
2080 apex_key {
2081 name: "myapex.key",
2082 public_key: "testkey.avbpubkey",
2083 private_key: "testkey.pem",
2084 }
2085
2086 cc_library {
2087 name: "libx",
2088 system_shared_libs: [],
2089 stl: "none",
2090 apex_available: [ "myapex" ],
2091 stubs: {
2092 versions: ["1", "2"],
2093 },
2094 }
2095
2096 cc_library {
2097 name: "libz",
2098 shared_libs: ["libx"],
2099 system_shared_libs: [],
2100 stl: "none",
2101 }
2102 `)
2103
2104 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002105 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002106 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2107 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2108 }
2109 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002110 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002111 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2112 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2113 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002114 expectLink("libz", "shared", "libx", "shared_current")
2115 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002116 expectNoLink("libz", "shared", "libz", "shared_1")
2117 expectNoLink("libz", "shared", "libz", "shared")
2118}
2119
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002120var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2121 func(variables android.FixtureProductVariables) {
2122 variables.SanitizeDevice = []string{"hwaddress"}
2123 },
2124)
2125
Jooyung Han75568392020-03-20 04:29:24 +09002126func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002127 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002128 apex {
2129 name: "myapex",
2130 key: "myapex.key",
2131 native_shared_libs: ["libx"],
2132 min_sdk_version: "29",
2133 }
2134
2135 apex_key {
2136 name: "myapex.key",
2137 public_key: "testkey.avbpubkey",
2138 private_key: "testkey.pem",
2139 }
2140
2141 cc_library {
2142 name: "libx",
2143 shared_libs: ["libbar"],
2144 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002145 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002146 }
2147
2148 cc_library {
2149 name: "libbar",
2150 stubs: {
2151 versions: ["29", "30"],
2152 },
2153 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002154 `,
2155 prepareForTestWithSantitizeHwaddress,
2156 )
Jooyung Han03b51852020-02-26 22:45:42 +09002157 expectLink := func(from, from_variant, to, to_variant string) {
2158 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2159 libFlags := ld.Args["libFlags"]
2160 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2161 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002162 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002163}
2164
Jooyung Han75568392020-03-20 04:29:24 +09002165func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002166 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002167 apex {
2168 name: "myapex",
2169 key: "myapex.key",
2170 native_shared_libs: ["libx"],
2171 min_sdk_version: "29",
2172 }
2173
2174 apex_key {
2175 name: "myapex.key",
2176 public_key: "testkey.avbpubkey",
2177 private_key: "testkey.pem",
2178 }
2179
2180 cc_library {
2181 name: "libx",
2182 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002183 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002184 }
Jooyung Han75568392020-03-20 04:29:24 +09002185 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002186
2187 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002188 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002189 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002190 // note that platform variant is not.
2191 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002192 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002193}
2194
Jooyung Han749dc692020-04-15 11:03:39 +09002195func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2196 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002197 apex {
2198 name: "myapex",
2199 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002200 native_shared_libs: ["mylib"],
2201 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002202 }
2203
2204 apex_key {
2205 name: "myapex.key",
2206 public_key: "testkey.avbpubkey",
2207 private_key: "testkey.pem",
2208 }
Jooyung Han749dc692020-04-15 11:03:39 +09002209
2210 cc_library {
2211 name: "mylib",
2212 srcs: ["mylib.cpp"],
2213 system_shared_libs: [],
2214 stl: "none",
2215 apex_available: [
2216 "myapex",
2217 ],
2218 min_sdk_version: "30",
2219 }
2220 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002221
2222 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2223 apex {
2224 name: "myapex",
2225 key: "myapex.key",
2226 native_shared_libs: ["libfoo.ffi"],
2227 min_sdk_version: "29",
2228 }
2229
2230 apex_key {
2231 name: "myapex.key",
2232 public_key: "testkey.avbpubkey",
2233 private_key: "testkey.pem",
2234 }
2235
2236 rust_ffi_shared {
2237 name: "libfoo.ffi",
2238 srcs: ["foo.rs"],
2239 crate_name: "foo",
2240 apex_available: [
2241 "myapex",
2242 ],
2243 min_sdk_version: "30",
2244 }
2245 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002246
2247 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2248 apex {
2249 name: "myapex",
2250 key: "myapex.key",
2251 java_libs: ["libfoo"],
2252 min_sdk_version: "29",
2253 }
2254
2255 apex_key {
2256 name: "myapex.key",
2257 public_key: "testkey.avbpubkey",
2258 private_key: "testkey.pem",
2259 }
2260
2261 java_import {
2262 name: "libfoo",
2263 jars: ["libfoo.jar"],
2264 apex_available: [
2265 "myapex",
2266 ],
2267 min_sdk_version: "30",
2268 }
2269 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002270
2271 // Skip check for modules compiling against core API surface
2272 testApex(t, `
2273 apex {
2274 name: "myapex",
2275 key: "myapex.key",
2276 java_libs: ["libfoo"],
2277 min_sdk_version: "29",
2278 }
2279
2280 apex_key {
2281 name: "myapex.key",
2282 public_key: "testkey.avbpubkey",
2283 private_key: "testkey.pem",
2284 }
2285
2286 java_library {
2287 name: "libfoo",
2288 srcs: ["Foo.java"],
2289 apex_available: [
2290 "myapex",
2291 ],
2292 // Compile against core API surface
2293 sdk_version: "core_current",
2294 min_sdk_version: "30",
2295 }
2296 `)
2297
Jooyung Han749dc692020-04-15 11:03:39 +09002298}
2299
2300func TestApexMinSdkVersion_Okay(t *testing.T) {
2301 testApex(t, `
2302 apex {
2303 name: "myapex",
2304 key: "myapex.key",
2305 native_shared_libs: ["libfoo"],
2306 java_libs: ["libbar"],
2307 min_sdk_version: "29",
2308 }
2309
2310 apex_key {
2311 name: "myapex.key",
2312 public_key: "testkey.avbpubkey",
2313 private_key: "testkey.pem",
2314 }
2315
2316 cc_library {
2317 name: "libfoo",
2318 srcs: ["mylib.cpp"],
2319 shared_libs: ["libfoo_dep"],
2320 apex_available: ["myapex"],
2321 min_sdk_version: "29",
2322 }
2323
2324 cc_library {
2325 name: "libfoo_dep",
2326 srcs: ["mylib.cpp"],
2327 apex_available: ["myapex"],
2328 min_sdk_version: "29",
2329 }
2330
2331 java_library {
2332 name: "libbar",
2333 sdk_version: "current",
2334 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002335 static_libs: [
2336 "libbar_dep",
2337 "libbar_import_dep",
2338 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002339 apex_available: ["myapex"],
2340 min_sdk_version: "29",
2341 }
2342
2343 java_library {
2344 name: "libbar_dep",
2345 sdk_version: "current",
2346 srcs: ["a.java"],
2347 apex_available: ["myapex"],
2348 min_sdk_version: "29",
2349 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002350
2351 java_import {
2352 name: "libbar_import_dep",
2353 jars: ["libbar.jar"],
2354 apex_available: ["myapex"],
2355 min_sdk_version: "29",
2356 }
Jooyung Han03b51852020-02-26 22:45:42 +09002357 `)
2358}
2359
Colin Cross8ca61c12022-10-06 21:00:14 -07002360func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2361 // Tests that an apex dependency with min_sdk_version higher than the
2362 // min_sdk_version of the apex is allowed as long as the dependency's
2363 // min_sdk_version is less than or equal to the api level that the
2364 // architecture was introduced in. In this case, arm64 didn't exist
2365 // until api level 21, so the arm64 code will never need to run on
2366 // an api level 20 device, even if other architectures of the apex
2367 // will.
2368 testApex(t, `
2369 apex {
2370 name: "myapex",
2371 key: "myapex.key",
2372 native_shared_libs: ["libfoo"],
2373 min_sdk_version: "20",
2374 }
2375
2376 apex_key {
2377 name: "myapex.key",
2378 public_key: "testkey.avbpubkey",
2379 private_key: "testkey.pem",
2380 }
2381
2382 cc_library {
2383 name: "libfoo",
2384 srcs: ["mylib.cpp"],
2385 apex_available: ["myapex"],
2386 min_sdk_version: "21",
2387 stl: "none",
2388 }
2389 `)
2390}
2391
Artur Satayev8cf899a2020-04-15 17:29:42 +01002392func TestJavaStableSdkVersion(t *testing.T) {
2393 testCases := []struct {
2394 name string
2395 expectedError string
2396 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002397 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002398 }{
2399 {
2400 name: "Non-updatable apex with non-stable dep",
2401 bp: `
2402 apex {
2403 name: "myapex",
2404 java_libs: ["myjar"],
2405 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002406 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002407 }
2408 apex_key {
2409 name: "myapex.key",
2410 public_key: "testkey.avbpubkey",
2411 private_key: "testkey.pem",
2412 }
2413 java_library {
2414 name: "myjar",
2415 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002416 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002417 apex_available: ["myapex"],
2418 }
2419 `,
2420 },
2421 {
2422 name: "Updatable apex with stable dep",
2423 bp: `
2424 apex {
2425 name: "myapex",
2426 java_libs: ["myjar"],
2427 key: "myapex.key",
2428 updatable: true,
2429 min_sdk_version: "29",
2430 }
2431 apex_key {
2432 name: "myapex.key",
2433 public_key: "testkey.avbpubkey",
2434 private_key: "testkey.pem",
2435 }
2436 java_library {
2437 name: "myjar",
2438 srcs: ["foo/bar/MyClass.java"],
2439 sdk_version: "current",
2440 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002441 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002442 }
2443 `,
2444 },
2445 {
2446 name: "Updatable apex with non-stable dep",
2447 expectedError: "cannot depend on \"myjar\"",
2448 bp: `
2449 apex {
2450 name: "myapex",
2451 java_libs: ["myjar"],
2452 key: "myapex.key",
2453 updatable: true,
2454 }
2455 apex_key {
2456 name: "myapex.key",
2457 public_key: "testkey.avbpubkey",
2458 private_key: "testkey.pem",
2459 }
2460 java_library {
2461 name: "myjar",
2462 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002463 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002464 apex_available: ["myapex"],
2465 }
2466 `,
2467 },
2468 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002469 name: "Updatable apex with non-stable legacy core platform dep",
2470 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2471 bp: `
2472 apex {
2473 name: "myapex",
2474 java_libs: ["myjar-uses-legacy"],
2475 key: "myapex.key",
2476 updatable: true,
2477 }
2478 apex_key {
2479 name: "myapex.key",
2480 public_key: "testkey.avbpubkey",
2481 private_key: "testkey.pem",
2482 }
2483 java_library {
2484 name: "myjar-uses-legacy",
2485 srcs: ["foo/bar/MyClass.java"],
2486 sdk_version: "core_platform",
2487 apex_available: ["myapex"],
2488 }
2489 `,
2490 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2491 },
2492 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002493 name: "Updatable apex with non-stable transitive dep",
2494 // This is not actually detecting that the transitive dependency is unstable, rather it is
2495 // detecting that the transitive dependency is building against a wider API surface than the
2496 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002497 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002498 bp: `
2499 apex {
2500 name: "myapex",
2501 java_libs: ["myjar"],
2502 key: "myapex.key",
2503 updatable: true,
2504 }
2505 apex_key {
2506 name: "myapex.key",
2507 public_key: "testkey.avbpubkey",
2508 private_key: "testkey.pem",
2509 }
2510 java_library {
2511 name: "myjar",
2512 srcs: ["foo/bar/MyClass.java"],
2513 sdk_version: "current",
2514 apex_available: ["myapex"],
2515 static_libs: ["transitive-jar"],
2516 }
2517 java_library {
2518 name: "transitive-jar",
2519 srcs: ["foo/bar/MyClass.java"],
2520 sdk_version: "core_platform",
2521 apex_available: ["myapex"],
2522 }
2523 `,
2524 },
2525 }
2526
2527 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002528 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2529 continue
2530 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002531 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002532 errorHandler := android.FixtureExpectsNoErrors
2533 if test.expectedError != "" {
2534 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002535 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002536 android.GroupFixturePreparers(
2537 java.PrepareForTestWithJavaDefaultModules,
2538 PrepareForTestWithApexBuildComponents,
2539 prepareForTestWithMyapex,
2540 android.OptionalFixturePreparer(test.preparer),
2541 ).
2542 ExtendWithErrorHandler(errorHandler).
2543 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002544 })
2545 }
2546}
2547
Jooyung Han749dc692020-04-15 11:03:39 +09002548func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2549 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2550 apex {
2551 name: "myapex",
2552 key: "myapex.key",
2553 native_shared_libs: ["mylib"],
2554 min_sdk_version: "29",
2555 }
2556
2557 apex_key {
2558 name: "myapex.key",
2559 public_key: "testkey.avbpubkey",
2560 private_key: "testkey.pem",
2561 }
2562
2563 cc_library {
2564 name: "mylib",
2565 srcs: ["mylib.cpp"],
2566 shared_libs: ["mylib2"],
2567 system_shared_libs: [],
2568 stl: "none",
2569 apex_available: [
2570 "myapex",
2571 ],
2572 min_sdk_version: "29",
2573 }
2574
2575 // indirect part of the apex
2576 cc_library {
2577 name: "mylib2",
2578 srcs: ["mylib.cpp"],
2579 system_shared_libs: [],
2580 stl: "none",
2581 apex_available: [
2582 "myapex",
2583 ],
2584 min_sdk_version: "30",
2585 }
2586 `)
2587}
2588
2589func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2590 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2591 apex {
2592 name: "myapex",
2593 key: "myapex.key",
2594 apps: ["AppFoo"],
2595 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002596 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002597 }
2598
2599 apex_key {
2600 name: "myapex.key",
2601 public_key: "testkey.avbpubkey",
2602 private_key: "testkey.pem",
2603 }
2604
2605 android_app {
2606 name: "AppFoo",
2607 srcs: ["foo/bar/MyClass.java"],
2608 sdk_version: "current",
2609 min_sdk_version: "29",
2610 system_modules: "none",
2611 stl: "none",
2612 static_libs: ["bar"],
2613 apex_available: [ "myapex" ],
2614 }
2615
2616 java_library {
2617 name: "bar",
2618 sdk_version: "current",
2619 srcs: ["a.java"],
2620 apex_available: [ "myapex" ],
2621 }
2622 `)
2623}
2624
2625func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002626 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002627 apex {
2628 name: "myapex",
2629 key: "myapex.key",
2630 native_shared_libs: ["mylib"],
2631 min_sdk_version: "29",
2632 }
2633
2634 apex_key {
2635 name: "myapex.key",
2636 public_key: "testkey.avbpubkey",
2637 private_key: "testkey.pem",
2638 }
2639
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002640 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002641 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2642 cc_library {
2643 name: "mylib",
2644 srcs: ["mylib.cpp"],
2645 shared_libs: ["mylib2"],
2646 system_shared_libs: [],
2647 stl: "none",
2648 apex_available: ["myapex", "otherapex"],
2649 min_sdk_version: "29",
2650 }
2651
2652 cc_library {
2653 name: "mylib2",
2654 srcs: ["mylib.cpp"],
2655 system_shared_libs: [],
2656 stl: "none",
2657 apex_available: ["otherapex"],
2658 stubs: { versions: ["29", "30"] },
2659 min_sdk_version: "30",
2660 }
2661
2662 apex {
2663 name: "otherapex",
2664 key: "myapex.key",
2665 native_shared_libs: ["mylib", "mylib2"],
2666 min_sdk_version: "30",
2667 }
2668 `)
2669 expectLink := func(from, from_variant, to, to_variant string) {
2670 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2671 libFlags := ld.Args["libFlags"]
2672 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2673 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002674 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002675 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002676}
2677
Jooyung Haned124c32021-01-26 11:43:46 +09002678func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002679 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2680 func(variables android.FixtureProductVariables) {
2681 variables.Platform_sdk_codename = proptools.StringPtr("S")
2682 variables.Platform_version_active_codenames = []string{"S"}
2683 },
2684 )
Jooyung Haned124c32021-01-26 11:43:46 +09002685 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2686 apex {
2687 name: "myapex",
2688 key: "myapex.key",
2689 native_shared_libs: ["libfoo"],
2690 min_sdk_version: "S",
2691 }
2692 apex_key {
2693 name: "myapex.key",
2694 public_key: "testkey.avbpubkey",
2695 private_key: "testkey.pem",
2696 }
2697 cc_library {
2698 name: "libfoo",
2699 shared_libs: ["libbar"],
2700 apex_available: ["myapex"],
2701 min_sdk_version: "29",
2702 }
2703 cc_library {
2704 name: "libbar",
2705 apex_available: ["myapex"],
2706 }
2707 `, withSAsActiveCodeNames)
2708}
2709
2710func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002711 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2712 variables.Platform_sdk_codename = proptools.StringPtr("S")
2713 variables.Platform_version_active_codenames = []string{"S", "T"}
2714 })
Colin Cross1c460562021-02-16 17:55:47 -08002715 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002716 apex {
2717 name: "myapex",
2718 key: "myapex.key",
2719 native_shared_libs: ["libfoo"],
2720 min_sdk_version: "S",
2721 }
2722 apex_key {
2723 name: "myapex.key",
2724 public_key: "testkey.avbpubkey",
2725 private_key: "testkey.pem",
2726 }
2727 cc_library {
2728 name: "libfoo",
2729 shared_libs: ["libbar"],
2730 apex_available: ["myapex"],
2731 min_sdk_version: "S",
2732 }
2733 cc_library {
2734 name: "libbar",
2735 stubs: {
2736 symbol_file: "libbar.map.txt",
2737 versions: ["30", "S", "T"],
2738 },
2739 }
2740 `, withSAsActiveCodeNames)
2741
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002742 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002743 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2744 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002745 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002746}
2747
Jiyong Park7c2ee712018-12-07 00:42:25 +09002748func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002749 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002750 apex {
2751 name: "myapex",
2752 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002753 native_shared_libs: ["mylib"],
2754 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002755 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002756 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002757 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002758 }
2759
2760 apex_key {
2761 name: "myapex.key",
2762 public_key: "testkey.avbpubkey",
2763 private_key: "testkey.pem",
2764 }
2765
2766 prebuilt_etc {
2767 name: "myetc",
2768 src: "myprebuilt",
2769 sub_dir: "foo/bar",
2770 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002771
2772 cc_library {
2773 name: "mylib",
2774 srcs: ["mylib.cpp"],
2775 relative_install_path: "foo/bar",
2776 system_shared_libs: [],
2777 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002778 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002779 }
2780
2781 cc_binary {
2782 name: "mybin",
2783 srcs: ["mylib.cpp"],
2784 relative_install_path: "foo/bar",
2785 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002786 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002787 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002788 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002789 `)
2790
Sundong Ahnabb64432019-10-22 13:58:29 +09002791 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002792 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002793
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002794 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002795 ensureContains(t, cmd, "/etc ")
2796 ensureContains(t, cmd, "/etc/foo ")
2797 ensureContains(t, cmd, "/etc/foo/bar ")
2798 ensureContains(t, cmd, "/lib64 ")
2799 ensureContains(t, cmd, "/lib64/foo ")
2800 ensureContains(t, cmd, "/lib64/foo/bar ")
2801 ensureContains(t, cmd, "/lib ")
2802 ensureContains(t, cmd, "/lib/foo ")
2803 ensureContains(t, cmd, "/lib/foo/bar ")
2804 ensureContains(t, cmd, "/bin ")
2805 ensureContains(t, cmd, "/bin/foo ")
2806 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002807}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002808
Jooyung Han35155c42020-02-06 17:33:20 +09002809func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002810 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002811 apex {
2812 name: "myapex",
2813 key: "myapex.key",
2814 multilib: {
2815 both: {
2816 native_shared_libs: ["mylib"],
2817 binaries: ["mybin"],
2818 },
2819 },
2820 compile_multilib: "both",
2821 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002822 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002823 }
2824
2825 apex_key {
2826 name: "myapex.key",
2827 public_key: "testkey.avbpubkey",
2828 private_key: "testkey.pem",
2829 }
2830
2831 cc_library {
2832 name: "mylib",
2833 relative_install_path: "foo/bar",
2834 system_shared_libs: [],
2835 stl: "none",
2836 apex_available: [ "myapex" ],
2837 native_bridge_supported: true,
2838 }
2839
2840 cc_binary {
2841 name: "mybin",
2842 relative_install_path: "foo/bar",
2843 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002844 stl: "none",
2845 apex_available: [ "myapex" ],
2846 native_bridge_supported: true,
2847 compile_multilib: "both", // default is "first" for binary
2848 multilib: {
2849 lib64: {
2850 suffix: "64",
2851 },
2852 },
2853 }
2854 `, withNativeBridgeEnabled)
2855 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2856 "bin/foo/bar/mybin",
2857 "bin/foo/bar/mybin64",
2858 "bin/arm/foo/bar/mybin",
2859 "bin/arm64/foo/bar/mybin64",
2860 "lib/foo/bar/mylib.so",
2861 "lib/arm/foo/bar/mylib.so",
2862 "lib64/foo/bar/mylib.so",
2863 "lib64/arm64/foo/bar/mylib.so",
2864 })
2865}
2866
Jooyung Han85d61762020-06-24 23:50:26 +09002867func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002868 result := android.GroupFixturePreparers(
2869 prepareForApexTest,
2870 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2871 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002872 apex {
2873 name: "myapex",
2874 key: "myapex.key",
2875 binaries: ["mybin"],
2876 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002877 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002878 }
2879 apex_key {
2880 name: "myapex.key",
2881 public_key: "testkey.avbpubkey",
2882 private_key: "testkey.pem",
2883 }
2884 cc_binary {
2885 name: "mybin",
2886 vendor: true,
2887 shared_libs: ["libfoo"],
2888 }
2889 cc_library {
2890 name: "libfoo",
2891 proprietary: true,
2892 }
2893 `)
2894
Colin Crossc68db4b2021-11-11 18:59:15 -08002895 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002896 "bin/mybin",
2897 "lib64/libfoo.so",
2898 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2899 "lib64/libc++.so",
2900 })
2901
Colin Crossc68db4b2021-11-11 18:59:15 -08002902 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2903 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002904 name := apexBundle.BaseModuleName()
2905 prefix := "TARGET_"
2906 var builder strings.Builder
2907 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002908 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002909 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002910 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002911
Colin Crossc68db4b2021-11-11 18:59:15 -08002912 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002913 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2914 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002915}
2916
Jooyung Hanc5a96762022-02-04 11:54:50 +09002917func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2918 testApexError(t, `Trying to include a VNDK library`, `
2919 apex {
2920 name: "myapex",
2921 key: "myapex.key",
2922 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2923 vendor: true,
2924 use_vndk_as_stable: true,
2925 updatable: false,
2926 }
2927 apex_key {
2928 name: "myapex.key",
2929 public_key: "testkey.avbpubkey",
2930 private_key: "testkey.pem",
2931 }`)
2932}
2933
Jooyung Handf78e212020-07-22 15:54:47 +09002934func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002935 // myapex myapex2
2936 // | |
2937 // mybin ------. mybin2
2938 // \ \ / |
2939 // (stable) .---\--------` |
2940 // \ / \ |
2941 // \ / \ /
2942 // libvndk libvendor
2943 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002944 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002945 apex {
2946 name: "myapex",
2947 key: "myapex.key",
2948 binaries: ["mybin"],
2949 vendor: true,
2950 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002951 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002952 }
2953 apex_key {
2954 name: "myapex.key",
2955 public_key: "testkey.avbpubkey",
2956 private_key: "testkey.pem",
2957 }
2958 cc_binary {
2959 name: "mybin",
2960 vendor: true,
2961 shared_libs: ["libvndk", "libvendor"],
2962 }
2963 cc_library {
2964 name: "libvndk",
2965 vndk: {
2966 enabled: true,
2967 },
2968 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002969 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002970 }
2971 cc_library {
2972 name: "libvendor",
2973 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002974 stl: "none",
2975 }
2976 apex {
2977 name: "myapex2",
2978 key: "myapex.key",
2979 binaries: ["mybin2"],
2980 vendor: true,
2981 use_vndk_as_stable: false,
2982 updatable: false,
2983 }
2984 cc_binary {
2985 name: "mybin2",
2986 vendor: true,
2987 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002988 }
2989 `)
2990
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002991 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002992
Jooyung Han91f92032022-02-04 12:36:33 +09002993 for _, tc := range []struct {
2994 name string
2995 apexName string
2996 moduleName string
2997 moduleVariant string
2998 libs []string
2999 contents []string
3000 requireVndkNamespace bool
3001 }{
3002 {
3003 name: "use_vndk_as_stable",
3004 apexName: "myapex",
3005 moduleName: "mybin",
3006 moduleVariant: vendorVariant + "_apex10000",
3007 libs: []string{
3008 // should link with vendor variants of VNDK libs(libvndk/libc++)
3009 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3010 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3011 // unstable Vendor libs as APEX variant
3012 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3013 },
3014 contents: []string{
3015 "bin/mybin",
3016 "lib64/libvendor.so",
3017 // VNDK libs (libvndk/libc++) are not included
3018 },
3019 requireVndkNamespace: true,
3020 },
3021 {
3022 name: "!use_vndk_as_stable",
3023 apexName: "myapex2",
3024 moduleName: "mybin2",
3025 moduleVariant: vendorVariant + "_myapex2",
3026 libs: []string{
3027 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3028 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3029 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3030 // unstable vendor libs have "merged" APEX variants
3031 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3032 },
3033 contents: []string{
3034 "bin/mybin2",
3035 "lib64/libvendor.so",
3036 // VNDK libs are included as well
3037 "lib64/libvndk.so",
3038 "lib64/libc++.so",
3039 },
3040 requireVndkNamespace: false,
3041 },
3042 } {
3043 t.Run(tc.name, func(t *testing.T) {
3044 // Check linked libs
3045 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3046 libs := names(ldRule.Args["libFlags"])
3047 for _, lib := range tc.libs {
3048 ensureListContains(t, libs, lib)
3049 }
3050 // Check apex contents
3051 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003052
Jooyung Han91f92032022-02-04 12:36:33 +09003053 // Check "requireNativeLibs"
3054 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
3055 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3056 if tc.requireVndkNamespace {
3057 ensureListContains(t, requireNativeLibs, ":vndk")
3058 } else {
3059 ensureListNotContains(t, requireNativeLibs, ":vndk")
3060 }
3061 })
3062 }
Jooyung Handf78e212020-07-22 15:54:47 +09003063}
3064
Justin Yun13decfb2021-03-08 19:25:55 +09003065func TestProductVariant(t *testing.T) {
3066 ctx := testApex(t, `
3067 apex {
3068 name: "myapex",
3069 key: "myapex.key",
3070 updatable: false,
3071 product_specific: true,
3072 binaries: ["foo"],
3073 }
3074
3075 apex_key {
3076 name: "myapex.key",
3077 public_key: "testkey.avbpubkey",
3078 private_key: "testkey.pem",
3079 }
3080
3081 cc_binary {
3082 name: "foo",
3083 product_available: true,
3084 apex_available: ["myapex"],
3085 srcs: ["foo.cpp"],
3086 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003087 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3088 variables.ProductVndkVersion = proptools.StringPtr("current")
3089 }),
3090 )
Justin Yun13decfb2021-03-08 19:25:55 +09003091
3092 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003093 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003094 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3095 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3096 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3097 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3098}
3099
Jooyung Han8e5685d2020-09-21 11:02:57 +09003100func TestApex_withPrebuiltFirmware(t *testing.T) {
3101 testCases := []struct {
3102 name string
3103 additionalProp string
3104 }{
3105 {"system apex with prebuilt_firmware", ""},
3106 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3107 }
3108 for _, tc := range testCases {
3109 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003110 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003111 apex {
3112 name: "myapex",
3113 key: "myapex.key",
3114 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003115 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003116 `+tc.additionalProp+`
3117 }
3118 apex_key {
3119 name: "myapex.key",
3120 public_key: "testkey.avbpubkey",
3121 private_key: "testkey.pem",
3122 }
3123 prebuilt_firmware {
3124 name: "myfirmware",
3125 src: "myfirmware.bin",
3126 filename_from_src: true,
3127 `+tc.additionalProp+`
3128 }
3129 `)
3130 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3131 "etc/firmware/myfirmware.bin",
3132 })
3133 })
3134 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003135}
3136
Jooyung Hanefb184e2020-06-25 17:14:25 +09003137func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003138 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003139 apex {
3140 name: "myapex",
3141 key: "myapex.key",
3142 vendor: true,
3143 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003144 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003145 }
3146
3147 apex_key {
3148 name: "myapex.key",
3149 public_key: "testkey.avbpubkey",
3150 private_key: "testkey.pem",
3151 }
3152
3153 cc_library {
3154 name: "mylib",
3155 vendor_available: true,
3156 }
3157 `)
3158
3159 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003160 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003161 name := apexBundle.BaseModuleName()
3162 prefix := "TARGET_"
3163 var builder strings.Builder
3164 data.Custom(&builder, name, prefix, "", data)
3165 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00003166 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003167}
3168
Jooyung Han2ed99d02020-06-24 23:26:26 +09003169func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003170 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003171 apex {
3172 name: "myapex",
3173 key: "myapex.key",
3174 vintf_fragments: ["fragment.xml"],
3175 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003176 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003177 }
3178 apex_key {
3179 name: "myapex.key",
3180 public_key: "testkey.avbpubkey",
3181 private_key: "testkey.pem",
3182 }
3183 cc_binary {
3184 name: "mybin",
3185 }
3186 `)
3187
3188 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003189 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003190 name := apexBundle.BaseModuleName()
3191 prefix := "TARGET_"
3192 var builder strings.Builder
3193 data.Custom(&builder, name, prefix, "", data)
3194 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003195 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003196 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003197}
3198
Jiyong Park16e91a02018-12-20 18:18:08 +09003199func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003200 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003201 apex {
3202 name: "myapex",
3203 key: "myapex.key",
3204 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003205 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003206 }
3207
3208 apex_key {
3209 name: "myapex.key",
3210 public_key: "testkey.avbpubkey",
3211 private_key: "testkey.pem",
3212 }
3213
3214 cc_library {
3215 name: "mylib",
3216 srcs: ["mylib.cpp"],
3217 system_shared_libs: [],
3218 stl: "none",
3219 stubs: {
3220 versions: ["1", "2", "3"],
3221 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003222 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003223 }
3224
3225 cc_binary {
3226 name: "not_in_apex",
3227 srcs: ["mylib.cpp"],
3228 static_libs: ["mylib"],
3229 static_executable: true,
3230 system_shared_libs: [],
3231 stl: "none",
3232 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003233 `)
3234
Colin Cross7113d202019-11-20 16:39:12 -08003235 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003236
3237 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003238 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003239}
Jiyong Park9335a262018-12-24 11:31:58 +09003240
3241func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003242 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003243 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003244 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003245 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003246 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003247 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003248 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003249 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003250 }
3251
3252 cc_library {
3253 name: "mylib",
3254 srcs: ["mylib.cpp"],
3255 system_shared_libs: [],
3256 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003257 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003258 }
3259
3260 apex_key {
3261 name: "myapex.key",
3262 public_key: "testkey.avbpubkey",
3263 private_key: "testkey.pem",
3264 }
3265
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003266 android_app_certificate {
3267 name: "myapex.certificate",
3268 certificate: "testkey",
3269 }
3270
3271 android_app_certificate {
3272 name: "myapex.certificate.override",
3273 certificate: "testkey.override",
3274 }
3275
Jiyong Park9335a262018-12-24 11:31:58 +09003276 `)
3277
3278 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003279 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003280
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003281 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3282 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003283 "vendor/foo/devkeys/testkey.avbpubkey")
3284 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003285 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3286 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003287 "vendor/foo/devkeys/testkey.pem")
3288 }
3289
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003290 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003291 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003292 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003293 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003294 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003295 }
3296}
Jiyong Park58e364a2019-01-19 19:24:06 +09003297
Jooyung Hanf121a652019-12-17 14:30:11 +09003298func TestCertificate(t *testing.T) {
3299 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003300 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003301 apex {
3302 name: "myapex",
3303 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003304 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003305 }
3306 apex_key {
3307 name: "myapex.key",
3308 public_key: "testkey.avbpubkey",
3309 private_key: "testkey.pem",
3310 }`)
3311 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3312 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3313 if actual := rule.Args["certificates"]; actual != expected {
3314 t.Errorf("certificates should be %q, not %q", expected, actual)
3315 }
3316 })
3317 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003318 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003319 apex {
3320 name: "myapex_keytest",
3321 key: "myapex.key",
3322 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003323 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003324 }
3325 apex_key {
3326 name: "myapex.key",
3327 public_key: "testkey.avbpubkey",
3328 private_key: "testkey.pem",
3329 }
3330 android_app_certificate {
3331 name: "myapex.certificate.override",
3332 certificate: "testkey.override",
3333 }`)
3334 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3335 expected := "testkey.override.x509.pem testkey.override.pk8"
3336 if actual := rule.Args["certificates"]; actual != expected {
3337 t.Errorf("certificates should be %q, not %q", expected, actual)
3338 }
3339 })
3340 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003341 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003342 apex {
3343 name: "myapex",
3344 key: "myapex.key",
3345 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003346 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003347 }
3348 apex_key {
3349 name: "myapex.key",
3350 public_key: "testkey.avbpubkey",
3351 private_key: "testkey.pem",
3352 }
3353 android_app_certificate {
3354 name: "myapex.certificate",
3355 certificate: "testkey",
3356 }`)
3357 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3358 expected := "testkey.x509.pem testkey.pk8"
3359 if actual := rule.Args["certificates"]; actual != expected {
3360 t.Errorf("certificates should be %q, not %q", expected, actual)
3361 }
3362 })
3363 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003364 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003365 apex {
3366 name: "myapex_keytest",
3367 key: "myapex.key",
3368 file_contexts: ":myapex-file_contexts",
3369 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003370 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003371 }
3372 apex_key {
3373 name: "myapex.key",
3374 public_key: "testkey.avbpubkey",
3375 private_key: "testkey.pem",
3376 }
3377 android_app_certificate {
3378 name: "myapex.certificate.override",
3379 certificate: "testkey.override",
3380 }`)
3381 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3382 expected := "testkey.override.x509.pem testkey.override.pk8"
3383 if actual := rule.Args["certificates"]; actual != expected {
3384 t.Errorf("certificates should be %q, not %q", expected, actual)
3385 }
3386 })
3387 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003388 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003389 apex {
3390 name: "myapex",
3391 key: "myapex.key",
3392 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003393 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003394 }
3395 apex_key {
3396 name: "myapex.key",
3397 public_key: "testkey.avbpubkey",
3398 private_key: "testkey.pem",
3399 }`)
3400 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3401 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3402 if actual := rule.Args["certificates"]; actual != expected {
3403 t.Errorf("certificates should be %q, not %q", expected, actual)
3404 }
3405 })
3406 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003407 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003408 apex {
3409 name: "myapex_keytest",
3410 key: "myapex.key",
3411 file_contexts: ":myapex-file_contexts",
3412 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003413 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003414 }
3415 apex_key {
3416 name: "myapex.key",
3417 public_key: "testkey.avbpubkey",
3418 private_key: "testkey.pem",
3419 }
3420 android_app_certificate {
3421 name: "myapex.certificate.override",
3422 certificate: "testkey.override",
3423 }`)
3424 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3425 expected := "testkey.override.x509.pem testkey.override.pk8"
3426 if actual := rule.Args["certificates"]; actual != expected {
3427 t.Errorf("certificates should be %q, not %q", expected, actual)
3428 }
3429 })
3430}
3431
Jiyong Park58e364a2019-01-19 19:24:06 +09003432func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003433 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003434 apex {
3435 name: "myapex",
3436 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003437 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003438 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003439 }
3440
3441 apex {
3442 name: "otherapex",
3443 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003444 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003445 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003446 }
3447
3448 apex_key {
3449 name: "myapex.key",
3450 public_key: "testkey.avbpubkey",
3451 private_key: "testkey.pem",
3452 }
3453
3454 cc_library {
3455 name: "mylib",
3456 srcs: ["mylib.cpp"],
3457 system_shared_libs: [],
3458 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003459 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003460 "myapex",
3461 "otherapex",
3462 ],
Jooyung Han24282772020-03-21 23:20:55 +09003463 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003464 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003465 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003466 cc_library {
3467 name: "mylib2",
3468 srcs: ["mylib.cpp"],
3469 system_shared_libs: [],
3470 stl: "none",
3471 apex_available: [
3472 "myapex",
3473 "otherapex",
3474 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003475 static_libs: ["mylib3"],
3476 recovery_available: true,
3477 min_sdk_version: "29",
3478 }
3479 cc_library {
3480 name: "mylib3",
3481 srcs: ["mylib.cpp"],
3482 system_shared_libs: [],
3483 stl: "none",
3484 apex_available: [
3485 "myapex",
3486 "otherapex",
3487 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003488 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003489 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003490 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003491 `)
3492
Jooyung Hanc87a0592020-03-02 17:44:33 +09003493 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003494 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003495 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003496
Vinh Tranf9754732023-01-19 22:41:46 -05003497 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003498 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003499 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003500
Vinh Tranf9754732023-01-19 22:41:46 -05003501 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003502 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003503 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003504
Colin Crossaede88c2020-08-11 12:17:01 -07003505 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3506 // each variant defines additional macros to distinguish which apex variant it is built for
3507
3508 // non-APEX variant does not have __ANDROID_APEX__ defined
3509 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3510 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3511
Vinh Tranf9754732023-01-19 22:41:46 -05003512 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003513 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3514 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003515
Jooyung Hanc87a0592020-03-02 17:44:33 +09003516 // non-APEX variant does not have __ANDROID_APEX__ defined
3517 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3518 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3519
Vinh Tranf9754732023-01-19 22:41:46 -05003520 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003521 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003522 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003523}
Jiyong Park7e636d02019-01-28 16:16:54 +09003524
3525func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003526 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003527 apex {
3528 name: "myapex",
3529 key: "myapex.key",
3530 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003531 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003532 }
3533
3534 apex_key {
3535 name: "myapex.key",
3536 public_key: "testkey.avbpubkey",
3537 private_key: "testkey.pem",
3538 }
3539
3540 cc_library_headers {
3541 name: "mylib_headers",
3542 export_include_dirs: ["my_include"],
3543 system_shared_libs: [],
3544 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003545 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003546 }
3547
3548 cc_library {
3549 name: "mylib",
3550 srcs: ["mylib.cpp"],
3551 system_shared_libs: [],
3552 stl: "none",
3553 header_libs: ["mylib_headers"],
3554 export_header_lib_headers: ["mylib_headers"],
3555 stubs: {
3556 versions: ["1", "2", "3"],
3557 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003558 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003559 }
3560
3561 cc_library {
3562 name: "otherlib",
3563 srcs: ["mylib.cpp"],
3564 system_shared_libs: [],
3565 stl: "none",
3566 shared_libs: ["mylib"],
3567 }
3568 `)
3569
Colin Cross7113d202019-11-20 16:39:12 -08003570 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003571
3572 // Ensure that the include path of the header lib is exported to 'otherlib'
3573 ensureContains(t, cFlags, "-Imy_include")
3574}
Alex Light9670d332019-01-29 18:07:33 -08003575
Jiyong Park7cd10e32020-01-14 09:22:18 +09003576type fileInApex struct {
3577 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003578 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003579 isLink bool
3580}
3581
Jooyung Han1724d582022-12-21 10:17:44 +09003582func (f fileInApex) String() string {
3583 return f.src + ":" + f.path
3584}
3585
3586func (f fileInApex) match(expectation string) bool {
3587 parts := strings.Split(expectation, ":")
3588 if len(parts) == 1 {
3589 match, _ := path.Match(parts[0], f.path)
3590 return match
3591 }
3592 if len(parts) == 2 {
3593 matchSrc, _ := path.Match(parts[0], f.src)
3594 matchDst, _ := path.Match(parts[1], f.path)
3595 return matchSrc && matchDst
3596 }
3597 panic("invalid expected file specification: " + expectation)
3598}
3599
Jooyung Hana57af4a2020-01-23 05:36:59 +00003600func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003601 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003602 module := ctx.ModuleForTests(moduleName, variant)
3603 apexRule := module.MaybeRule("apexRule")
3604 apexDir := "/image.apex/"
3605 if apexRule.Rule == nil {
3606 apexRule = module.Rule("zipApexRule")
3607 apexDir = "/image.zipapex/"
3608 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003609 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003610 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003611 for _, cmd := range strings.Split(copyCmds, "&&") {
3612 cmd = strings.TrimSpace(cmd)
3613 if cmd == "" {
3614 continue
3615 }
3616 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003617 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003618 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003619 switch terms[0] {
3620 case "mkdir":
3621 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003622 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003623 t.Fatal("copyCmds contains invalid cp command", cmd)
3624 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003625 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003626 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003627 isLink = false
3628 case "ln":
3629 if len(terms) != 3 && len(terms) != 4 {
3630 // ln LINK TARGET or ln -s LINK TARGET
3631 t.Fatal("copyCmds contains invalid ln command", cmd)
3632 }
3633 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003634 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003635 isLink = true
3636 default:
3637 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3638 }
3639 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003640 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003641 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003642 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003643 }
Jooyung Han1724d582022-12-21 10:17:44 +09003644 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003645 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003646 }
3647 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003648 return ret
3649}
3650
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003651func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003652 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003653 var failed bool
3654 var surplus []string
3655 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003656 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003657 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003658 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003659 if file.match(expected) {
3660 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003661 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003662 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003663 }
3664 }
Jooyung Han1724d582022-12-21 10:17:44 +09003665 if !matchFound {
3666 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003667 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003668 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003669
Jooyung Han31c470b2019-10-18 16:26:59 +09003670 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003671 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003672 t.Log("surplus files", surplus)
3673 failed = true
3674 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003675
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003676 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003677 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003678 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003679 if !filesMatched[expected] {
3680 missing = append(missing, expected)
3681 }
3682 }
3683 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003684 t.Log("missing files", missing)
3685 failed = true
3686 }
3687 if failed {
3688 t.Fail()
3689 }
3690}
3691
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003692func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3693 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3694}
3695
3696func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3697 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3698 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3699 if deapexer.Output != nil {
3700 outputs = append(outputs, deapexer.Output.String())
3701 }
3702 for _, output := range deapexer.ImplicitOutputs {
3703 outputs = append(outputs, output.String())
3704 }
3705 actualFiles := make([]fileInApex, 0, len(outputs))
3706 for _, output := range outputs {
3707 dir := "/deapexer/"
3708 pos := strings.LastIndex(output, dir)
3709 if pos == -1 {
3710 t.Fatal("Unknown deapexer output ", output)
3711 }
3712 path := output[pos+len(dir):]
3713 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3714 }
3715 assertFileListEquals(t, files, actualFiles)
3716}
3717
Jooyung Han344d5432019-08-23 11:17:39 +09003718func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003719 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003720 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003721 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003722 "etc/llndk.libraries.29.txt",
3723 "etc/vndkcore.libraries.29.txt",
3724 "etc/vndksp.libraries.29.txt",
3725 "etc/vndkprivate.libraries.29.txt",
3726 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003727 }
3728 testCases := []struct {
3729 vndkVersion string
3730 expectedFiles []string
3731 }{
3732 {
3733 vndkVersion: "current",
3734 expectedFiles: append(commonFiles,
3735 "lib/libvndk.so",
3736 "lib/libvndksp.so",
3737 "lib64/libvndk.so",
3738 "lib64/libvndksp.so"),
3739 },
3740 {
3741 vndkVersion: "",
3742 expectedFiles: append(commonFiles,
3743 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3744 "lib/libvndksp.so",
3745 "lib64/libvndksp.so"),
3746 },
3747 }
3748 for _, tc := range testCases {
3749 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3750 ctx := testApex(t, `
3751 apex_vndk {
3752 name: "com.android.vndk.current",
3753 key: "com.android.vndk.current.key",
3754 updatable: false,
3755 }
3756
3757 apex_key {
3758 name: "com.android.vndk.current.key",
3759 public_key: "testkey.avbpubkey",
3760 private_key: "testkey.pem",
3761 }
3762
3763 cc_library {
3764 name: "libvndk",
3765 srcs: ["mylib.cpp"],
3766 vendor_available: true,
3767 product_available: true,
3768 vndk: {
3769 enabled: true,
3770 },
3771 system_shared_libs: [],
3772 stl: "none",
3773 apex_available: [ "com.android.vndk.current" ],
3774 }
3775
3776 cc_library {
3777 name: "libvndksp",
3778 srcs: ["mylib.cpp"],
3779 vendor_available: true,
3780 product_available: true,
3781 vndk: {
3782 enabled: true,
3783 support_system_process: true,
3784 },
3785 system_shared_libs: [],
3786 stl: "none",
3787 apex_available: [ "com.android.vndk.current" ],
3788 }
3789
3790 // VNDK-Ext should not cause any problems
3791
3792 cc_library {
3793 name: "libvndk.ext",
3794 srcs: ["mylib2.cpp"],
3795 vendor: true,
3796 vndk: {
3797 enabled: true,
3798 extends: "libvndk",
3799 },
3800 system_shared_libs: [],
3801 stl: "none",
3802 }
3803
3804 cc_library {
3805 name: "libvndksp.ext",
3806 srcs: ["mylib2.cpp"],
3807 vendor: true,
3808 vndk: {
3809 enabled: true,
3810 support_system_process: true,
3811 extends: "libvndksp",
3812 },
3813 system_shared_libs: [],
3814 stl: "none",
3815 }
3816 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3817 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3818 }))
3819 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3820 })
3821 }
Jooyung Han344d5432019-08-23 11:17:39 +09003822}
3823
3824func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003825 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003826 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003827 name: "com.android.vndk.current",
3828 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003829 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003830 }
3831
3832 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003833 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003834 public_key: "testkey.avbpubkey",
3835 private_key: "testkey.pem",
3836 }
3837
3838 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003839 name: "libvndk",
3840 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003841 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003842 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003843 vndk: {
3844 enabled: true,
3845 },
3846 system_shared_libs: [],
3847 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003848 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003849 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003850
3851 cc_prebuilt_library_shared {
3852 name: "libvndk.arm",
3853 srcs: ["libvndk.arm.so"],
3854 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003855 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003856 vndk: {
3857 enabled: true,
3858 },
3859 enabled: false,
3860 arch: {
3861 arm: {
3862 enabled: true,
3863 },
3864 },
3865 system_shared_libs: [],
3866 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003867 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003868 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003869 `+vndkLibrariesTxtFiles("current"),
3870 withFiles(map[string][]byte{
3871 "libvndk.so": nil,
3872 "libvndk.arm.so": nil,
3873 }))
Colin Cross2807f002021-03-02 10:15:29 -08003874 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003875 "lib/libvndk.so",
3876 "lib/libvndk.arm.so",
3877 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003878 "lib/libc++.so",
3879 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003880 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003881 })
Jooyung Han344d5432019-08-23 11:17:39 +09003882}
3883
Jooyung Han39edb6c2019-11-06 16:53:07 +09003884func vndkLibrariesTxtFiles(vers ...string) (result string) {
3885 for _, v := range vers {
3886 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003887 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003888 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003889 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003890 name: "` + txt + `.libraries.txt",
3891 }
3892 `
3893 }
3894 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003895 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003896 result += `
3897 prebuilt_etc {
3898 name: "` + txt + `.libraries.` + v + `.txt",
3899 src: "dummy.txt",
3900 }
3901 `
3902 }
3903 }
3904 }
3905 return
3906}
3907
Jooyung Han344d5432019-08-23 11:17:39 +09003908func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003909 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003910 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003911 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003912 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003913 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003914 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003915 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003916 }
3917
3918 apex_key {
3919 name: "myapex.key",
3920 public_key: "testkey.avbpubkey",
3921 private_key: "testkey.pem",
3922 }
3923
Jooyung Han31c470b2019-10-18 16:26:59 +09003924 vndk_prebuilt_shared {
3925 name: "libvndk27",
3926 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003927 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003928 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003929 vndk: {
3930 enabled: true,
3931 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003932 target_arch: "arm64",
3933 arch: {
3934 arm: {
3935 srcs: ["libvndk27_arm.so"],
3936 },
3937 arm64: {
3938 srcs: ["libvndk27_arm64.so"],
3939 },
3940 },
Colin Cross2807f002021-03-02 10:15:29 -08003941 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003942 }
3943
3944 vndk_prebuilt_shared {
3945 name: "libvndk27",
3946 version: "27",
3947 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003948 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003949 vndk: {
3950 enabled: true,
3951 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003952 target_arch: "x86_64",
3953 arch: {
3954 x86: {
3955 srcs: ["libvndk27_x86.so"],
3956 },
3957 x86_64: {
3958 srcs: ["libvndk27_x86_64.so"],
3959 },
3960 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003961 }
3962 `+vndkLibrariesTxtFiles("27"),
3963 withFiles(map[string][]byte{
3964 "libvndk27_arm.so": nil,
3965 "libvndk27_arm64.so": nil,
3966 "libvndk27_x86.so": nil,
3967 "libvndk27_x86_64.so": nil,
3968 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003969
Colin Cross2807f002021-03-02 10:15:29 -08003970 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003971 "lib/libvndk27_arm.so",
3972 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003973 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003974 })
Jooyung Han344d5432019-08-23 11:17:39 +09003975}
3976
Jooyung Han90eee022019-10-01 20:02:42 +09003977func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003978 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003979 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003980 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003981 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003982 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003983 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003984 }
3985 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003986 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003987 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003988 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003989 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003990 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003991 }
3992 apex_key {
3993 name: "myapex.key",
3994 public_key: "testkey.avbpubkey",
3995 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003996 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003997
3998 assertApexName := func(expected, moduleName string) {
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09003999 module := ctx.ModuleForTests(moduleName, "android_common_image")
4000 apexManifestRule := module.Rule("apexManifestRule")
4001 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004002 }
4003
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004004 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004005 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004006}
4007
Jooyung Han344d5432019-08-23 11:17:39 +09004008func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004009 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004010 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004011 name: "com.android.vndk.current",
4012 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004013 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004014 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004015 }
4016
4017 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004018 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004019 public_key: "testkey.avbpubkey",
4020 private_key: "testkey.pem",
4021 }
4022
4023 cc_library {
4024 name: "libvndk",
4025 srcs: ["mylib.cpp"],
4026 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004027 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004028 native_bridge_supported: true,
4029 host_supported: true,
4030 vndk: {
4031 enabled: true,
4032 },
4033 system_shared_libs: [],
4034 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004035 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004036 }
Colin Cross2807f002021-03-02 10:15:29 -08004037 `+vndkLibrariesTxtFiles("current"),
4038 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004039
Colin Cross2807f002021-03-02 10:15:29 -08004040 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004041 "lib/libvndk.so",
4042 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004043 "lib/libc++.so",
4044 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004045 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004046 })
Jooyung Han344d5432019-08-23 11:17:39 +09004047}
4048
4049func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004050 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004051 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004052 name: "com.android.vndk.current",
4053 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004054 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004055 native_bridge_supported: true,
4056 }
4057
4058 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004059 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004060 public_key: "testkey.avbpubkey",
4061 private_key: "testkey.pem",
4062 }
4063
4064 cc_library {
4065 name: "libvndk",
4066 srcs: ["mylib.cpp"],
4067 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004068 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004069 native_bridge_supported: true,
4070 host_supported: true,
4071 vndk: {
4072 enabled: true,
4073 },
4074 system_shared_libs: [],
4075 stl: "none",
4076 }
4077 `)
4078}
4079
Jooyung Han31c470b2019-10-18 16:26:59 +09004080func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004081 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004082 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004083 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004084 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004085 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004086 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004087 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004088 }
4089
4090 apex_key {
4091 name: "myapex.key",
4092 public_key: "testkey.avbpubkey",
4093 private_key: "testkey.pem",
4094 }
4095
4096 vndk_prebuilt_shared {
4097 name: "libvndk27",
4098 version: "27",
4099 target_arch: "arm",
4100 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004101 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004102 vndk: {
4103 enabled: true,
4104 },
4105 arch: {
4106 arm: {
4107 srcs: ["libvndk27.so"],
4108 }
4109 },
4110 }
4111
4112 vndk_prebuilt_shared {
4113 name: "libvndk27",
4114 version: "27",
4115 target_arch: "arm",
4116 binder32bit: true,
4117 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004118 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004119 vndk: {
4120 enabled: true,
4121 },
4122 arch: {
4123 arm: {
4124 srcs: ["libvndk27binder32.so"],
4125 }
4126 },
Colin Cross2807f002021-03-02 10:15:29 -08004127 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004128 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004129 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004130 withFiles(map[string][]byte{
4131 "libvndk27.so": nil,
4132 "libvndk27binder32.so": nil,
4133 }),
4134 withBinder32bit,
4135 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004136 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004137 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4138 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004139 },
4140 }),
4141 )
4142
Colin Cross2807f002021-03-02 10:15:29 -08004143 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004144 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004145 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004146 })
4147}
4148
Jooyung Han45a96772020-06-15 14:59:42 +09004149func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004150 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004151 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004152 name: "com.android.vndk.current",
4153 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004154 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004155 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004156 }
4157
4158 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004159 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004160 public_key: "testkey.avbpubkey",
4161 private_key: "testkey.pem",
4162 }
4163
4164 cc_library {
4165 name: "libz",
4166 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004167 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004168 vndk: {
4169 enabled: true,
4170 },
4171 stubs: {
4172 symbol_file: "libz.map.txt",
4173 versions: ["30"],
4174 }
4175 }
4176 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4177 "libz.map.txt": nil,
4178 }))
4179
Colin Cross2807f002021-03-02 10:15:29 -08004180 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004181 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4182 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09004183 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
4184 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4185 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4186 "*/*",
4187 })
Jooyung Han45a96772020-06-15 14:59:42 +09004188}
4189
Jooyung Hane3f02812023-05-08 13:54:50 +09004190func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4191 ctx := testApex(t, "",
4192 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4193 variables.DeviceVndkVersion = proptools.StringPtr("27")
4194 }),
4195 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4196 cc.RegisterVendorSnapshotModules(ctx)
4197 }),
4198 withFiles(map[string][]byte{
4199 "vendor/foo/Android.bp": []byte(`
4200 apex {
4201 name: "myapex",
4202 binaries: ["foo"],
4203 key: "myapex.key",
4204 min_sdk_version: "27",
4205 vendor: true,
4206 }
4207
4208 cc_binary {
4209 name: "foo",
4210 vendor: true,
4211 srcs: ["abc.cpp"],
4212 shared_libs: [
4213 "libllndk",
4214 "libvndk",
4215 ],
4216 nocrt: true,
4217 system_shared_libs: [],
4218 min_sdk_version: "27",
4219 }
4220
4221 apex_key {
4222 name: "myapex.key",
4223 public_key: "testkey.avbpubkey",
4224 private_key: "testkey.pem",
4225 }
4226 `),
4227 // Simulate VNDK prebuilts with vendor_snapshot
4228 "prebuilts/vndk/Android.bp": []byte(`
4229 vndk_prebuilt_shared {
4230 name: "libllndk",
4231 version: "27",
4232 vendor_available: true,
4233 product_available: true,
4234 target_arch: "arm64",
4235 arch: {
4236 arm64: {
4237 srcs: ["libllndk.so"],
4238 },
4239 },
4240 }
4241
4242 vndk_prebuilt_shared {
4243 name: "libvndk",
4244 version: "27",
4245 vendor_available: true,
4246 product_available: true,
4247 target_arch: "arm64",
4248 arch: {
4249 arm64: {
4250 srcs: ["libvndk.so"],
4251 },
4252 },
4253 vndk: {
4254 enabled: true,
4255 },
4256 min_sdk_version: "27",
4257 }
4258
4259 vndk_prebuilt_shared {
4260 name: "libc++",
4261 version: "27",
4262 target_arch: "arm64",
4263 vendor_available: true,
4264 product_available: true,
4265 vndk: {
4266 enabled: true,
4267 support_system_process: true,
4268 },
4269 arch: {
4270 arm64: {
4271 srcs: ["libc++.so"],
4272 },
4273 },
4274 min_sdk_version: "apex_inherit",
4275 }
4276
4277 vendor_snapshot {
4278 name: "vendor_snapshot",
4279 version: "27",
4280 arch: {
4281 arm64: {
4282 vndk_libs: [
4283 "libc++",
4284 "libllndk",
4285 "libvndk",
4286 ],
4287 static_libs: [
4288 "libc++demangle",
4289 "libclang_rt.builtins",
4290 "libunwind",
4291 ],
4292 },
4293 }
4294 }
4295
4296 vendor_snapshot_static {
4297 name: "libclang_rt.builtins",
4298 version: "27",
4299 target_arch: "arm64",
4300 vendor: true,
4301 arch: {
4302 arm64: {
4303 src: "libclang_rt.builtins-aarch64-android.a",
4304 },
4305 },
4306 }
4307
4308 vendor_snapshot_static {
4309 name: "libc++demangle",
4310 version: "27",
4311 target_arch: "arm64",
4312 compile_multilib: "64",
4313 vendor: true,
4314 arch: {
4315 arm64: {
4316 src: "libc++demangle.a",
4317 },
4318 },
4319 min_sdk_version: "apex_inherit",
4320 }
4321
4322 vendor_snapshot_static {
4323 name: "libunwind",
4324 version: "27",
4325 target_arch: "arm64",
4326 compile_multilib: "64",
4327 vendor: true,
4328 arch: {
4329 arm64: {
4330 src: "libunwind.a",
4331 },
4332 },
4333 min_sdk_version: "apex_inherit",
4334 }
4335 `),
4336 }))
4337
4338 // Should embed the prebuilt VNDK libraries in the apex
4339 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4340 "bin/foo",
4341 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4342 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4343 })
4344
4345 // Should link foo with prebuilt libraries (shared/static)
4346 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4347 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4348 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4349 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4350 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4351
4352 // Should declare the LLNDK library as a "required" external dependency
4353 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4354 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4355 ensureListContains(t, requireNativeLibs, "libllndk.so")
4356}
4357
Jooyung Hane1633032019-08-01 17:41:43 +09004358func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004359 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004360 apex {
4361 name: "myapex_nodep",
4362 key: "myapex.key",
4363 native_shared_libs: ["lib_nodep"],
4364 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004365 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004366 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004367 }
4368
4369 apex {
4370 name: "myapex_dep",
4371 key: "myapex.key",
4372 native_shared_libs: ["lib_dep"],
4373 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004374 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004375 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004376 }
4377
4378 apex {
4379 name: "myapex_provider",
4380 key: "myapex.key",
4381 native_shared_libs: ["libfoo"],
4382 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004383 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004384 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004385 }
4386
4387 apex {
4388 name: "myapex_selfcontained",
4389 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004390 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004391 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004392 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004393 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004394 }
4395
4396 apex_key {
4397 name: "myapex.key",
4398 public_key: "testkey.avbpubkey",
4399 private_key: "testkey.pem",
4400 }
4401
4402 cc_library {
4403 name: "lib_nodep",
4404 srcs: ["mylib.cpp"],
4405 system_shared_libs: [],
4406 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004407 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004408 }
4409
4410 cc_library {
4411 name: "lib_dep",
4412 srcs: ["mylib.cpp"],
4413 shared_libs: ["libfoo"],
4414 system_shared_libs: [],
4415 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004416 apex_available: [
4417 "myapex_dep",
4418 "myapex_provider",
4419 "myapex_selfcontained",
4420 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004421 }
4422
4423 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004424 name: "lib_dep_on_bar",
4425 srcs: ["mylib.cpp"],
4426 shared_libs: ["libbar"],
4427 system_shared_libs: [],
4428 stl: "none",
4429 apex_available: [
4430 "myapex_selfcontained",
4431 ],
4432 }
4433
4434
4435 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004436 name: "libfoo",
4437 srcs: ["mytest.cpp"],
4438 stubs: {
4439 versions: ["1"],
4440 },
4441 system_shared_libs: [],
4442 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004443 apex_available: [
4444 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004445 ],
4446 }
4447
4448 cc_library {
4449 name: "libbar",
4450 srcs: ["mytest.cpp"],
4451 stubs: {
4452 versions: ["1"],
4453 },
4454 system_shared_libs: [],
4455 stl: "none",
4456 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004457 "myapex_selfcontained",
4458 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004459 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004460
Jooyung Hane1633032019-08-01 17:41:43 +09004461 `)
4462
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004463 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004464 var provideNativeLibs, requireNativeLibs []string
4465
Sundong Ahnabb64432019-10-22 13:58:29 +09004466 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004467 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4468 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004469 ensureListEmpty(t, provideNativeLibs)
4470 ensureListEmpty(t, requireNativeLibs)
4471
Sundong Ahnabb64432019-10-22 13:58:29 +09004472 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004473 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4474 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004475 ensureListEmpty(t, provideNativeLibs)
4476 ensureListContains(t, requireNativeLibs, "libfoo.so")
4477
Sundong Ahnabb64432019-10-22 13:58:29 +09004478 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004479 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4480 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004481 ensureListContains(t, provideNativeLibs, "libfoo.so")
4482 ensureListEmpty(t, requireNativeLibs)
4483
Sundong Ahnabb64432019-10-22 13:58:29 +09004484 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004485 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4486 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004487 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004488 ensureListEmpty(t, requireNativeLibs)
4489}
4490
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004491func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4492 ctx := testApex(t, `
4493 apex {
4494 name: "myapex",
4495 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004496 native_shared_libs: ["mylib"],
4497 updatable: false,
4498 }
4499
4500 apex_key {
4501 name: "myapex.key",
4502 public_key: "testkey.avbpubkey",
4503 private_key: "testkey.pem",
4504 }
4505
4506 cc_library {
4507 name: "mylib",
4508 srcs: ["mylib.cpp"],
4509 system_shared_libs: [],
4510 stl: "none",
4511 apex_available: [
4512 "//apex_available:platform",
4513 "myapex",
4514 ],
4515 }
4516 `, android.FixtureMergeEnv(map[string]string{
4517 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4518 }))
4519
Jooyung Han63dff462023-02-09 00:11:27 +00004520 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004521 apexManifestRule := module.Rule("apexManifestRule")
4522 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4523}
4524
Vinh Tran8f5310f2022-10-07 18:16:47 -04004525func TestCompileMultilibProp(t *testing.T) {
4526 testCases := []struct {
4527 compileMultiLibProp string
4528 containedLibs []string
4529 notContainedLibs []string
4530 }{
4531 {
4532 containedLibs: []string{
4533 "image.apex/lib64/mylib.so",
4534 "image.apex/lib/mylib.so",
4535 },
4536 compileMultiLibProp: `compile_multilib: "both",`,
4537 },
4538 {
4539 containedLibs: []string{"image.apex/lib64/mylib.so"},
4540 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4541 compileMultiLibProp: `compile_multilib: "first",`,
4542 },
4543 {
4544 containedLibs: []string{"image.apex/lib64/mylib.so"},
4545 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4546 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4547 },
4548 {
4549 containedLibs: []string{"image.apex/lib64/mylib.so"},
4550 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4551 compileMultiLibProp: `compile_multilib: "64",`,
4552 },
4553 {
4554 containedLibs: []string{"image.apex/lib/mylib.so"},
4555 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4556 compileMultiLibProp: `compile_multilib: "32",`,
4557 },
4558 }
4559 for _, testCase := range testCases {
4560 ctx := testApex(t, fmt.Sprintf(`
4561 apex {
4562 name: "myapex",
4563 key: "myapex.key",
4564 %s
4565 native_shared_libs: ["mylib"],
4566 updatable: false,
4567 }
4568 apex_key {
4569 name: "myapex.key",
4570 public_key: "testkey.avbpubkey",
4571 private_key: "testkey.pem",
4572 }
4573 cc_library {
4574 name: "mylib",
4575 srcs: ["mylib.cpp"],
4576 apex_available: [
4577 "//apex_available:platform",
4578 "myapex",
4579 ],
4580 }
4581 `, testCase.compileMultiLibProp),
4582 )
4583 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4584 apexRule := module.Rule("apexRule")
4585 copyCmds := apexRule.Args["copy_commands"]
4586 for _, containedLib := range testCase.containedLibs {
4587 ensureContains(t, copyCmds, containedLib)
4588 }
4589 for _, notContainedLib := range testCase.notContainedLibs {
4590 ensureNotContains(t, copyCmds, notContainedLib)
4591 }
4592 }
4593}
4594
Alex Light0851b882019-02-07 13:20:53 -08004595func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004596 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004597 apex {
4598 name: "myapex",
4599 key: "myapex.key",
4600 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004601 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004602 }
4603
4604 apex_key {
4605 name: "myapex.key",
4606 public_key: "testkey.avbpubkey",
4607 private_key: "testkey.pem",
4608 }
4609
4610 cc_library {
4611 name: "mylib_common",
4612 srcs: ["mylib.cpp"],
4613 system_shared_libs: [],
4614 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004615 apex_available: [
4616 "//apex_available:platform",
4617 "myapex",
4618 ],
Alex Light0851b882019-02-07 13:20:53 -08004619 }
4620 `)
4621
Sundong Ahnabb64432019-10-22 13:58:29 +09004622 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004623 apexRule := module.Rule("apexRule")
4624 copyCmds := apexRule.Args["copy_commands"]
4625
4626 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4627 t.Log("Apex was a test apex!")
4628 t.Fail()
4629 }
4630 // Ensure that main rule creates an output
4631 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4632
4633 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004634 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004635
4636 // Ensure that both direct and indirect deps are copied into apex
4637 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4638
Colin Cross7113d202019-11-20 16:39:12 -08004639 // Ensure that the platform variant ends with _shared
4640 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004641
Colin Cross56a83212020-09-15 18:30:11 -07004642 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004643 t.Log("Found mylib_common not in any apex!")
4644 t.Fail()
4645 }
4646}
4647
4648func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004649 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004650 apex_test {
4651 name: "myapex",
4652 key: "myapex.key",
4653 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004654 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004655 }
4656
4657 apex_key {
4658 name: "myapex.key",
4659 public_key: "testkey.avbpubkey",
4660 private_key: "testkey.pem",
4661 }
4662
4663 cc_library {
4664 name: "mylib_common_test",
4665 srcs: ["mylib.cpp"],
4666 system_shared_libs: [],
4667 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004668 // TODO: remove //apex_available:platform
4669 apex_available: [
4670 "//apex_available:platform",
4671 "myapex",
4672 ],
Alex Light0851b882019-02-07 13:20:53 -08004673 }
4674 `)
4675
Sundong Ahnabb64432019-10-22 13:58:29 +09004676 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004677 apexRule := module.Rule("apexRule")
4678 copyCmds := apexRule.Args["copy_commands"]
4679
4680 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4681 t.Log("Apex was not a test apex!")
4682 t.Fail()
4683 }
4684 // Ensure that main rule creates an output
4685 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4686
4687 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004688 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004689
4690 // Ensure that both direct and indirect deps are copied into apex
4691 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4692
Colin Cross7113d202019-11-20 16:39:12 -08004693 // Ensure that the platform variant ends with _shared
4694 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004695}
4696
Alex Light9670d332019-01-29 18:07:33 -08004697func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004698 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004699 apex {
4700 name: "myapex",
4701 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004702 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004703 multilib: {
4704 first: {
4705 native_shared_libs: ["mylib_common"],
4706 }
4707 },
4708 target: {
4709 android: {
4710 multilib: {
4711 first: {
4712 native_shared_libs: ["mylib"],
4713 }
4714 }
4715 },
4716 host: {
4717 multilib: {
4718 first: {
4719 native_shared_libs: ["mylib2"],
4720 }
4721 }
4722 }
4723 }
4724 }
4725
4726 apex_key {
4727 name: "myapex.key",
4728 public_key: "testkey.avbpubkey",
4729 private_key: "testkey.pem",
4730 }
4731
4732 cc_library {
4733 name: "mylib",
4734 srcs: ["mylib.cpp"],
4735 system_shared_libs: [],
4736 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004737 // TODO: remove //apex_available:platform
4738 apex_available: [
4739 "//apex_available:platform",
4740 "myapex",
4741 ],
Alex Light9670d332019-01-29 18:07:33 -08004742 }
4743
4744 cc_library {
4745 name: "mylib_common",
4746 srcs: ["mylib.cpp"],
4747 system_shared_libs: [],
4748 stl: "none",
4749 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004750 // TODO: remove //apex_available:platform
4751 apex_available: [
4752 "//apex_available:platform",
4753 "myapex",
4754 ],
Alex Light9670d332019-01-29 18:07:33 -08004755 }
4756
4757 cc_library {
4758 name: "mylib2",
4759 srcs: ["mylib.cpp"],
4760 system_shared_libs: [],
4761 stl: "none",
4762 compile_multilib: "first",
4763 }
4764 `)
4765
Sundong Ahnabb64432019-10-22 13:58:29 +09004766 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004767 copyCmds := apexRule.Args["copy_commands"]
4768
4769 // Ensure that main rule creates an output
4770 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4771
4772 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004773 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4774 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4775 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004776
4777 // Ensure that both direct and indirect deps are copied into apex
4778 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4779 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4780 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4781
Colin Cross7113d202019-11-20 16:39:12 -08004782 // Ensure that the platform variant ends with _shared
4783 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4784 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4785 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004786}
Jiyong Park04480cf2019-02-06 00:16:29 +09004787
Jiyong Park59140302020-12-14 18:44:04 +09004788func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004789 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004790 apex {
4791 name: "myapex",
4792 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004793 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004794 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004795 arch: {
4796 arm64: {
4797 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004798 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004799 },
4800 x86_64: {
4801 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004802 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004803 },
4804 }
4805 }
4806
4807 apex_key {
4808 name: "myapex.key",
4809 public_key: "testkey.avbpubkey",
4810 private_key: "testkey.pem",
4811 }
4812
4813 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004814 name: "mylib.generic",
4815 srcs: ["mylib.cpp"],
4816 system_shared_libs: [],
4817 stl: "none",
4818 // TODO: remove //apex_available:platform
4819 apex_available: [
4820 "//apex_available:platform",
4821 "myapex",
4822 ],
4823 }
4824
4825 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004826 name: "mylib.arm64",
4827 srcs: ["mylib.cpp"],
4828 system_shared_libs: [],
4829 stl: "none",
4830 // TODO: remove //apex_available:platform
4831 apex_available: [
4832 "//apex_available:platform",
4833 "myapex",
4834 ],
4835 }
4836
4837 cc_library {
4838 name: "mylib.x64",
4839 srcs: ["mylib.cpp"],
4840 system_shared_libs: [],
4841 stl: "none",
4842 // TODO: remove //apex_available:platform
4843 apex_available: [
4844 "//apex_available:platform",
4845 "myapex",
4846 ],
4847 }
4848 `)
4849
4850 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4851 copyCmds := apexRule.Args["copy_commands"]
4852
4853 // Ensure that apex variant is created for the direct dep
4854 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004855 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004856 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4857
4858 // Ensure that both direct and indirect deps are copied into apex
4859 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4860 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4861}
4862
Jiyong Park04480cf2019-02-06 00:16:29 +09004863func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004864 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004865 apex {
4866 name: "myapex",
4867 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004868 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004869 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004870 }
4871
4872 apex_key {
4873 name: "myapex.key",
4874 public_key: "testkey.avbpubkey",
4875 private_key: "testkey.pem",
4876 }
4877
4878 sh_binary {
4879 name: "myscript",
4880 src: "mylib.cpp",
4881 filename: "myscript.sh",
4882 sub_dir: "script",
4883 }
4884 `)
4885
Sundong Ahnabb64432019-10-22 13:58:29 +09004886 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004887 copyCmds := apexRule.Args["copy_commands"]
4888
4889 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4890}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004891
Jooyung Han91df2082019-11-20 01:49:42 +09004892func TestApexInVariousPartition(t *testing.T) {
4893 testcases := []struct {
4894 propName, parition, flattenedPartition string
4895 }{
4896 {"", "system", "system_ext"},
4897 {"product_specific: true", "product", "product"},
4898 {"soc_specific: true", "vendor", "vendor"},
4899 {"proprietary: true", "vendor", "vendor"},
4900 {"vendor: true", "vendor", "vendor"},
4901 {"system_ext_specific: true", "system_ext", "system_ext"},
4902 }
4903 for _, tc := range testcases {
4904 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004905 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004906 apex {
4907 name: "myapex",
4908 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004909 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004910 `+tc.propName+`
4911 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004912
Jooyung Han91df2082019-11-20 01:49:42 +09004913 apex_key {
4914 name: "myapex.key",
4915 public_key: "testkey.avbpubkey",
4916 private_key: "testkey.pem",
4917 }
4918 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004919
Jooyung Han91df2082019-11-20 01:49:42 +09004920 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004921 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4922 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004923 if actual != expected {
4924 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4925 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004926
Jooyung Han91df2082019-11-20 01:49:42 +09004927 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004928 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4929 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004930 if actual != expected {
4931 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4932 }
4933 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004934 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004935}
Jiyong Park67882562019-03-21 01:11:21 +09004936
Jooyung Han580eb4f2020-06-24 19:33:06 +09004937func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004938 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004939 apex {
4940 name: "myapex",
4941 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004942 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004943 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004944
Jooyung Han580eb4f2020-06-24 19:33:06 +09004945 apex_key {
4946 name: "myapex.key",
4947 public_key: "testkey.avbpubkey",
4948 private_key: "testkey.pem",
4949 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004950 `)
4951 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004952 rule := module.Output("file_contexts")
4953 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4954}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004955
Jooyung Han580eb4f2020-06-24 19:33:06 +09004956func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004957 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004958 apex {
4959 name: "myapex",
4960 key: "myapex.key",
4961 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004962 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004963 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004964
Jooyung Han580eb4f2020-06-24 19:33:06 +09004965 apex_key {
4966 name: "myapex.key",
4967 public_key: "testkey.avbpubkey",
4968 private_key: "testkey.pem",
4969 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004970 `, withFiles(map[string][]byte{
4971 "my_own_file_contexts": nil,
4972 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004973}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004974
Jooyung Han580eb4f2020-06-24 19:33:06 +09004975func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004976 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004977 apex {
4978 name: "myapex",
4979 key: "myapex.key",
4980 product_specific: true,
4981 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004982 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004983 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004984
Jooyung Han580eb4f2020-06-24 19:33:06 +09004985 apex_key {
4986 name: "myapex.key",
4987 public_key: "testkey.avbpubkey",
4988 private_key: "testkey.pem",
4989 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004990 `)
4991
Colin Cross1c460562021-02-16 17:55:47 -08004992 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004993 apex {
4994 name: "myapex",
4995 key: "myapex.key",
4996 product_specific: true,
4997 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004998 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004999 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005000
Jooyung Han580eb4f2020-06-24 19:33:06 +09005001 apex_key {
5002 name: "myapex.key",
5003 public_key: "testkey.avbpubkey",
5004 private_key: "testkey.pem",
5005 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005006 `, withFiles(map[string][]byte{
5007 "product_specific_file_contexts": nil,
5008 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005009 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5010 rule := module.Output("file_contexts")
5011 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5012}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005013
Jooyung Han580eb4f2020-06-24 19:33:06 +09005014func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005015 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005016 apex {
5017 name: "myapex",
5018 key: "myapex.key",
5019 product_specific: true,
5020 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005021 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005022 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005023
Jooyung Han580eb4f2020-06-24 19:33:06 +09005024 apex_key {
5025 name: "myapex.key",
5026 public_key: "testkey.avbpubkey",
5027 private_key: "testkey.pem",
5028 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005029
Jooyung Han580eb4f2020-06-24 19:33:06 +09005030 filegroup {
5031 name: "my-file-contexts",
5032 srcs: ["product_specific_file_contexts"],
5033 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005034 `, withFiles(map[string][]byte{
5035 "product_specific_file_contexts": nil,
5036 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005037 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5038 rule := module.Output("file_contexts")
5039 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005040}
5041
Jiyong Park67882562019-03-21 01:11:21 +09005042func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005043 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005044 apex_key {
5045 name: "myapex.key",
5046 public_key: ":my.avbpubkey",
5047 private_key: ":my.pem",
5048 product_specific: true,
5049 }
5050
5051 filegroup {
5052 name: "my.avbpubkey",
5053 srcs: ["testkey2.avbpubkey"],
5054 }
5055
5056 filegroup {
5057 name: "my.pem",
5058 srcs: ["testkey2.pem"],
5059 }
5060 `)
5061
5062 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5063 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005064 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005065 if actual_pubkey != expected_pubkey {
5066 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5067 }
5068 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005069 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005070 if actual_privkey != expected_privkey {
5071 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5072 }
5073}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005074
5075func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005076 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005077 prebuilt_apex {
5078 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005079 arch: {
5080 arm64: {
5081 src: "myapex-arm64.apex",
5082 },
5083 arm: {
5084 src: "myapex-arm.apex",
5085 },
5086 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005087 }
5088 `)
5089
Wei Li340ee8e2022-03-18 17:33:24 -07005090 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5091 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005092
Jiyong Parkc95714e2019-03-29 14:23:10 +09005093 expectedInput := "myapex-arm64.apex"
5094 if prebuilt.inputApex.String() != expectedInput {
5095 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5096 }
Wei Li340ee8e2022-03-18 17:33:24 -07005097 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5098 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5099 rule := testingModule.Rule("genProvenanceMetaData")
5100 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5101 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5102 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5103 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005104
5105 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5106 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005107}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005108
Paul Duffinc0609c62021-03-01 17:27:16 +00005109func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005110 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005111 prebuilt_apex {
5112 name: "myapex",
5113 }
5114 `)
5115}
5116
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005117func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005118 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005119 prebuilt_apex {
5120 name: "myapex",
5121 src: "myapex-arm.apex",
5122 filename: "notmyapex.apex",
5123 }
5124 `)
5125
Wei Li340ee8e2022-03-18 17:33:24 -07005126 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5127 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005128
5129 expected := "notmyapex.apex"
5130 if p.installFilename != expected {
5131 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5132 }
Wei Li340ee8e2022-03-18 17:33:24 -07005133 rule := testingModule.Rule("genProvenanceMetaData")
5134 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5135 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5136 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5137 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005138}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005139
Samiul Islam7c02e262021-09-08 17:48:28 +01005140func TestApexSetFilenameOverride(t *testing.T) {
5141 testApex(t, `
5142 apex_set {
5143 name: "com.company.android.myapex",
5144 apex_name: "com.android.myapex",
5145 set: "company-myapex.apks",
5146 filename: "com.company.android.myapex.apex"
5147 }
5148 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5149
5150 testApex(t, `
5151 apex_set {
5152 name: "com.company.android.myapex",
5153 apex_name: "com.android.myapex",
5154 set: "company-myapex.apks",
5155 filename: "com.company.android.myapex.capex"
5156 }
5157 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5158
5159 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5160 apex_set {
5161 name: "com.company.android.myapex",
5162 apex_name: "com.android.myapex",
5163 set: "company-myapex.apks",
5164 filename: "some-random-suffix"
5165 }
5166 `)
5167}
5168
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005169func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005170 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005171 prebuilt_apex {
5172 name: "myapex.prebuilt",
5173 src: "myapex-arm.apex",
5174 overrides: [
5175 "myapex",
5176 ],
5177 }
5178 `)
5179
Wei Li340ee8e2022-03-18 17:33:24 -07005180 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5181 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005182
5183 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005184 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005185 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005186 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005187 }
Wei Li340ee8e2022-03-18 17:33:24 -07005188 rule := testingModule.Rule("genProvenanceMetaData")
5189 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5190 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5191 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5192 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005193}
5194
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005195func TestPrebuiltApexName(t *testing.T) {
5196 testApex(t, `
5197 prebuilt_apex {
5198 name: "com.company.android.myapex",
5199 apex_name: "com.android.myapex",
5200 src: "company-myapex-arm.apex",
5201 }
5202 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5203
5204 testApex(t, `
5205 apex_set {
5206 name: "com.company.android.myapex",
5207 apex_name: "com.android.myapex",
5208 set: "company-myapex.apks",
5209 }
5210 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5211}
5212
5213func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5214 _ = android.GroupFixturePreparers(
5215 java.PrepareForTestWithJavaDefaultModules,
5216 PrepareForTestWithApexBuildComponents,
5217 android.FixtureWithRootAndroidBp(`
5218 platform_bootclasspath {
5219 name: "platform-bootclasspath",
5220 fragments: [
5221 {
5222 apex: "com.android.art",
5223 module: "art-bootclasspath-fragment",
5224 },
5225 ],
5226 }
5227
5228 prebuilt_apex {
5229 name: "com.company.android.art",
5230 apex_name: "com.android.art",
5231 src: "com.company.android.art-arm.apex",
5232 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5233 }
5234
5235 prebuilt_bootclasspath_fragment {
5236 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005237 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005238 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005239 hidden_api: {
5240 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5241 metadata: "my-bootclasspath-fragment/metadata.csv",
5242 index: "my-bootclasspath-fragment/index.csv",
5243 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5244 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5245 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005246 }
5247
5248 java_import {
5249 name: "core-oj",
5250 jars: ["prebuilt.jar"],
5251 }
5252 `),
5253 ).RunTest(t)
5254}
5255
Paul Duffin092153d2021-01-26 11:42:39 +00005256// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5257// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005258func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005259 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005260
Paul Duffin89886cb2021-02-05 16:44:03 +00005261 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005262 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005263 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005264 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005265 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005266 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005267 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5268 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5269 android.NormalizePathForTesting(dexJarBuildPath))
5270 }
5271
5272 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005273 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005274 // Make sure the import has been given the correct path to the dex jar.
5275 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5276 dexJarBuildPath := p.DexJarInstallPath()
5277 stem := android.RemoveOptionalPrebuiltPrefix(name)
5278 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5279 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5280 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005281 }
5282
Paul Duffin39853512021-02-26 11:09:39 +00005283 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005284 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005285 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005286 android.AssertArrayString(t, "Check if there is no source variant",
5287 []string{"android_common"},
5288 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005289 }
5290
5291 t.Run("prebuilt only", func(t *testing.T) {
5292 bp := `
5293 prebuilt_apex {
5294 name: "myapex",
5295 arch: {
5296 arm64: {
5297 src: "myapex-arm64.apex",
5298 },
5299 arm: {
5300 src: "myapex-arm.apex",
5301 },
5302 },
Paul Duffin39853512021-02-26 11:09:39 +00005303 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005304 }
5305
5306 java_import {
5307 name: "libfoo",
5308 jars: ["libfoo.jar"],
5309 }
Paul Duffin39853512021-02-26 11:09:39 +00005310
5311 java_sdk_library_import {
5312 name: "libbar",
5313 public: {
5314 jars: ["libbar.jar"],
5315 },
5316 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005317 `
5318
5319 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5320 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5321
Martin Stjernholm44825602021-09-17 01:44:12 +01005322 deapexerName := deapexerModuleName("myapex")
5323 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5324
Paul Duffinf6932af2021-02-26 18:21:56 +00005325 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005326 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005327 rule := deapexer.Rule("deapexer")
5328 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5329 t.Errorf("expected: %q, found: %q", expected, actual)
5330 }
5331
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005332 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005333 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005334 rule = prebuiltApex.Rule("android/soong/android.Cp")
5335 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5336 t.Errorf("expected: %q, found: %q", expected, actual)
5337 }
5338
Paul Duffin89886cb2021-02-05 16:44:03 +00005339 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005340 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005341
5342 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005343 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005344 })
5345
5346 t.Run("prebuilt with source preferred", func(t *testing.T) {
5347
5348 bp := `
5349 prebuilt_apex {
5350 name: "myapex",
5351 arch: {
5352 arm64: {
5353 src: "myapex-arm64.apex",
5354 },
5355 arm: {
5356 src: "myapex-arm.apex",
5357 },
5358 },
Paul Duffin39853512021-02-26 11:09:39 +00005359 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005360 }
5361
5362 java_import {
5363 name: "libfoo",
5364 jars: ["libfoo.jar"],
5365 }
5366
5367 java_library {
5368 name: "libfoo",
5369 }
Paul Duffin39853512021-02-26 11:09:39 +00005370
5371 java_sdk_library_import {
5372 name: "libbar",
5373 public: {
5374 jars: ["libbar.jar"],
5375 },
5376 }
5377
5378 java_sdk_library {
5379 name: "libbar",
5380 srcs: ["foo/bar/MyClass.java"],
5381 unsafe_ignore_missing_latest_api: true,
5382 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005383 `
5384
5385 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5386 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5387
Paul Duffin89886cb2021-02-05 16:44:03 +00005388 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005389 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005390 ensureNoSourceVariant(t, ctx, "libfoo")
5391
5392 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005393 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005394 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005395 })
5396
5397 t.Run("prebuilt preferred with source", func(t *testing.T) {
5398 bp := `
5399 prebuilt_apex {
5400 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005401 arch: {
5402 arm64: {
5403 src: "myapex-arm64.apex",
5404 },
5405 arm: {
5406 src: "myapex-arm.apex",
5407 },
5408 },
Paul Duffin39853512021-02-26 11:09:39 +00005409 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005410 }
5411
5412 java_import {
5413 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005414 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005415 jars: ["libfoo.jar"],
5416 }
5417
5418 java_library {
5419 name: "libfoo",
5420 }
Paul Duffin39853512021-02-26 11:09:39 +00005421
5422 java_sdk_library_import {
5423 name: "libbar",
5424 prefer: true,
5425 public: {
5426 jars: ["libbar.jar"],
5427 },
5428 }
5429
5430 java_sdk_library {
5431 name: "libbar",
5432 srcs: ["foo/bar/MyClass.java"],
5433 unsafe_ignore_missing_latest_api: true,
5434 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005435 `
5436
5437 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5438 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5439
Paul Duffin89886cb2021-02-05 16:44:03 +00005440 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005441 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005442 ensureNoSourceVariant(t, ctx, "libfoo")
5443
5444 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005445 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005446 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005447 })
5448}
5449
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005450func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005451 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005452 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005453 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5454 // is disabled.
5455 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5456 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005457
Paul Duffin37856732021-02-26 14:24:15 +00005458 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5459 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005460 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005461 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005462 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005463 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005464 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005465 foundLibfooJar = true
5466 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005467 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005468 }
5469 }
5470 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005471 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 +00005472 }
5473 }
5474
Paul Duffin40a3f652021-07-19 13:11:24 +01005475 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005476 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005477 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005478 var rule android.TestingBuildParams
5479
5480 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5481 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005482 }
5483
Paul Duffin40a3f652021-07-19 13:11:24 +01005484 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5485 t.Helper()
5486 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5487 var rule android.TestingBuildParams
5488
5489 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5490 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5491 }
5492
Paul Duffin89f570a2021-06-16 01:42:33 +01005493 fragment := java.ApexVariantReference{
5494 Apex: proptools.StringPtr("myapex"),
5495 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5496 }
5497
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005498 t.Run("prebuilt only", func(t *testing.T) {
5499 bp := `
5500 prebuilt_apex {
5501 name: "myapex",
5502 arch: {
5503 arm64: {
5504 src: "myapex-arm64.apex",
5505 },
5506 arm: {
5507 src: "myapex-arm.apex",
5508 },
5509 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005510 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5511 }
5512
5513 prebuilt_bootclasspath_fragment {
5514 name: "my-bootclasspath-fragment",
5515 contents: ["libfoo", "libbar"],
5516 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005517 hidden_api: {
5518 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5519 metadata: "my-bootclasspath-fragment/metadata.csv",
5520 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005521 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5522 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5523 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005524 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005525 }
5526
5527 java_import {
5528 name: "libfoo",
5529 jars: ["libfoo.jar"],
5530 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005531 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005532 }
Paul Duffin37856732021-02-26 14:24:15 +00005533
5534 java_sdk_library_import {
5535 name: "libbar",
5536 public: {
5537 jars: ["libbar.jar"],
5538 },
5539 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005540 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005541 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005542 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005543 `
5544
Paul Duffin89f570a2021-06-16 01:42:33 +01005545 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005546 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5547 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005548
Paul Duffin537ea3d2021-05-14 10:38:00 +01005549 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005550 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005551 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005552 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005553 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5554 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005555 })
5556
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005557 t.Run("apex_set only", func(t *testing.T) {
5558 bp := `
5559 apex_set {
5560 name: "myapex",
5561 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005562 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005563 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005564 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5565 }
5566
5567 java_import {
5568 name: "myjavalib",
5569 jars: ["myjavalib.jar"],
5570 apex_available: ["myapex"],
5571 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005572 }
5573
5574 prebuilt_bootclasspath_fragment {
5575 name: "my-bootclasspath-fragment",
5576 contents: ["libfoo", "libbar"],
5577 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005578 hidden_api: {
5579 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5580 metadata: "my-bootclasspath-fragment/metadata.csv",
5581 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005582 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5583 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5584 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005585 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005586 }
5587
Liz Kammer2dc72442023-04-20 10:10:48 -04005588 prebuilt_systemserverclasspath_fragment {
5589 name: "my-systemserverclasspath-fragment",
5590 contents: ["libbaz"],
5591 apex_available: ["myapex"],
5592 }
5593
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005594 java_import {
5595 name: "libfoo",
5596 jars: ["libfoo.jar"],
5597 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005598 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005599 }
5600
5601 java_sdk_library_import {
5602 name: "libbar",
5603 public: {
5604 jars: ["libbar.jar"],
5605 },
5606 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005607 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005608 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005609 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005610
5611 java_sdk_library_import {
5612 name: "libbaz",
5613 public: {
5614 jars: ["libbaz.jar"],
5615 },
5616 apex_available: ["myapex"],
5617 shared_library: false,
5618 permitted_packages: ["baz"],
5619 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005620 `
5621
Paul Duffin89f570a2021-06-16 01:42:33 +01005622 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005623 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5624 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5625
Paul Duffin537ea3d2021-05-14 10:38:00 +01005626 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005627 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005628 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005629 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005630 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5631 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005632
5633 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5634
5635 overrideNames := []string{
5636 "",
5637 "myjavalib.myapex",
5638 "libfoo.myapex",
5639 "libbar.myapex",
5640 "libbaz.myapex",
5641 }
5642 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5643 for i, e := range mkEntries {
5644 g := e.OverrideName
5645 if w := overrideNames[i]; w != g {
5646 t.Errorf("Expected override name %q, got %q", w, g)
5647 }
5648 }
5649
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005650 })
5651
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005652 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5653 bp := `
5654 prebuilt_apex {
5655 name: "myapex",
5656 arch: {
5657 arm64: {
5658 src: "myapex-arm64.apex",
5659 },
5660 arm: {
5661 src: "myapex-arm.apex",
5662 },
5663 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005664 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5665 }
5666
5667 prebuilt_bootclasspath_fragment {
5668 name: "my-bootclasspath-fragment",
5669 contents: ["libfoo", "libbar"],
5670 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005671 hidden_api: {
5672 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5673 metadata: "my-bootclasspath-fragment/metadata.csv",
5674 index: "my-bootclasspath-fragment/index.csv",
5675 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5676 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5677 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005678 }
5679
5680 java_import {
5681 name: "libfoo",
5682 jars: ["libfoo.jar"],
5683 apex_available: ["myapex"],
5684 }
5685
5686 java_library {
5687 name: "libfoo",
5688 srcs: ["foo/bar/MyClass.java"],
5689 apex_available: ["myapex"],
5690 }
Paul Duffin37856732021-02-26 14:24:15 +00005691
5692 java_sdk_library_import {
5693 name: "libbar",
5694 public: {
5695 jars: ["libbar.jar"],
5696 },
5697 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005698 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005699 }
5700
5701 java_sdk_library {
5702 name: "libbar",
5703 srcs: ["foo/bar/MyClass.java"],
5704 unsafe_ignore_missing_latest_api: true,
5705 apex_available: ["myapex"],
5706 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005707 `
5708
5709 // In this test the source (java_library) libfoo is active since the
5710 // prebuilt (java_import) defaults to prefer:false. However the
5711 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5712 // find the dex boot jar in it. We either need to disable the source libfoo
5713 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005714 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005715 // dexbootjar check is skipped if AllowMissingDependencies is true
5716 preparerAllowMissingDeps := android.GroupFixturePreparers(
5717 preparer,
5718 android.PrepareForTestWithAllowMissingDependencies,
5719 )
5720 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005721 })
5722
5723 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5724 bp := `
5725 prebuilt_apex {
5726 name: "myapex",
5727 arch: {
5728 arm64: {
5729 src: "myapex-arm64.apex",
5730 },
5731 arm: {
5732 src: "myapex-arm.apex",
5733 },
5734 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005735 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5736 }
5737
5738 prebuilt_bootclasspath_fragment {
5739 name: "my-bootclasspath-fragment",
5740 contents: ["libfoo", "libbar"],
5741 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005742 hidden_api: {
5743 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5744 metadata: "my-bootclasspath-fragment/metadata.csv",
5745 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005746 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5747 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5748 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005749 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005750 }
5751
5752 java_import {
5753 name: "libfoo",
5754 prefer: true,
5755 jars: ["libfoo.jar"],
5756 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005757 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005758 }
5759
5760 java_library {
5761 name: "libfoo",
5762 srcs: ["foo/bar/MyClass.java"],
5763 apex_available: ["myapex"],
5764 }
Paul Duffin37856732021-02-26 14:24:15 +00005765
5766 java_sdk_library_import {
5767 name: "libbar",
5768 prefer: true,
5769 public: {
5770 jars: ["libbar.jar"],
5771 },
5772 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005773 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005774 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005775 }
5776
5777 java_sdk_library {
5778 name: "libbar",
5779 srcs: ["foo/bar/MyClass.java"],
5780 unsafe_ignore_missing_latest_api: true,
5781 apex_available: ["myapex"],
5782 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005783 `
5784
Paul Duffin89f570a2021-06-16 01:42:33 +01005785 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005786 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5787 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005788
Paul Duffin537ea3d2021-05-14 10:38:00 +01005789 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005790 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005791 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005792 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005793 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5794 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005795 })
5796
5797 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5798 bp := `
5799 apex {
5800 name: "myapex",
5801 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005802 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005803 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005804 }
5805
5806 apex_key {
5807 name: "myapex.key",
5808 public_key: "testkey.avbpubkey",
5809 private_key: "testkey.pem",
5810 }
5811
5812 prebuilt_apex {
5813 name: "myapex",
5814 arch: {
5815 arm64: {
5816 src: "myapex-arm64.apex",
5817 },
5818 arm: {
5819 src: "myapex-arm.apex",
5820 },
5821 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005822 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5823 }
5824
5825 prebuilt_bootclasspath_fragment {
5826 name: "my-bootclasspath-fragment",
5827 contents: ["libfoo", "libbar"],
5828 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005829 hidden_api: {
5830 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5831 metadata: "my-bootclasspath-fragment/metadata.csv",
5832 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005833 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5834 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5835 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005836 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005837 }
5838
5839 java_import {
5840 name: "libfoo",
5841 jars: ["libfoo.jar"],
5842 apex_available: ["myapex"],
5843 }
5844
5845 java_library {
5846 name: "libfoo",
5847 srcs: ["foo/bar/MyClass.java"],
5848 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005849 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005850 }
Paul Duffin37856732021-02-26 14:24:15 +00005851
5852 java_sdk_library_import {
5853 name: "libbar",
5854 public: {
5855 jars: ["libbar.jar"],
5856 },
5857 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005858 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005859 }
5860
5861 java_sdk_library {
5862 name: "libbar",
5863 srcs: ["foo/bar/MyClass.java"],
5864 unsafe_ignore_missing_latest_api: true,
5865 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005866 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005867 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005868 `
5869
Paul Duffin89f570a2021-06-16 01:42:33 +01005870 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005871 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5872 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005873
Paul Duffin537ea3d2021-05-14 10:38:00 +01005874 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005875 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005876 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005877 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005878 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5879 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005880 })
5881
5882 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5883 bp := `
5884 apex {
5885 name: "myapex",
5886 enabled: false,
5887 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005888 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005889 }
5890
5891 apex_key {
5892 name: "myapex.key",
5893 public_key: "testkey.avbpubkey",
5894 private_key: "testkey.pem",
5895 }
5896
5897 prebuilt_apex {
5898 name: "myapex",
5899 arch: {
5900 arm64: {
5901 src: "myapex-arm64.apex",
5902 },
5903 arm: {
5904 src: "myapex-arm.apex",
5905 },
5906 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005907 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5908 }
5909
5910 prebuilt_bootclasspath_fragment {
5911 name: "my-bootclasspath-fragment",
5912 contents: ["libfoo", "libbar"],
5913 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005914 hidden_api: {
5915 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5916 metadata: "my-bootclasspath-fragment/metadata.csv",
5917 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005918 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5919 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5920 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005921 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005922 }
5923
5924 java_import {
5925 name: "libfoo",
5926 prefer: true,
5927 jars: ["libfoo.jar"],
5928 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005929 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005930 }
5931
5932 java_library {
5933 name: "libfoo",
5934 srcs: ["foo/bar/MyClass.java"],
5935 apex_available: ["myapex"],
5936 }
Paul Duffin37856732021-02-26 14:24:15 +00005937
5938 java_sdk_library_import {
5939 name: "libbar",
5940 prefer: true,
5941 public: {
5942 jars: ["libbar.jar"],
5943 },
5944 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005945 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005946 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005947 }
5948
5949 java_sdk_library {
5950 name: "libbar",
5951 srcs: ["foo/bar/MyClass.java"],
5952 unsafe_ignore_missing_latest_api: true,
5953 apex_available: ["myapex"],
5954 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005955 `
5956
Paul Duffin89f570a2021-06-16 01:42:33 +01005957 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005958 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5959 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005960
Paul Duffin537ea3d2021-05-14 10:38:00 +01005961 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005962 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005963 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005964 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005965 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5966 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005967 })
5968}
5969
Roland Levillain630846d2019-06-26 12:48:34 +01005970func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005971 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005972 apex_test {
5973 name: "myapex",
5974 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005975 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005976 tests: [
5977 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005978 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005979 ],
5980 }
5981
5982 apex_key {
5983 name: "myapex.key",
5984 public_key: "testkey.avbpubkey",
5985 private_key: "testkey.pem",
5986 }
5987
Liz Kammer1c14a212020-05-12 15:26:55 -07005988 filegroup {
5989 name: "fg",
5990 srcs: [
5991 "baz",
5992 "bar/baz"
5993 ],
5994 }
5995
Roland Levillain630846d2019-06-26 12:48:34 +01005996 cc_test {
5997 name: "mytest",
5998 gtest: false,
5999 srcs: ["mytest.cpp"],
6000 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006001 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006002 system_shared_libs: [],
6003 static_executable: true,
6004 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006005 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006006 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006007
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006008 cc_library {
6009 name: "mylib",
6010 srcs: ["mylib.cpp"],
6011 system_shared_libs: [],
6012 stl: "none",
6013 }
6014
Liz Kammer5bd365f2020-05-27 15:15:11 -07006015 filegroup {
6016 name: "fg2",
6017 srcs: [
6018 "testdata/baz"
6019 ],
6020 }
6021
Roland Levillain9b5fde92019-06-28 15:41:19 +01006022 cc_test {
6023 name: "mytests",
6024 gtest: false,
6025 srcs: [
6026 "mytest1.cpp",
6027 "mytest2.cpp",
6028 "mytest3.cpp",
6029 ],
6030 test_per_src: true,
6031 relative_install_path: "test",
6032 system_shared_libs: [],
6033 static_executable: true,
6034 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006035 data: [
6036 ":fg",
6037 ":fg2",
6038 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006039 }
Roland Levillain630846d2019-06-26 12:48:34 +01006040 `)
6041
Sundong Ahnabb64432019-10-22 13:58:29 +09006042 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006043 copyCmds := apexRule.Args["copy_commands"]
6044
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006045 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006046 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006047 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006048
Liz Kammer1c14a212020-05-12 15:26:55 -07006049 //Ensure that test data are copied into apex.
6050 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6051 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6052
Roland Levillain9b5fde92019-06-28 15:41:19 +01006053 // Ensure that test deps built with `test_per_src` are copied into apex.
6054 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6055 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6056 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006057
6058 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07006059 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006060 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006061 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006062 prefix := "TARGET_"
6063 var builder strings.Builder
6064 data.Custom(&builder, name, prefix, "", data)
6065 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006066 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6067 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6068 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6069 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
6070 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
6071 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006072 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07006073
6074 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006075 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006076 data.Custom(&builder, name, prefix, "", data)
6077 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07006078 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
6079 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006080}
6081
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006082func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006083 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006084 apex {
6085 name: "myapex",
6086 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006087 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006088 }
6089 apex_key {
6090 name: "myapex.key",
6091 public_key: "testkey.avbpubkey",
6092 private_key: "testkey.pem",
6093 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00006094 `,
6095 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6096 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
6097 }),
6098 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006099 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00006100 ensureListContains(t, ab.makeModulesToInstall, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07006101 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006102 var builder strings.Builder
6103 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
6104 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006105 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex myapex.flattened\n")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006106}
6107
Jooyung Hand48f3c32019-08-23 11:18:57 +09006108func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6109 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6110 apex {
6111 name: "myapex",
6112 key: "myapex.key",
6113 native_shared_libs: ["libfoo"],
6114 }
6115
6116 apex_key {
6117 name: "myapex.key",
6118 public_key: "testkey.avbpubkey",
6119 private_key: "testkey.pem",
6120 }
6121
6122 cc_library {
6123 name: "libfoo",
6124 stl: "none",
6125 system_shared_libs: [],
6126 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006127 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006128 }
6129 `)
6130 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6131 apex {
6132 name: "myapex",
6133 key: "myapex.key",
6134 java_libs: ["myjar"],
6135 }
6136
6137 apex_key {
6138 name: "myapex.key",
6139 public_key: "testkey.avbpubkey",
6140 private_key: "testkey.pem",
6141 }
6142
6143 java_library {
6144 name: "myjar",
6145 srcs: ["foo/bar/MyClass.java"],
6146 sdk_version: "none",
6147 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006148 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006149 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006150 }
6151 `)
6152}
6153
Bill Peckhama41a6962021-01-11 10:58:54 -08006154func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006155 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006156 apex {
6157 name: "myapex",
6158 key: "myapex.key",
6159 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006160 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006161 }
6162
6163 apex_key {
6164 name: "myapex.key",
6165 public_key: "testkey.avbpubkey",
6166 private_key: "testkey.pem",
6167 }
6168
6169 java_import {
6170 name: "myjavaimport",
6171 apex_available: ["myapex"],
6172 jars: ["my.jar"],
6173 compile_dex: true,
6174 }
6175 `)
6176
6177 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6178 apexRule := module.Rule("apexRule")
6179 copyCmds := apexRule.Args["copy_commands"]
6180 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6181}
6182
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006183func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006184 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006185 apex {
6186 name: "myapex",
6187 key: "myapex.key",
6188 apps: [
6189 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006190 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006191 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006192 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006193 }
6194
6195 apex_key {
6196 name: "myapex.key",
6197 public_key: "testkey.avbpubkey",
6198 private_key: "testkey.pem",
6199 }
6200
6201 android_app {
6202 name: "AppFoo",
6203 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006204 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006205 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006206 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006207 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006208 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006209 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006210
6211 android_app {
6212 name: "AppFooPriv",
6213 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006214 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006215 system_modules: "none",
6216 privileged: true,
Andrei Onea580636b2022-08-17 16:53:46 +00006217 privapp_allowlist: "perms.xml",
6218 package_name: "com.android.AppFooPriv",
Colin Cross094cde42020-02-15 10:38:00 -08006219 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006220 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006221 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006222
6223 cc_library_shared {
6224 name: "libjni",
6225 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006226 shared_libs: ["libfoo"],
6227 stl: "none",
6228 system_shared_libs: [],
6229 apex_available: [ "myapex" ],
6230 sdk_version: "current",
6231 }
6232
6233 cc_library_shared {
6234 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006235 stl: "none",
6236 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006237 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006238 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006239 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006240 `)
6241
Sundong Ahnabb64432019-10-22 13:58:29 +09006242 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006243 apexRule := module.Rule("apexRule")
6244 copyCmds := apexRule.Args["copy_commands"]
6245
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006246 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6247 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006248 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006249
Colin Crossaede88c2020-08-11 12:17:01 -07006250 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006251 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006252 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006253 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006254 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006255 // JNI libraries including transitive deps are
6256 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006257 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006258 // ... embedded inside APK (jnilibs.zip)
6259 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6260 // ... and not directly inside the APEX
6261 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6262 }
Dario Frenicde2a032019-10-27 00:29:22 +01006263}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006264
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006265func TestApexWithAppImportBuildId(t *testing.T) {
6266 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6267 for _, id := range invalidBuildIds {
6268 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6269 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6270 variables.BuildId = proptools.StringPtr(id)
6271 })
6272 testApexError(t, message, `apex {
6273 name: "myapex",
6274 key: "myapex.key",
6275 apps: ["AppFooPrebuilt"],
6276 updatable: false,
6277 }
6278
6279 apex_key {
6280 name: "myapex.key",
6281 public_key: "testkey.avbpubkey",
6282 private_key: "testkey.pem",
6283 }
6284
6285 android_app_import {
6286 name: "AppFooPrebuilt",
6287 apk: "PrebuiltAppFoo.apk",
6288 presigned: true,
6289 apex_available: ["myapex"],
6290 }
6291 `, fixture)
6292 }
6293}
6294
Dario Frenicde2a032019-10-27 00:29:22 +01006295func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006296 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006297 apex {
6298 name: "myapex",
6299 key: "myapex.key",
6300 apps: [
6301 "AppFooPrebuilt",
6302 "AppFooPrivPrebuilt",
6303 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006304 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006305 }
6306
6307 apex_key {
6308 name: "myapex.key",
6309 public_key: "testkey.avbpubkey",
6310 private_key: "testkey.pem",
6311 }
6312
6313 android_app_import {
6314 name: "AppFooPrebuilt",
6315 apk: "PrebuiltAppFoo.apk",
6316 presigned: true,
6317 dex_preopt: {
6318 enabled: false,
6319 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006320 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006321 }
6322
6323 android_app_import {
6324 name: "AppFooPrivPrebuilt",
6325 apk: "PrebuiltAppFooPriv.apk",
6326 privileged: true,
6327 presigned: true,
6328 dex_preopt: {
6329 enabled: false,
6330 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006331 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006332 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006333 }
6334 `)
6335
Sundong Ahnabb64432019-10-22 13:58:29 +09006336 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01006337 apexRule := module.Rule("apexRule")
6338 copyCmds := apexRule.Args["copy_commands"]
6339
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006340 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6341 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006342}
6343
6344func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006345 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006346 apex {
6347 name: "myapex",
6348 key: "myapex.key",
6349 apps: [
6350 "AppFoo",
6351 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006352 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006353 }
6354
6355 apex_key {
6356 name: "myapex.key",
6357 public_key: "testkey.avbpubkey",
6358 private_key: "testkey.pem",
6359 }
6360
6361 android_app {
6362 name: "AppFoo",
6363 srcs: ["foo/bar/MyClass.java"],
6364 sdk_version: "none",
6365 system_modules: "none",
6366 apex_available: [ "myapex" ],
6367 }
6368
6369 android_app_import {
6370 name: "AppFoo",
6371 apk: "AppFooPrebuilt.apk",
6372 filename: "AppFooPrebuilt.apk",
6373 presigned: true,
6374 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006375 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006376 }
6377 `, withFiles(map[string][]byte{
6378 "AppFooPrebuilt.apk": nil,
6379 }))
6380
6381 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006382 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006383 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006384}
6385
Dario Freni6f3937c2019-12-20 22:58:03 +00006386func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006387 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006388 apex {
6389 name: "myapex",
6390 key: "myapex.key",
6391 apps: [
6392 "TesterHelpAppFoo",
6393 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006394 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006395 }
6396
6397 apex_key {
6398 name: "myapex.key",
6399 public_key: "testkey.avbpubkey",
6400 private_key: "testkey.pem",
6401 }
6402
6403 android_test_helper_app {
6404 name: "TesterHelpAppFoo",
6405 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006406 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006407 }
6408
6409 `)
6410
6411 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6412 apexRule := module.Rule("apexRule")
6413 copyCmds := apexRule.Args["copy_commands"]
6414
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006415 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006416}
6417
Jooyung Han18020ea2019-11-13 10:50:48 +09006418func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6419 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006420 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006421 apex {
6422 name: "myapex",
6423 key: "myapex.key",
6424 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006425 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006426 }
6427
6428 apex_key {
6429 name: "myapex.key",
6430 public_key: "testkey.avbpubkey",
6431 private_key: "testkey.pem",
6432 }
6433
6434 apex {
6435 name: "otherapex",
6436 key: "myapex.key",
6437 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006438 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006439 }
6440
6441 cc_defaults {
6442 name: "libfoo-defaults",
6443 apex_available: ["otherapex"],
6444 }
6445
6446 cc_library {
6447 name: "libfoo",
6448 defaults: ["libfoo-defaults"],
6449 stl: "none",
6450 system_shared_libs: [],
6451 }`)
6452}
6453
Paul Duffine52e66f2020-03-30 17:54:29 +01006454func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006455 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006456 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006457 apex {
6458 name: "myapex",
6459 key: "myapex.key",
6460 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006461 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +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: "otherapex.key",
6473 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006474 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006475 }
6476
6477 apex_key {
6478 name: "otherapex.key",
6479 public_key: "testkey.avbpubkey",
6480 private_key: "testkey.pem",
6481 }
6482
6483 cc_library {
6484 name: "libfoo",
6485 stl: "none",
6486 system_shared_libs: [],
6487 apex_available: ["otherapex"],
6488 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006489}
Jiyong Park127b40b2019-09-30 16:04:35 +09006490
Paul Duffine52e66f2020-03-30 17:54:29 +01006491func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006492 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006493 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006494.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006495.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006496.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006497.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006498.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006499.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006500 apex {
6501 name: "myapex",
6502 key: "myapex.key",
6503 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006504 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006505 }
6506
6507 apex_key {
6508 name: "myapex.key",
6509 public_key: "testkey.avbpubkey",
6510 private_key: "testkey.pem",
6511 }
6512
Jiyong Park127b40b2019-09-30 16:04:35 +09006513 cc_library {
6514 name: "libfoo",
6515 stl: "none",
6516 shared_libs: ["libbar"],
6517 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006518 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006519 }
6520
6521 cc_library {
6522 name: "libbar",
6523 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006524 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006525 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006526 apex_available: ["myapex"],
6527 }
6528
6529 cc_library {
6530 name: "libbaz",
6531 stl: "none",
6532 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006533 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006534}
Jiyong Park127b40b2019-09-30 16:04:35 +09006535
Paul Duffine52e66f2020-03-30 17:54:29 +01006536func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006537 testApexError(t, "\"otherapex\" is not a valid module name", `
6538 apex {
6539 name: "myapex",
6540 key: "myapex.key",
6541 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006542 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006543 }
6544
6545 apex_key {
6546 name: "myapex.key",
6547 public_key: "testkey.avbpubkey",
6548 private_key: "testkey.pem",
6549 }
6550
6551 cc_library {
6552 name: "libfoo",
6553 stl: "none",
6554 system_shared_libs: [],
6555 apex_available: ["otherapex"],
6556 }`)
6557
Paul Duffine52e66f2020-03-30 17:54:29 +01006558 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006559 apex {
6560 name: "myapex",
6561 key: "myapex.key",
6562 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006563 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006564 }
6565
6566 apex_key {
6567 name: "myapex.key",
6568 public_key: "testkey.avbpubkey",
6569 private_key: "testkey.pem",
6570 }
6571
6572 cc_library {
6573 name: "libfoo",
6574 stl: "none",
6575 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006576 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006577 apex_available: ["myapex"],
6578 }
6579
6580 cc_library {
6581 name: "libbar",
6582 stl: "none",
6583 system_shared_libs: [],
6584 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006585 }
6586
6587 cc_library {
6588 name: "libbaz",
6589 stl: "none",
6590 system_shared_libs: [],
6591 stubs: {
6592 versions: ["10", "20", "30"],
6593 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006594 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006595}
Jiyong Park127b40b2019-09-30 16:04:35 +09006596
Jiyong Park89e850a2020-04-07 16:37:39 +09006597func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006598 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006599 apex {
6600 name: "myapex",
6601 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006602 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006603 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006604 }
6605
6606 apex_key {
6607 name: "myapex.key",
6608 public_key: "testkey.avbpubkey",
6609 private_key: "testkey.pem",
6610 }
6611
6612 cc_library {
6613 name: "libfoo",
6614 stl: "none",
6615 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006616 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006617 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006618 }
6619
6620 cc_library {
6621 name: "libfoo2",
6622 stl: "none",
6623 system_shared_libs: [],
6624 shared_libs: ["libbaz"],
6625 apex_available: ["//apex_available:platform"],
6626 }
6627
6628 cc_library {
6629 name: "libbar",
6630 stl: "none",
6631 system_shared_libs: [],
6632 apex_available: ["myapex"],
6633 }
6634
6635 cc_library {
6636 name: "libbaz",
6637 stl: "none",
6638 system_shared_libs: [],
6639 apex_available: ["myapex"],
6640 stubs: {
6641 versions: ["1"],
6642 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006643 }`)
6644
Jiyong Park89e850a2020-04-07 16:37:39 +09006645 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6646 // because it depends on libbar which isn't available to platform
6647 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6648 if libfoo.NotAvailableForPlatform() != true {
6649 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6650 }
6651
6652 // libfoo2 however can be available to platform because it depends on libbaz which provides
6653 // stubs
6654 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6655 if libfoo2.NotAvailableForPlatform() == true {
6656 t.Errorf("%q should be available to platform", libfoo2.String())
6657 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006658}
Jiyong Parka90ca002019-10-07 15:47:24 +09006659
Paul Duffine52e66f2020-03-30 17:54:29 +01006660func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006661 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006662 apex {
6663 name: "myapex",
6664 key: "myapex.key",
6665 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006666 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006667 }
6668
6669 apex_key {
6670 name: "myapex.key",
6671 public_key: "testkey.avbpubkey",
6672 private_key: "testkey.pem",
6673 }
6674
6675 cc_library {
6676 name: "libfoo",
6677 stl: "none",
6678 system_shared_libs: [],
6679 apex_available: ["myapex"],
6680 static: {
6681 apex_available: ["//apex_available:platform"],
6682 },
6683 }`)
6684
Jiyong Park89e850a2020-04-07 16:37:39 +09006685 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6686 if libfooShared.NotAvailableForPlatform() != true {
6687 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6688 }
6689 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6690 if libfooStatic.NotAvailableForPlatform() != false {
6691 t.Errorf("%q should be available to platform", libfooStatic.String())
6692 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006693}
6694
Jiyong Park5d790c32019-11-15 18:40:32 +09006695func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006696 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006697 apex {
6698 name: "myapex",
6699 key: "myapex.key",
6700 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006701 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006702 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006703 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006704 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006705 }
6706
6707 override_apex {
6708 name: "override_myapex",
6709 base: "myapex",
6710 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006711 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006712 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006713 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006714 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006715 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006716 key: "mynewapex.key",
6717 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006718 }
6719
6720 apex_key {
6721 name: "myapex.key",
6722 public_key: "testkey.avbpubkey",
6723 private_key: "testkey.pem",
6724 }
6725
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006726 apex_key {
6727 name: "mynewapex.key",
6728 public_key: "testkey2.avbpubkey",
6729 private_key: "testkey2.pem",
6730 }
6731
6732 android_app_certificate {
6733 name: "myapex.certificate",
6734 certificate: "testkey",
6735 }
6736
Jiyong Park5d790c32019-11-15 18:40:32 +09006737 android_app {
6738 name: "app",
6739 srcs: ["foo/bar/MyClass.java"],
6740 package_name: "foo",
6741 sdk_version: "none",
6742 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006743 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006744 }
6745
6746 override_android_app {
6747 name: "override_app",
6748 base: "app",
6749 package_name: "bar",
6750 }
markchien7c803b82021-08-26 22:10:06 +08006751
6752 bpf {
6753 name: "bpf",
6754 srcs: ["bpf.c"],
6755 }
6756
6757 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006758 name: "overrideBpf",
6759 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006760 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006761
6762 prebuilt_etc {
6763 name: "myetc",
6764 src: "myprebuilt",
6765 }
6766
6767 prebuilt_etc {
6768 name: "override_myetc",
6769 src: "override_myprebuilt",
6770 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006771 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006772
Jiyong Park317645e2019-12-05 13:20:58 +09006773 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6774 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6775 if originalVariant.GetOverriddenBy() != "" {
6776 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6777 }
6778 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6779 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6780 }
6781
Jiyong Park5d790c32019-11-15 18:40:32 +09006782 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6783 apexRule := module.Rule("apexRule")
6784 copyCmds := apexRule.Args["copy_commands"]
6785
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006786 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6787 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006788
markchien7c803b82021-08-26 22:10:06 +08006789 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006790 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006791
Daniel Norman5a3ce132021-08-26 15:44:43 -07006792 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6793 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6794
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006795 apexBundle := module.Module().(*apexBundle)
6796 name := apexBundle.Name()
6797 if name != "override_myapex" {
6798 t.Errorf("name should be \"override_myapex\", but was %q", name)
6799 }
6800
Baligh Uddin004d7172020-02-19 21:29:28 -08006801 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6802 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6803 }
6804
Jiyong Park20bacab2020-03-03 11:45:41 +09006805 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006806 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006807 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6808
6809 signApkRule := module.Rule("signapk")
6810 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006811
Colin Crossaa255532020-07-03 13:18:24 -07006812 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006813 var builder strings.Builder
6814 data.Custom(&builder, name, "TARGET_", "", data)
6815 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006816 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6817 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
6818 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006819 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006820 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006821 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006822 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006823 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006824 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
6825 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006826}
6827
Albert Martineefabcf2022-03-21 20:11:16 +00006828func TestMinSdkVersionOverride(t *testing.T) {
6829 // Override from 29 to 31
6830 minSdkOverride31 := "31"
6831 ctx := testApex(t, `
6832 apex {
6833 name: "myapex",
6834 key: "myapex.key",
6835 native_shared_libs: ["mylib"],
6836 updatable: true,
6837 min_sdk_version: "29"
6838 }
6839
6840 override_apex {
6841 name: "override_myapex",
6842 base: "myapex",
6843 logging_parent: "com.foo.bar",
6844 package_name: "test.overridden.package"
6845 }
6846
6847 apex_key {
6848 name: "myapex.key",
6849 public_key: "testkey.avbpubkey",
6850 private_key: "testkey.pem",
6851 }
6852
6853 cc_library {
6854 name: "mylib",
6855 srcs: ["mylib.cpp"],
6856 runtime_libs: ["libbar"],
6857 system_shared_libs: [],
6858 stl: "none",
6859 apex_available: [ "myapex" ],
6860 min_sdk_version: "apex_inherit"
6861 }
6862
6863 cc_library {
6864 name: "libbar",
6865 srcs: ["mylib.cpp"],
6866 system_shared_libs: [],
6867 stl: "none",
6868 apex_available: [ "myapex" ],
6869 min_sdk_version: "apex_inherit"
6870 }
6871
6872 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6873
6874 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6875 copyCmds := apexRule.Args["copy_commands"]
6876
6877 // Ensure that direct non-stubs dep is always included
6878 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6879
6880 // Ensure that runtime_libs dep in included
6881 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6882
6883 // Ensure libraries target overridden min_sdk_version value
6884 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6885}
6886
6887func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6888 // Attempt to override from 31 to 29, should be a NOOP
6889 minSdkOverride29 := "29"
6890 ctx := testApex(t, `
6891 apex {
6892 name: "myapex",
6893 key: "myapex.key",
6894 native_shared_libs: ["mylib"],
6895 updatable: true,
6896 min_sdk_version: "31"
6897 }
6898
6899 override_apex {
6900 name: "override_myapex",
6901 base: "myapex",
6902 logging_parent: "com.foo.bar",
6903 package_name: "test.overridden.package"
6904 }
6905
6906 apex_key {
6907 name: "myapex.key",
6908 public_key: "testkey.avbpubkey",
6909 private_key: "testkey.pem",
6910 }
6911
6912 cc_library {
6913 name: "mylib",
6914 srcs: ["mylib.cpp"],
6915 runtime_libs: ["libbar"],
6916 system_shared_libs: [],
6917 stl: "none",
6918 apex_available: [ "myapex" ],
6919 min_sdk_version: "apex_inherit"
6920 }
6921
6922 cc_library {
6923 name: "libbar",
6924 srcs: ["mylib.cpp"],
6925 system_shared_libs: [],
6926 stl: "none",
6927 apex_available: [ "myapex" ],
6928 min_sdk_version: "apex_inherit"
6929 }
6930
6931 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6932
6933 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6934 copyCmds := apexRule.Args["copy_commands"]
6935
6936 // Ensure that direct non-stubs dep is always included
6937 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6938
6939 // Ensure that runtime_libs dep in included
6940 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6941
6942 // Ensure libraries target the original min_sdk_version value rather than the overridden
6943 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6944}
6945
Jooyung Han214bf372019-11-12 13:03:50 +09006946func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006947 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006948 apex {
6949 name: "myapex",
6950 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006951 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006952 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006953 }
6954
6955 apex_key {
6956 name: "myapex.key",
6957 public_key: "testkey.avbpubkey",
6958 private_key: "testkey.pem",
6959 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006960
6961 cc_library {
6962 name: "mylib",
6963 srcs: ["mylib.cpp"],
6964 stl: "libc++",
6965 system_shared_libs: [],
6966 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006967 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006968 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006969 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006970
6971 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6972 args := module.Rule("apexRule").Args
6973 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006974 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006975
6976 // The copies of the libraries in the apex should have one more dependency than
6977 // the ones outside the apex, namely the unwinder. Ideally we should check
6978 // the dependency names directly here but for some reason the names are blank in
6979 // this test.
6980 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006981 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006982 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6983 if len(apexImplicits) != len(nonApexImplicits)+1 {
6984 t.Errorf("%q missing unwinder dep", lib)
6985 }
6986 }
Jooyung Han214bf372019-11-12 13:03:50 +09006987}
6988
Paul Duffine05480a2021-03-08 15:07:14 +00006989var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006990 "api/current.txt": nil,
6991 "api/removed.txt": nil,
6992 "api/system-current.txt": nil,
6993 "api/system-removed.txt": nil,
6994 "api/test-current.txt": nil,
6995 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006996
Anton Hanssondff2c782020-12-21 17:10:01 +00006997 "100/public/api/foo.txt": nil,
6998 "100/public/api/foo-removed.txt": nil,
6999 "100/system/api/foo.txt": nil,
7000 "100/system/api/foo-removed.txt": nil,
7001
Paul Duffineedc5d52020-06-12 17:46:39 +01007002 // For java_sdk_library_import
7003 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007004}
7005
Jooyung Han58f26ab2019-12-18 15:34:32 +09007006func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007007 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007008 apex {
7009 name: "myapex",
7010 key: "myapex.key",
7011 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007012 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007013 }
7014
7015 apex_key {
7016 name: "myapex.key",
7017 public_key: "testkey.avbpubkey",
7018 private_key: "testkey.pem",
7019 }
7020
7021 java_sdk_library {
7022 name: "foo",
7023 srcs: ["a.java"],
7024 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007025 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007026 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007027
7028 prebuilt_apis {
7029 name: "sdk",
7030 api_dirs: ["100"],
7031 }
Paul Duffin9b879592020-05-26 13:21:35 +01007032 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007033
7034 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00007035 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007036 "javalib/foo.jar",
7037 "etc/permissions/foo.xml",
7038 })
7039 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007040 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007041 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 +09007042}
7043
Paul Duffin9b879592020-05-26 13:21:35 +01007044func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007045 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007046 apex {
7047 name: "myapex",
7048 key: "myapex.key",
7049 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007050 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007051 }
7052
7053 apex_key {
7054 name: "myapex.key",
7055 public_key: "testkey.avbpubkey",
7056 private_key: "testkey.pem",
7057 }
7058
7059 java_sdk_library {
7060 name: "foo",
7061 srcs: ["a.java"],
7062 api_packages: ["foo"],
7063 apex_available: ["myapex"],
7064 sdk_version: "none",
7065 system_modules: "none",
7066 }
7067
7068 java_library {
7069 name: "bar",
7070 srcs: ["a.java"],
7071 libs: ["foo"],
7072 apex_available: ["myapex"],
7073 sdk_version: "none",
7074 system_modules: "none",
7075 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007076
7077 prebuilt_apis {
7078 name: "sdk",
7079 api_dirs: ["100"],
7080 }
Paul Duffin9b879592020-05-26 13:21:35 +01007081 `, withFiles(filesForSdkLibrary))
7082
7083 // java_sdk_library installs both impl jar and permission XML
7084 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7085 "javalib/bar.jar",
7086 "javalib/foo.jar",
7087 "etc/permissions/foo.xml",
7088 })
7089
7090 // The bar library should depend on the implementation jar.
7091 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007092 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007093 t.Errorf("expected %q, found %#q", expected, actual)
7094 }
7095}
7096
7097func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007098 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007099 apex {
7100 name: "myapex",
7101 key: "myapex.key",
7102 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007103 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007104 }
7105
7106 apex_key {
7107 name: "myapex.key",
7108 public_key: "testkey.avbpubkey",
7109 private_key: "testkey.pem",
7110 }
7111
7112 java_sdk_library {
7113 name: "foo",
7114 srcs: ["a.java"],
7115 api_packages: ["foo"],
7116 apex_available: ["myapex"],
7117 sdk_version: "none",
7118 system_modules: "none",
7119 }
7120
7121 java_library {
7122 name: "bar",
7123 srcs: ["a.java"],
7124 libs: ["foo"],
7125 sdk_version: "none",
7126 system_modules: "none",
7127 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007128
7129 prebuilt_apis {
7130 name: "sdk",
7131 api_dirs: ["100"],
7132 }
Paul Duffin9b879592020-05-26 13:21:35 +01007133 `, withFiles(filesForSdkLibrary))
7134
7135 // java_sdk_library installs both impl jar and permission XML
7136 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7137 "javalib/foo.jar",
7138 "etc/permissions/foo.xml",
7139 })
7140
7141 // The bar library should depend on the stubs jar.
7142 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007143 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007144 t.Errorf("expected %q, found %#q", expected, actual)
7145 }
7146}
7147
Paul Duffineedc5d52020-06-12 17:46:39 +01007148func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007149 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007150 prebuilt_apis {
7151 name: "sdk",
7152 api_dirs: ["100"],
7153 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007154 withFiles(map[string][]byte{
7155 "apex/a.java": nil,
7156 "apex/apex_manifest.json": nil,
7157 "apex/Android.bp": []byte(`
7158 package {
7159 default_visibility: ["//visibility:private"],
7160 }
7161
7162 apex {
7163 name: "myapex",
7164 key: "myapex.key",
7165 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007166 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007167 }
7168
7169 apex_key {
7170 name: "myapex.key",
7171 public_key: "testkey.avbpubkey",
7172 private_key: "testkey.pem",
7173 }
7174
7175 java_library {
7176 name: "bar",
7177 srcs: ["a.java"],
7178 libs: ["foo"],
7179 apex_available: ["myapex"],
7180 sdk_version: "none",
7181 system_modules: "none",
7182 }
7183`),
7184 "source/a.java": nil,
7185 "source/api/current.txt": nil,
7186 "source/api/removed.txt": nil,
7187 "source/Android.bp": []byte(`
7188 package {
7189 default_visibility: ["//visibility:private"],
7190 }
7191
7192 java_sdk_library {
7193 name: "foo",
7194 visibility: ["//apex"],
7195 srcs: ["a.java"],
7196 api_packages: ["foo"],
7197 apex_available: ["myapex"],
7198 sdk_version: "none",
7199 system_modules: "none",
7200 public: {
7201 enabled: true,
7202 },
7203 }
7204`),
7205 "prebuilt/a.jar": nil,
7206 "prebuilt/Android.bp": []byte(`
7207 package {
7208 default_visibility: ["//visibility:private"],
7209 }
7210
7211 java_sdk_library_import {
7212 name: "foo",
7213 visibility: ["//apex", "//source"],
7214 apex_available: ["myapex"],
7215 prefer: true,
7216 public: {
7217 jars: ["a.jar"],
7218 },
7219 }
7220`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007221 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007222 )
7223
7224 // java_sdk_library installs both impl jar and permission XML
7225 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7226 "javalib/bar.jar",
7227 "javalib/foo.jar",
7228 "etc/permissions/foo.xml",
7229 })
7230
7231 // The bar library should depend on the implementation jar.
7232 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007233 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007234 t.Errorf("expected %q, found %#q", expected, actual)
7235 }
7236}
7237
7238func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7239 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7240 apex {
7241 name: "myapex",
7242 key: "myapex.key",
7243 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007244 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007245 }
7246
7247 apex_key {
7248 name: "myapex.key",
7249 public_key: "testkey.avbpubkey",
7250 private_key: "testkey.pem",
7251 }
7252
7253 java_sdk_library_import {
7254 name: "foo",
7255 apex_available: ["myapex"],
7256 prefer: true,
7257 public: {
7258 jars: ["a.jar"],
7259 },
7260 }
7261
7262 `, withFiles(filesForSdkLibrary))
7263}
7264
atrost6e126252020-01-27 17:01:16 +00007265func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007266 result := android.GroupFixturePreparers(
7267 prepareForApexTest,
7268 java.PrepareForTestWithPlatformCompatConfig,
7269 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007270 apex {
7271 name: "myapex",
7272 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007273 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007274 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007275 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007276 }
7277
7278 apex_key {
7279 name: "myapex.key",
7280 public_key: "testkey.avbpubkey",
7281 private_key: "testkey.pem",
7282 }
7283
7284 platform_compat_config {
7285 name: "myjar-platform-compat-config",
7286 src: ":myjar",
7287 }
7288
7289 java_library {
7290 name: "myjar",
7291 srcs: ["foo/bar/MyClass.java"],
7292 sdk_version: "none",
7293 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007294 apex_available: [ "myapex" ],
7295 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007296
7297 // Make sure that a preferred prebuilt does not affect the apex contents.
7298 prebuilt_platform_compat_config {
7299 name: "myjar-platform-compat-config",
7300 metadata: "compat-config/metadata.xml",
7301 prefer: true,
7302 }
atrost6e126252020-01-27 17:01:16 +00007303 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007304 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007305 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7306 "etc/compatconfig/myjar-platform-compat-config.xml",
7307 "javalib/myjar.jar",
7308 })
7309}
7310
Jooyung Han862c0d62022-12-21 10:15:37 +09007311func TestNoDupeApexFiles(t *testing.T) {
7312 android.GroupFixturePreparers(
7313 android.PrepareForTestWithAndroidBuildComponents,
7314 PrepareForTestWithApexBuildComponents,
7315 prepareForTestWithMyapex,
7316 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7317 ).
7318 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7319 RunTestWithBp(t, `
7320 apex {
7321 name: "myapex",
7322 key: "myapex.key",
7323 prebuilts: ["foo", "bar"],
7324 updatable: false,
7325 }
7326
7327 apex_key {
7328 name: "myapex.key",
7329 public_key: "testkey.avbpubkey",
7330 private_key: "testkey.pem",
7331 }
7332
7333 prebuilt_etc {
7334 name: "foo",
7335 src: "myprebuilt",
7336 filename_from_src: true,
7337 }
7338
7339 prebuilt_etc {
7340 name: "bar",
7341 src: "myprebuilt",
7342 filename_from_src: true,
7343 }
7344 `)
7345}
7346
Jiyong Park479321d2019-12-16 11:47:12 +09007347func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7348 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7349 apex {
7350 name: "myapex",
7351 key: "myapex.key",
7352 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007353 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007354 }
7355
7356 apex_key {
7357 name: "myapex.key",
7358 public_key: "testkey.avbpubkey",
7359 private_key: "testkey.pem",
7360 }
7361
7362 java_library {
7363 name: "myjar",
7364 srcs: ["foo/bar/MyClass.java"],
7365 sdk_version: "none",
7366 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007367 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007368 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007369 }
7370 `)
7371}
7372
Jiyong Park7afd1072019-12-30 16:56:33 +09007373func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007374 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007375 apex {
7376 name: "myapex",
7377 key: "myapex.key",
7378 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007379 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007380 }
7381
7382 apex_key {
7383 name: "myapex.key",
7384 public_key: "testkey.avbpubkey",
7385 private_key: "testkey.pem",
7386 }
7387
7388 cc_library {
7389 name: "mylib",
7390 srcs: ["mylib.cpp"],
7391 system_shared_libs: [],
7392 stl: "none",
7393 required: ["a", "b"],
7394 host_required: ["c", "d"],
7395 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007396 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007397 }
7398 `)
7399
7400 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007401 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007402 name := apexBundle.BaseModuleName()
7403 prefix := "TARGET_"
7404 var builder strings.Builder
7405 data.Custom(&builder, name, prefix, "", data)
7406 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007407 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007408 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7409 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007410}
7411
Jiyong Park7cd10e32020-01-14 09:22:18 +09007412func TestSymlinksFromApexToSystem(t *testing.T) {
7413 bp := `
7414 apex {
7415 name: "myapex",
7416 key: "myapex.key",
7417 native_shared_libs: ["mylib"],
7418 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007419 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007420 }
7421
Jiyong Park9d677202020-02-19 16:29:35 +09007422 apex {
7423 name: "myapex.updatable",
7424 key: "myapex.key",
7425 native_shared_libs: ["mylib"],
7426 java_libs: ["myjar"],
7427 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007428 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007429 }
7430
Jiyong Park7cd10e32020-01-14 09:22:18 +09007431 apex_key {
7432 name: "myapex.key",
7433 public_key: "testkey.avbpubkey",
7434 private_key: "testkey.pem",
7435 }
7436
7437 cc_library {
7438 name: "mylib",
7439 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007440 shared_libs: [
7441 "myotherlib",
7442 "myotherlib_ext",
7443 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007444 system_shared_libs: [],
7445 stl: "none",
7446 apex_available: [
7447 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007448 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007449 "//apex_available:platform",
7450 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007451 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007452 }
7453
7454 cc_library {
7455 name: "myotherlib",
7456 srcs: ["mylib.cpp"],
7457 system_shared_libs: [],
7458 stl: "none",
7459 apex_available: [
7460 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007461 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007462 "//apex_available:platform",
7463 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007464 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007465 }
7466
Jiyong Parkce243632023-02-17 18:22:25 +09007467 cc_library {
7468 name: "myotherlib_ext",
7469 srcs: ["mylib.cpp"],
7470 system_shared_libs: [],
7471 system_ext_specific: true,
7472 stl: "none",
7473 apex_available: [
7474 "myapex",
7475 "myapex.updatable",
7476 "//apex_available:platform",
7477 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007478 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007479 }
7480
Jiyong Park7cd10e32020-01-14 09:22:18 +09007481 java_library {
7482 name: "myjar",
7483 srcs: ["foo/bar/MyClass.java"],
7484 sdk_version: "none",
7485 system_modules: "none",
7486 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007487 apex_available: [
7488 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007489 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007490 "//apex_available:platform",
7491 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007492 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007493 }
7494
7495 java_library {
7496 name: "myotherjar",
7497 srcs: ["foo/bar/MyClass.java"],
7498 sdk_version: "none",
7499 system_modules: "none",
7500 apex_available: [
7501 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007502 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007503 "//apex_available:platform",
7504 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007505 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007506 }
7507 `
7508
7509 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7510 for _, f := range files {
7511 if f.path == file {
7512 if f.isLink {
7513 t.Errorf("%q is not a real file", file)
7514 }
7515 return
7516 }
7517 }
7518 t.Errorf("%q is not found", file)
7519 }
7520
Jiyong Parkce243632023-02-17 18:22:25 +09007521 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007522 for _, f := range files {
7523 if f.path == file {
7524 if !f.isLink {
7525 t.Errorf("%q is not a symlink", file)
7526 }
Jiyong Parkce243632023-02-17 18:22:25 +09007527 if f.src != target {
7528 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7529 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007530 return
7531 }
7532 }
7533 t.Errorf("%q is not found", file)
7534 }
7535
Jiyong Park9d677202020-02-19 16:29:35 +09007536 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7537 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007538 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007539 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007540 ensureRealfileExists(t, files, "javalib/myjar.jar")
7541 ensureRealfileExists(t, files, "lib64/mylib.so")
7542 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007543 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007544
Jiyong Park9d677202020-02-19 16:29:35 +09007545 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7546 ensureRealfileExists(t, files, "javalib/myjar.jar")
7547 ensureRealfileExists(t, files, "lib64/mylib.so")
7548 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007549 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007550
7551 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007552 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007553 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007554 ensureRealfileExists(t, files, "javalib/myjar.jar")
7555 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007556 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7557 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007558
7559 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7560 ensureRealfileExists(t, files, "javalib/myjar.jar")
7561 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007562 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7563 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007564}
7565
Yo Chiange8128052020-07-23 20:09:18 +08007566func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007567 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007568 apex {
7569 name: "myapex",
7570 key: "myapex.key",
7571 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007572 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007573 }
7574
7575 apex_key {
7576 name: "myapex.key",
7577 public_key: "testkey.avbpubkey",
7578 private_key: "testkey.pem",
7579 }
7580
7581 cc_library_shared {
7582 name: "mylib",
7583 srcs: ["mylib.cpp"],
7584 shared_libs: ["myotherlib"],
7585 system_shared_libs: [],
7586 stl: "none",
7587 apex_available: [
7588 "myapex",
7589 "//apex_available:platform",
7590 ],
7591 }
7592
7593 cc_prebuilt_library_shared {
7594 name: "myotherlib",
7595 srcs: ["prebuilt.so"],
7596 system_shared_libs: [],
7597 stl: "none",
7598 apex_available: [
7599 "myapex",
7600 "//apex_available:platform",
7601 ],
7602 }
7603 `)
7604
Prerana Patilb1896c82022-11-09 18:14:34 +00007605 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007606 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007607 var builder strings.Builder
7608 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7609 androidMk := builder.String()
7610 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007611 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007612 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7613 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7614 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007615 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64 apex_manifest.pb.myapex apex_pubkey.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007616}
7617
Jooyung Han643adc42020-02-27 13:50:06 +09007618func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007619 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007620 apex {
7621 name: "myapex",
7622 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007623 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007624 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007625 }
7626
7627 apex_key {
7628 name: "myapex.key",
7629 public_key: "testkey.avbpubkey",
7630 private_key: "testkey.pem",
7631 }
7632
7633 cc_library {
7634 name: "mylib",
7635 srcs: ["mylib.cpp"],
7636 shared_libs: ["mylib2"],
7637 system_shared_libs: [],
7638 stl: "none",
7639 apex_available: [ "myapex" ],
7640 }
7641
7642 cc_library {
7643 name: "mylib2",
7644 srcs: ["mylib.cpp"],
7645 system_shared_libs: [],
7646 stl: "none",
7647 apex_available: [ "myapex" ],
7648 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007649
7650 rust_ffi_shared {
7651 name: "libfoo.rust",
7652 crate_name: "foo",
7653 srcs: ["foo.rs"],
7654 shared_libs: ["libfoo.shared_from_rust"],
7655 prefer_rlib: true,
7656 apex_available: ["myapex"],
7657 }
7658
7659 cc_library_shared {
7660 name: "libfoo.shared_from_rust",
7661 srcs: ["mylib.cpp"],
7662 system_shared_libs: [],
7663 stl: "none",
7664 stubs: {
7665 versions: ["10", "11", "12"],
7666 },
7667 }
7668
Jooyung Han643adc42020-02-27 13:50:06 +09007669 `)
7670
7671 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7672 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007673 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007674 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7675 "lib64/mylib.so",
7676 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007677 "lib64/libfoo.rust.so",
7678 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7679 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007680 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007681
7682 // b/220397949
7683 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007684}
7685
Jooyung Han49f67012020-04-17 13:43:10 +09007686func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007687 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007688 apex {
7689 name: "myapex",
7690 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007691 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007692 }
7693 apex_key {
7694 name: "myapex.key",
7695 public_key: "testkey.avbpubkey",
7696 private_key: "testkey.pem",
7697 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007698 `,
7699 android.FixtureModifyConfig(func(config android.Config) {
7700 delete(config.Targets, android.Android)
7701 config.AndroidCommonTarget = android.Target{}
7702 }),
7703 )
Jooyung Han49f67012020-04-17 13:43:10 +09007704
7705 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7706 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7707 }
7708}
7709
Jiyong Parkbd159612020-02-28 15:22:21 +09007710func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007711 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007712 apex {
7713 name: "myapex",
7714 key: "myapex.key",
7715 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007716 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007717 }
7718
7719 apex_key {
7720 name: "myapex.key",
7721 public_key: "testkey.avbpubkey",
7722 private_key: "testkey.pem",
7723 }
7724
7725 android_app {
7726 name: "AppFoo",
7727 srcs: ["foo/bar/MyClass.java"],
7728 sdk_version: "none",
7729 system_modules: "none",
7730 apex_available: [ "myapex" ],
7731 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007732 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007733
Colin Crosscf371cc2020-11-13 11:48:42 -08007734 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007735 content := bundleConfigRule.Args["content"]
7736
7737 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007738 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 +09007739}
7740
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007741func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007742 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007743 apex {
7744 name: "myapex",
7745 key: "myapex.key",
7746 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007747 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007748 }
7749
7750 apex_key {
7751 name: "myapex.key",
7752 public_key: "testkey.avbpubkey",
7753 private_key: "testkey.pem",
7754 }
7755
7756 android_app_set {
7757 name: "AppSet",
7758 set: "AppSet.apks",
7759 }`)
7760 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007761 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007762 content := bundleConfigRule.Args["content"]
7763 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7764 s := mod.Rule("apexRule").Args["copy_commands"]
7765 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007766 if len(copyCmds) != 4 {
7767 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007768 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007769 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7770 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007771 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7772 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007773
7774 // Ensure that canned_fs_config has an entry for the app set zip file
7775 generateFsRule := mod.Rule("generateFsConfig")
7776 cmd := generateFsRule.RuleParams.Command
7777 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007778}
7779
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007780func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007781 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007782 apex_set {
7783 name: "myapex",
7784 filename: "foo_v2.apex",
7785 sanitized: {
7786 none: { set: "myapex.apks", },
7787 hwaddress: { set: "myapex.hwasan.apks", },
7788 },
Paul Duffin24704672021-04-06 16:09:30 +01007789 }
7790 `
7791 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007792
Paul Duffin24704672021-04-06 16:09:30 +01007793 // Check that the extractor produces the correct output file from the correct input file.
7794 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007795
Paul Duffin24704672021-04-06 16:09:30 +01007796 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7797 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007798
Paul Duffin24704672021-04-06 16:09:30 +01007799 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7800
7801 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007802 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7803 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007804
7805 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007806}
7807
Pranav Guptaeba03b02022-09-27 00:27:08 +00007808func TestApexSetApksModuleAssignment(t *testing.T) {
7809 ctx := testApex(t, `
7810 apex_set {
7811 name: "myapex",
7812 set: ":myapex_apks_file",
7813 }
7814
7815 filegroup {
7816 name: "myapex_apks_file",
7817 srcs: ["myapex.apks"],
7818 }
7819 `)
7820
7821 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7822
7823 // Check that the extractor produces the correct apks file from the input module
7824 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7825 extractedApex := m.Output(extractorOutput)
7826
7827 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7828}
7829
Paul Duffin89f570a2021-06-16 01:42:33 +01007830func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007831 t.Helper()
7832
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007833 bp := `
7834 java_library {
7835 name: "some-updatable-apex-lib",
7836 srcs: ["a.java"],
7837 sdk_version: "current",
7838 apex_available: [
7839 "some-updatable-apex",
7840 ],
satayevabcd5972021-08-06 17:49:46 +01007841 permitted_packages: ["some.updatable.apex.lib"],
Spandan Dascc9d9422023-04-06 18:07:43 +00007842 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007843 }
7844
7845 java_library {
7846 name: "some-non-updatable-apex-lib",
7847 srcs: ["a.java"],
7848 apex_available: [
7849 "some-non-updatable-apex",
7850 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007851 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007852 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007853 }
7854
7855 bootclasspath_fragment {
7856 name: "some-non-updatable-fragment",
7857 contents: ["some-non-updatable-apex-lib"],
7858 apex_available: [
7859 "some-non-updatable-apex",
7860 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007861 hidden_api: {
7862 split_packages: ["*"],
7863 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007864 }
7865
7866 java_library {
7867 name: "some-platform-lib",
7868 srcs: ["a.java"],
7869 sdk_version: "current",
7870 installable: true,
7871 }
7872
7873 java_library {
7874 name: "some-art-lib",
7875 srcs: ["a.java"],
7876 sdk_version: "current",
7877 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007878 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007879 ],
7880 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007881 compile_dex: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007882 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007883 }
7884
7885 apex {
7886 name: "some-updatable-apex",
7887 key: "some-updatable-apex.key",
7888 java_libs: ["some-updatable-apex-lib"],
7889 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007890 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007891 }
7892
7893 apex {
7894 name: "some-non-updatable-apex",
7895 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007896 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007897 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007898 }
7899
7900 apex_key {
7901 name: "some-updatable-apex.key",
7902 }
7903
7904 apex_key {
7905 name: "some-non-updatable-apex.key",
7906 }
7907
7908 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007909 name: "com.android.art.debug",
7910 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007911 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007912 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007913 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007914 }
7915
Paul Duffinf23bc472021-04-27 12:42:20 +01007916 bootclasspath_fragment {
7917 name: "art-bootclasspath-fragment",
7918 image_name: "art",
7919 contents: ["some-art-lib"],
7920 apex_available: [
7921 "com.android.art.debug",
7922 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007923 hidden_api: {
7924 split_packages: ["*"],
7925 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007926 }
7927
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007928 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007929 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007930 }
7931
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007932 filegroup {
7933 name: "some-updatable-apex-file_contexts",
7934 srcs: [
7935 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7936 ],
7937 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007938
7939 filegroup {
7940 name: "some-non-updatable-apex-file_contexts",
7941 srcs: [
7942 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7943 ],
7944 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007945 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007946
Paul Duffin89f570a2021-06-16 01:42:33 +01007947 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007948}
7949
Paul Duffin89f570a2021-06-16 01:42:33 +01007950func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007951 t.Helper()
7952
Paul Duffin55607122021-03-30 23:32:51 +01007953 fs := android.MockFS{
7954 "a.java": nil,
7955 "a.jar": nil,
7956 "apex_manifest.json": nil,
7957 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007958 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007959 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7960 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7961 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007962 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007963 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007964
Paul Duffin55607122021-03-30 23:32:51 +01007965 errorHandler := android.FixtureExpectsNoErrors
7966 if errmsg != "" {
7967 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007968 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007969
Paul Duffin55607122021-03-30 23:32:51 +01007970 result := android.GroupFixturePreparers(
7971 cc.PrepareForTestWithCcDefaultModules,
7972 java.PrepareForTestWithHiddenApiBuildComponents,
7973 java.PrepareForTestWithJavaDefaultModules,
7974 java.PrepareForTestWithJavaSdkLibraryFiles,
7975 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007976 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007977 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007978 android.FixtureModifyMockFS(func(fs android.MockFS) {
7979 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7980 insert := ""
7981 for _, fragment := range fragments {
7982 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7983 }
7984 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7985 platform_bootclasspath {
7986 name: "platform-bootclasspath",
7987 fragments: [
7988 %s
7989 ],
7990 }
7991 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007992 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007993 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007994 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007995 ).
7996 ExtendWithErrorHandler(errorHandler).
7997 RunTestWithBp(t, bp)
7998
7999 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008000}
8001
Paul Duffin5556c5f2022-06-09 17:32:21 +00008002func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008003 preparers := android.GroupFixturePreparers(
8004 java.PrepareForTestWithJavaDefaultModules,
8005 PrepareForTestWithApexBuildComponents,
8006 ).
8007 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
8008 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
8009
8010 bpBase := `
8011 apex_set {
8012 name: "com.android.myapex",
8013 installable: true,
8014 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8015 set: "myapex.apks",
8016 }
8017
8018 apex_set {
8019 name: "com.mycompany.android.myapex",
8020 apex_name: "com.android.myapex",
8021 installable: true,
8022 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8023 set: "company-myapex.apks",
8024 }
8025
8026 prebuilt_bootclasspath_fragment {
8027 name: "my-bootclasspath-fragment",
8028 apex_available: ["com.android.myapex"],
8029 %s
8030 }
8031 `
8032
8033 t.Run("java_import", func(t *testing.T) {
8034 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8035 java_import {
8036 name: "libfoo",
8037 jars: ["libfoo.jar"],
8038 apex_available: ["com.android.myapex"],
8039 }
8040 `)
8041 })
8042
8043 t.Run("java_sdk_library_import", func(t *testing.T) {
8044 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8045 java_sdk_library_import {
8046 name: "libfoo",
8047 public: {
8048 jars: ["libbar.jar"],
8049 },
8050 apex_available: ["com.android.myapex"],
8051 }
8052 `)
8053 })
8054
8055 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8056 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8057 image_name: "art",
8058 contents: ["libfoo"],
8059 `)+`
8060 java_sdk_library_import {
8061 name: "libfoo",
8062 public: {
8063 jars: ["libbar.jar"],
8064 },
8065 apex_available: ["com.android.myapex"],
8066 }
8067 `)
8068 })
8069}
8070
Paul Duffin5556c5f2022-06-09 17:32:21 +00008071func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8072 preparers := android.GroupFixturePreparers(
8073 java.PrepareForTestWithJavaDefaultModules,
8074 PrepareForTestWithApexBuildComponents,
8075 )
8076
8077 bpBase := `
8078 apex_set {
8079 name: "com.android.myapex",
8080 installable: true,
8081 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8082 set: "myapex.apks",
8083 }
8084
8085 apex_set {
8086 name: "com.android.myapex_compressed",
8087 apex_name: "com.android.myapex",
8088 installable: true,
8089 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8090 set: "myapex_compressed.apks",
8091 }
8092
8093 prebuilt_bootclasspath_fragment {
8094 name: "my-bootclasspath-fragment",
8095 apex_available: [
8096 "com.android.myapex",
8097 "com.android.myapex_compressed",
8098 ],
8099 hidden_api: {
8100 annotation_flags: "annotation-flags.csv",
8101 metadata: "metadata.csv",
8102 index: "index.csv",
8103 signature_patterns: "signature_patterns.csv",
8104 },
8105 %s
8106 }
8107 `
8108
8109 t.Run("java_import", func(t *testing.T) {
8110 result := preparers.RunTestWithBp(t,
8111 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8112 java_import {
8113 name: "libfoo",
8114 jars: ["libfoo.jar"],
8115 apex_available: [
8116 "com.android.myapex",
8117 "com.android.myapex_compressed",
8118 ],
8119 }
8120 `)
8121
8122 module := result.Module("libfoo", "android_common_com.android.myapex")
8123 usesLibraryDep := module.(java.UsesLibraryDependency)
8124 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8125 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8126 usesLibraryDep.DexJarBuildPath().Path())
8127 })
8128
8129 t.Run("java_sdk_library_import", func(t *testing.T) {
8130 result := preparers.RunTestWithBp(t,
8131 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8132 java_sdk_library_import {
8133 name: "libfoo",
8134 public: {
8135 jars: ["libbar.jar"],
8136 },
8137 apex_available: [
8138 "com.android.myapex",
8139 "com.android.myapex_compressed",
8140 ],
8141 compile_dex: true,
8142 }
8143 `)
8144
8145 module := result.Module("libfoo", "android_common_com.android.myapex")
8146 usesLibraryDep := module.(java.UsesLibraryDependency)
8147 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8148 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8149 usesLibraryDep.DexJarBuildPath().Path())
8150 })
8151
8152 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8153 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8154 image_name: "art",
8155 contents: ["libfoo"],
8156 `)+`
8157 java_sdk_library_import {
8158 name: "libfoo",
8159 public: {
8160 jars: ["libbar.jar"],
8161 },
8162 apex_available: [
8163 "com.android.myapex",
8164 "com.android.myapex_compressed",
8165 ],
8166 compile_dex: true,
8167 }
8168 `)
8169 })
8170}
8171
Jooyung Han548640b2020-04-27 12:10:30 +09008172func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8173 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8174 apex {
8175 name: "myapex",
8176 key: "myapex.key",
8177 updatable: true,
8178 }
8179
8180 apex_key {
8181 name: "myapex.key",
8182 public_key: "testkey.avbpubkey",
8183 private_key: "testkey.pem",
8184 }
8185 `)
8186}
8187
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008188func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8189 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8190 apex {
8191 name: "myapex",
8192 key: "myapex.key",
8193 }
8194
8195 apex_key {
8196 name: "myapex.key",
8197 public_key: "testkey.avbpubkey",
8198 private_key: "testkey.pem",
8199 }
8200 `)
8201}
8202
Jooyung Handfc864c2023-03-20 18:19:07 +09008203func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8204 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008205 apex {
8206 name: "myapex",
8207 key: "myapex.key",
8208 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008209 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008210 soc_specific: true,
8211 }
8212
8213 apex_key {
8214 name: "myapex.key",
8215 public_key: "testkey.avbpubkey",
8216 private_key: "testkey.pem",
8217 }
8218 `)
8219}
8220
Jooyung Han02873da2023-03-22 17:41:03 +09008221func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8222 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8223 apex {
8224 name: "myapex",
8225 key: "myapex.key",
8226 updatable: false,
8227 min_sdk_version: "29",
8228 use_vndk_as_stable: true,
8229 vendor: true,
8230 }
8231
8232 apex_key {
8233 name: "myapex.key",
8234 public_key: "testkey.avbpubkey",
8235 private_key: "testkey.pem",
8236 }
8237 `)
8238}
8239
Jooyung Handfc864c2023-03-20 18:19:07 +09008240func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8241 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8242 apex {
8243 name: "myapex",
8244 key: "myapex.key",
8245 updatable: false,
8246 use_vndk_as_stable: true,
8247 }
8248
8249 apex_key {
8250 name: "myapex.key",
8251 public_key: "testkey.avbpubkey",
8252 private_key: "testkey.pem",
8253 }
8254 `)
8255}
8256
satayevb98371c2021-06-15 16:49:50 +01008257func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8258 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8259 apex {
8260 name: "myapex",
8261 key: "myapex.key",
8262 systemserverclasspath_fragments: [
8263 "mysystemserverclasspathfragment",
8264 ],
8265 min_sdk_version: "29",
8266 updatable: true,
8267 }
8268
8269 apex_key {
8270 name: "myapex.key",
8271 public_key: "testkey.avbpubkey",
8272 private_key: "testkey.pem",
8273 }
8274
8275 java_library {
8276 name: "foo",
8277 srcs: ["b.java"],
8278 min_sdk_version: "29",
8279 installable: true,
8280 apex_available: [
8281 "myapex",
8282 ],
8283 }
8284
8285 systemserverclasspath_fragment {
8286 name: "mysystemserverclasspathfragment",
8287 generate_classpaths_proto: false,
8288 contents: [
8289 "foo",
8290 ],
8291 apex_available: [
8292 "myapex",
8293 ],
8294 }
satayevabcd5972021-08-06 17:49:46 +01008295 `,
8296 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8297 )
satayevb98371c2021-06-15 16:49:50 +01008298}
8299
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008300func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008301 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
8302 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
8303 // modules to be included in the BootJars.
8304 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
8305 return android.GroupFixturePreparers(
8306 dexpreopt.FixtureSetBootJars(bootJars...),
8307 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8308 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8309 }),
8310 )
8311 }
8312
8313 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
8314 // same value. This can result in an invalid configuration as it allows non art apex jars to be
8315 // specified in the ArtApexJars configuration.
8316 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
8317 return android.GroupFixturePreparers(
8318 dexpreopt.FixtureSetArtBootJars(bootJars...),
8319 dexpreopt.FixtureSetBootJars(bootJars...),
8320 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8321 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8322 }),
8323 )
8324 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008325
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008326 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008327 preparer := android.GroupFixturePreparers(
8328 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
8329 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8330 )
8331 fragments := []java.ApexVariantReference{
8332 {
8333 Apex: proptools.StringPtr("com.android.art.debug"),
8334 Module: proptools.StringPtr("art-bootclasspath-fragment"),
8335 },
8336 {
8337 Apex: proptools.StringPtr("some-non-updatable-apex"),
8338 Module: proptools.StringPtr("some-non-updatable-fragment"),
8339 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008340 }
satayevabcd5972021-08-06 17:49:46 +01008341 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008342 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008343
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008344 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008345 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
8346 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01008347 preparer := android.GroupFixturePreparers(
8348 prepareSetBootJars("com.android.art.debug:some-art-lib"),
8349 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8350 )
Paul Duffin60264a02021-04-12 20:02:36 +01008351 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008352 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008353
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008354 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008355 err := `ArtApexJars expects this to be in apex "some-updatable-apex" but this is only in apexes.*"com.android.art.debug"`
Paul Duffin60264a02021-04-12 20:02:36 +01008356 // Update the dexpreopt ArtApexJars directly.
8357 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
8358 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008359 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008360
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008361 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008362 err := `ArtApexJars expects this to be in apex "some-non-updatable-apex" but this is only in apexes.*"com.android.art.debug"`
Paul Duffin60264a02021-04-12 20:02:36 +01008363 // Update the dexpreopt ArtApexJars directly.
8364 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
8365 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008366 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008367
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008368 t.Run("updatable jar from some other apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008369 err := `module "some-updatable-apex-lib" from updatable apexes \["some-updatable-apex"\] is not allowed in the framework boot image`
satayevabcd5972021-08-06 17:49:46 +01008370 preparer := android.GroupFixturePreparers(
8371 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
8372 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8373 )
Paul Duffin60264a02021-04-12 20:02:36 +01008374 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008375 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008376
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008377 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008378 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01008379 fragment := java.ApexVariantReference{
8380 Apex: proptools.StringPtr("some-non-updatable-apex"),
8381 Module: proptools.StringPtr("some-non-updatable-fragment"),
8382 }
8383 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008384 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008385
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008386 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008387 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008388 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8389 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008390 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008391
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008392 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008393 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008394 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8395 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008396 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008397
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008398 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008399 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01008400 // Update the dexpreopt ArtApexJars directly.
8401 preparer := prepareSetArtJars("platform:some-platform-lib")
8402 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008403 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008404
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008405 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008406 preparer := android.GroupFixturePreparers(
8407 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8408 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8409 )
8410 fragments := []java.ApexVariantReference{
8411 {
8412 Apex: proptools.StringPtr("some-non-updatable-apex"),
8413 Module: proptools.StringPtr("some-non-updatable-fragment"),
8414 },
8415 }
8416 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008417 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008418}
8419
8420func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008421 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008422 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008423 fragment := java.ApexVariantReference{
8424 Apex: proptools.StringPtr("myapex"),
8425 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8426 }
8427
Paul Duffin064b70c2020-11-02 17:32:38 +00008428 testDexpreoptWithApexes(t, `
8429 prebuilt_apex {
8430 name: "myapex" ,
8431 arch: {
8432 arm64: {
8433 src: "myapex-arm64.apex",
8434 },
8435 arm: {
8436 src: "myapex-arm.apex",
8437 },
8438 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008439 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8440 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008441
Paul Duffin89f570a2021-06-16 01:42:33 +01008442 prebuilt_bootclasspath_fragment {
8443 name: "my-bootclasspath-fragment",
8444 contents: ["libfoo"],
8445 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008446 hidden_api: {
8447 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8448 metadata: "my-bootclasspath-fragment/metadata.csv",
8449 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008450 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8451 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8452 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008453 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008454 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008455
Paul Duffin89f570a2021-06-16 01:42:33 +01008456 java_import {
8457 name: "libfoo",
8458 jars: ["libfoo.jar"],
8459 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008460 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008461 }
8462 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008463 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008464}
8465
Spandan Dasf14e2542021-11-12 00:01:37 +00008466func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008467 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008468 bp += `
8469 apex_key {
8470 name: "myapex.key",
8471 public_key: "testkey.avbpubkey",
8472 private_key: "testkey.pem",
8473 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008474 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008475 "lib1/src/A.java": nil,
8476 "lib2/src/B.java": nil,
8477 "system/sepolicy/apex/myapex-file_contexts": nil,
8478 }
8479
Paul Duffin45338f02021-03-30 23:07:52 +01008480 errorHandler := android.FixtureExpectsNoErrors
8481 if errmsg != "" {
8482 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008483 }
Colin Crossae8600b2020-10-29 17:09:13 -07008484
Paul Duffin45338f02021-03-30 23:07:52 +01008485 android.GroupFixturePreparers(
8486 android.PrepareForTestWithAndroidBuildComponents,
8487 java.PrepareForTestWithJavaBuildComponents,
8488 PrepareForTestWithApexBuildComponents,
8489 android.PrepareForTestWithNeverallowRules(rules),
8490 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008491 apexBootJars := make([]string, 0, len(bootJars))
8492 for _, apexBootJar := range bootJars {
8493 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008494 }
satayevd604b212021-07-21 14:23:52 +01008495 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008496 }),
8497 fs.AddToFixture(),
8498 ).
8499 ExtendWithErrorHandler(errorHandler).
8500 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008501}
8502
8503func TestApexPermittedPackagesRules(t *testing.T) {
8504 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008505 name string
8506 expectedError string
8507 bp string
8508 bootJars []string
8509 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008510 }{
8511
8512 {
8513 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8514 expectedError: "",
8515 bp: `
8516 java_library {
8517 name: "bcp_lib1",
8518 srcs: ["lib1/src/*.java"],
8519 permitted_packages: ["foo.bar"],
8520 apex_available: ["myapex"],
8521 sdk_version: "none",
8522 system_modules: "none",
8523 }
8524 java_library {
8525 name: "nonbcp_lib2",
8526 srcs: ["lib2/src/*.java"],
8527 apex_available: ["myapex"],
8528 permitted_packages: ["a.b"],
8529 sdk_version: "none",
8530 system_modules: "none",
8531 }
8532 apex {
8533 name: "myapex",
8534 key: "myapex.key",
8535 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008536 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008537 }`,
8538 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008539 bcpPermittedPackages: map[string][]string{
8540 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008541 "foo.bar",
8542 },
8543 },
8544 },
8545 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008546 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008547 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 +01008548 bp: `
8549 java_library {
8550 name: "bcp_lib1",
8551 srcs: ["lib1/src/*.java"],
8552 apex_available: ["myapex"],
8553 permitted_packages: ["foo.bar"],
8554 sdk_version: "none",
8555 system_modules: "none",
8556 }
8557 java_library {
8558 name: "bcp_lib2",
8559 srcs: ["lib2/src/*.java"],
8560 apex_available: ["myapex"],
8561 permitted_packages: ["foo.bar", "bar.baz"],
8562 sdk_version: "none",
8563 system_modules: "none",
8564 }
8565 apex {
8566 name: "myapex",
8567 key: "myapex.key",
8568 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008569 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008570 }
8571 `,
8572 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008573 bcpPermittedPackages: map[string][]string{
8574 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008575 "foo.bar",
8576 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008577 "bcp_lib2": []string{
8578 "foo.bar",
8579 },
8580 },
8581 },
8582 {
8583 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8584 expectedError: "",
8585 bp: `
8586 java_library {
8587 name: "bcp_lib_restricted",
8588 srcs: ["lib1/src/*.java"],
8589 apex_available: ["myapex"],
8590 permitted_packages: ["foo.bar"],
8591 sdk_version: "none",
8592 min_sdk_version: "29",
8593 system_modules: "none",
8594 }
8595 java_library {
8596 name: "bcp_lib_unrestricted",
8597 srcs: ["lib2/src/*.java"],
8598 apex_available: ["myapex"],
8599 permitted_packages: ["foo.bar", "bar.baz"],
8600 sdk_version: "none",
8601 min_sdk_version: "29",
8602 system_modules: "none",
8603 }
8604 apex {
8605 name: "myapex",
8606 key: "myapex.key",
8607 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8608 updatable: true,
8609 min_sdk_version: "29",
8610 }
8611 `,
8612 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8613 bcpPermittedPackages: map[string][]string{
8614 "bcp_lib1_non_updateable": []string{
8615 "foo.bar",
8616 },
8617 // 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 +01008618 },
8619 },
8620 }
8621 for _, tc := range testcases {
8622 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008623 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8624 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008625 })
8626 }
8627}
8628
Jiyong Park62304bb2020-04-13 16:19:48 +09008629func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008630 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008631 apex {
8632 name: "myapex",
8633 key: "myapex.key",
8634 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008635 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008636 }
8637
8638 apex_key {
8639 name: "myapex.key",
8640 public_key: "testkey.avbpubkey",
8641 private_key: "testkey.pem",
8642 }
8643
8644 cc_library {
8645 name: "mylib",
8646 srcs: ["mylib.cpp"],
8647 system_shared_libs: [],
8648 stl: "none",
8649 stubs: {
8650 versions: ["1"],
8651 },
8652 apex_available: ["myapex"],
8653 }
8654
8655 cc_library {
8656 name: "myprivlib",
8657 srcs: ["mylib.cpp"],
8658 system_shared_libs: [],
8659 stl: "none",
8660 apex_available: ["myapex"],
8661 }
8662
8663
8664 cc_test {
8665 name: "mytest",
8666 gtest: false,
8667 srcs: ["mylib.cpp"],
8668 system_shared_libs: [],
8669 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008670 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008671 test_for: ["myapex"]
8672 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008673
8674 cc_library {
8675 name: "mytestlib",
8676 srcs: ["mylib.cpp"],
8677 system_shared_libs: [],
8678 shared_libs: ["mylib", "myprivlib"],
8679 stl: "none",
8680 test_for: ["myapex"],
8681 }
8682
8683 cc_benchmark {
8684 name: "mybench",
8685 srcs: ["mylib.cpp"],
8686 system_shared_libs: [],
8687 shared_libs: ["mylib", "myprivlib"],
8688 stl: "none",
8689 test_for: ["myapex"],
8690 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008691 `)
8692
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008693 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008694 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008695 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8696 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8697 }
8698
8699 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008700 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008701 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8702 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8703 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8704}
Jiyong Park46a512f2020-12-04 18:02:13 +09008705
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008706func TestIndirectTestFor(t *testing.T) {
8707 ctx := testApex(t, `
8708 apex {
8709 name: "myapex",
8710 key: "myapex.key",
8711 native_shared_libs: ["mylib", "myprivlib"],
8712 updatable: false,
8713 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008714
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008715 apex_key {
8716 name: "myapex.key",
8717 public_key: "testkey.avbpubkey",
8718 private_key: "testkey.pem",
8719 }
8720
8721 cc_library {
8722 name: "mylib",
8723 srcs: ["mylib.cpp"],
8724 system_shared_libs: [],
8725 stl: "none",
8726 stubs: {
8727 versions: ["1"],
8728 },
8729 apex_available: ["myapex"],
8730 }
8731
8732 cc_library {
8733 name: "myprivlib",
8734 srcs: ["mylib.cpp"],
8735 system_shared_libs: [],
8736 stl: "none",
8737 shared_libs: ["mylib"],
8738 apex_available: ["myapex"],
8739 }
8740
8741 cc_library {
8742 name: "mytestlib",
8743 srcs: ["mylib.cpp"],
8744 system_shared_libs: [],
8745 shared_libs: ["myprivlib"],
8746 stl: "none",
8747 test_for: ["myapex"],
8748 }
8749 `)
8750
8751 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008752 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008753 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8754 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8755 }
8756
8757 // The platform variant of mytestlib links to the platform variant of the
8758 // internal myprivlib.
8759 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8760
8761 // The platform variant of myprivlib links to the platform variant of mylib
8762 // and bypasses its stubs.
8763 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 +09008764}
8765
Martin Stjernholmec009002021-03-27 15:18:31 +00008766func TestTestForForLibInOtherApex(t *testing.T) {
8767 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8768 _ = testApex(t, `
8769 apex {
8770 name: "com.android.art",
8771 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008772 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008773 updatable: false,
8774 }
8775
8776 apex {
8777 name: "com.android.art.debug",
8778 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008779 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008780 updatable: false,
8781 }
8782
8783 apex_key {
8784 name: "myapex.key",
8785 public_key: "testkey.avbpubkey",
8786 private_key: "testkey.pem",
8787 }
8788
8789 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008790 name: "libnativebridge",
8791 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008792 system_shared_libs: [],
8793 stl: "none",
8794 stubs: {
8795 versions: ["1"],
8796 },
8797 apex_available: ["com.android.art", "com.android.art.debug"],
8798 }
8799
8800 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008801 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008802 srcs: ["mylib.cpp"],
8803 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008804 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008805 stl: "none",
8806 apex_available: ["com.android.art.debug"],
8807 test_for: ["com.android.art"],
8808 }
8809 `,
8810 android.MockFS{
8811 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8812 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8813 }.AddToFixture())
8814}
8815
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008816// TODO(jungjw): Move this to proptools
8817func intPtr(i int) *int {
8818 return &i
8819}
8820
8821func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008822 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008823 apex_set {
8824 name: "myapex",
8825 set: "myapex.apks",
8826 filename: "foo_v2.apex",
8827 overrides: ["foo"],
8828 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008829 `,
8830 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8831 variables.Platform_sdk_version = intPtr(30)
8832 }),
8833 android.FixtureModifyConfig(func(config android.Config) {
8834 config.Targets[android.Android] = []android.Target{
8835 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8836 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8837 }
8838 }),
8839 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008840
Paul Duffin24704672021-04-06 16:09:30 +01008841 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008842
8843 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008844 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008845 actual := extractedApex.Args["abis"]
8846 expected := "ARMEABI_V7A,ARM64_V8A"
8847 if actual != expected {
8848 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8849 }
8850 actual = extractedApex.Args["sdk-version"]
8851 expected = "30"
8852 if actual != expected {
8853 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8854 }
8855
Paul Duffin6717d882021-06-15 19:09:41 +01008856 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008857 a := m.Module().(*ApexSet)
8858 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008859 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008860 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8861 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8862 }
8863}
8864
Anton Hansson805e0a52022-11-25 14:06:46 +00008865func TestApexSet_NativeBridge(t *testing.T) {
8866 ctx := testApex(t, `
8867 apex_set {
8868 name: "myapex",
8869 set: "myapex.apks",
8870 filename: "foo_v2.apex",
8871 overrides: ["foo"],
8872 }
8873 `,
8874 android.FixtureModifyConfig(func(config android.Config) {
8875 config.Targets[android.Android] = []android.Target{
8876 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8877 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8878 }
8879 }),
8880 )
8881
8882 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8883
8884 // Check extract_apks tool parameters. No native bridge arch expected
8885 extractedApex := m.Output("extracted/myapex.apks")
8886 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8887}
8888
Jiyong Park7d95a512020-05-10 15:16:24 +09008889func TestNoStaticLinkingToStubsLib(t *testing.T) {
8890 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8891 apex {
8892 name: "myapex",
8893 key: "myapex.key",
8894 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008895 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008896 }
8897
8898 apex_key {
8899 name: "myapex.key",
8900 public_key: "testkey.avbpubkey",
8901 private_key: "testkey.pem",
8902 }
8903
8904 cc_library {
8905 name: "mylib",
8906 srcs: ["mylib.cpp"],
8907 static_libs: ["otherlib"],
8908 system_shared_libs: [],
8909 stl: "none",
8910 apex_available: [ "myapex" ],
8911 }
8912
8913 cc_library {
8914 name: "otherlib",
8915 srcs: ["mylib.cpp"],
8916 system_shared_libs: [],
8917 stl: "none",
8918 stubs: {
8919 versions: ["1", "2", "3"],
8920 },
8921 apex_available: [ "myapex" ],
8922 }
8923 `)
8924}
8925
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008926func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008927 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008928 apex {
8929 name: "myapex",
8930 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008931 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008932 custom_sign_tool: "sign_myapex",
8933 }
8934
8935 apex_key {
8936 name: "myapex.key",
8937 public_key: "testkey.avbpubkey",
8938 private_key: "testkey.pem",
8939 }
8940 `)
8941
8942 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8943 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8944 ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system_ext" sign_tool="sign_myapex"`)
8945}
8946
8947func TestApexKeysTxtOverrides(t *testing.T) {
8948 ctx := testApex(t, `
8949 apex {
8950 name: "myapex",
8951 key: "myapex.key",
8952 updatable: false,
8953 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008954 }
8955
8956 apex_key {
8957 name: "myapex.key",
8958 public_key: "testkey.avbpubkey",
8959 private_key: "testkey.pem",
8960 }
8961
8962 prebuilt_apex {
8963 name: "myapex",
8964 prefer: true,
8965 arch: {
8966 arm64: {
8967 src: "myapex-arm64.apex",
8968 },
8969 arm: {
8970 src: "myapex-arm.apex",
8971 },
8972 },
8973 }
8974
8975 apex_set {
8976 name: "myapex_set",
8977 set: "myapex.apks",
8978 filename: "myapex_set.apex",
8979 overrides: ["myapex"],
8980 }
8981 `)
8982
8983 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8984 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8985 ensureContains(t, content, `name="myapex_set.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`)
Jiyong Park03a7f3e2020-06-18 19:34:42 +09008986 ensureContains(t, content, `name="myapex.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`)
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008987}
8988
Jooyung Han938b5932020-06-20 12:47:47 +09008989func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008990 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008991 apex {
8992 name: "myapex",
8993 key: "myapex.key",
8994 apps: ["app"],
8995 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008996 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008997 }
8998
8999 apex_key {
9000 name: "myapex.key",
9001 public_key: "testkey.avbpubkey",
9002 private_key: "testkey.pem",
9003 }
9004
9005 android_app {
9006 name: "app",
9007 srcs: ["foo/bar/MyClass.java"],
9008 package_name: "foo",
9009 sdk_version: "none",
9010 system_modules: "none",
9011 apex_available: [ "myapex" ],
9012 }
9013 `, withFiles(map[string][]byte{
9014 "sub/Android.bp": []byte(`
9015 override_apex {
9016 name: "override_myapex",
9017 base: "myapex",
9018 apps: ["override_app"],
9019 allowed_files: ":allowed",
9020 }
9021 // Overridable "path" property should be referenced indirectly
9022 filegroup {
9023 name: "allowed",
9024 srcs: ["allowed.txt"],
9025 }
9026 override_android_app {
9027 name: "override_app",
9028 base: "app",
9029 package_name: "bar",
9030 }
9031 `),
9032 }))
9033
9034 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
9035 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9036 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9037 }
9038
9039 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
9040 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9041 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9042 }
9043}
9044
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009045func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009046 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009047 apex {
9048 name: "myapex",
9049 key: "myapex.key",
9050 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009051 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009052 }
9053
9054 apex_key {
9055 name: "myapex.key",
9056 public_key: "testkey.avbpubkey",
9057 private_key: "testkey.pem",
9058 }
9059
9060 cc_library {
9061 name: "mylib",
9062 srcs: ["mylib.cpp"],
9063 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009064 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009065 },
9066 apex_available: ["myapex"],
9067 }
9068
9069 cc_prebuilt_library_shared {
9070 name: "mylib",
9071 prefer: false,
9072 srcs: ["prebuilt.so"],
9073 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009074 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009075 },
9076 apex_available: ["myapex"],
9077 }
9078 `)
9079}
9080
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009081func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009082 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009083 apex {
9084 name: "myapex",
9085 key: "myapex.key",
9086 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009087 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009088 }
9089 apex_key {
9090 name: "myapex.key",
9091 public_key: "testkey.avbpubkey",
9092 private_key: "testkey.pem",
9093 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009094 `,
9095 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9096 variables.CompressedApex = proptools.BoolPtr(true)
9097 }),
9098 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009099
9100 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
9101 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9102
9103 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
9104 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9105
9106 // Make sure output of bundle is .capex
9107 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9108 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9109
9110 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009111 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009112 var builder strings.Builder
9113 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9114 androidMk := builder.String()
9115 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9116}
9117
Martin Stjernholm2856c662020-12-02 15:03:42 +00009118func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009119 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009120 apex {
9121 name: "myapex",
9122 key: "myapex.key",
9123 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009124 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009125 }
9126
9127 apex_key {
9128 name: "myapex.key",
9129 public_key: "testkey.avbpubkey",
9130 private_key: "testkey.pem",
9131 }
9132
9133 cc_library {
9134 name: "mylib",
9135 srcs: ["mylib.cpp"],
9136 apex_available: ["myapex"],
9137 shared_libs: ["otherlib"],
9138 system_shared_libs: [],
9139 }
9140
9141 cc_library {
9142 name: "otherlib",
9143 srcs: ["mylib.cpp"],
9144 stubs: {
9145 versions: ["current"],
9146 },
9147 }
9148
9149 cc_prebuilt_library_shared {
9150 name: "otherlib",
9151 prefer: true,
9152 srcs: ["prebuilt.so"],
9153 stubs: {
9154 versions: ["current"],
9155 },
9156 }
9157 `)
9158
9159 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009160 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009161 var builder strings.Builder
9162 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9163 androidMk := builder.String()
9164
9165 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9166 // a thing there.
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009167 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009168}
9169
Jiyong Parke3867542020-12-03 17:28:25 +09009170func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009171 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009172 apex {
9173 name: "myapex",
9174 key: "myapex.key",
9175 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009176 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009177 }
9178
9179 apex_key {
9180 name: "myapex.key",
9181 public_key: "testkey.avbpubkey",
9182 private_key: "testkey.pem",
9183 }
9184
9185 cc_library {
9186 name: "mylib",
9187 srcs: ["mylib.cpp"],
9188 system_shared_libs: [],
9189 stl: "none",
9190 apex_available: ["myapex"],
9191 shared_libs: ["mylib2"],
9192 target: {
9193 apex: {
9194 exclude_shared_libs: ["mylib2"],
9195 },
9196 },
9197 }
9198
9199 cc_library {
9200 name: "mylib2",
9201 srcs: ["mylib.cpp"],
9202 system_shared_libs: [],
9203 stl: "none",
9204 }
9205 `)
9206
9207 // Check if mylib is linked to mylib2 for the non-apex target
9208 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9209 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9210
9211 // Make sure that the link doesn't occur for the apex target
9212 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9213 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9214
9215 // It shouldn't appear in the copy cmd as well.
9216 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
9217 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9218}
9219
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009220func TestPrebuiltStubLibDep(t *testing.T) {
9221 bpBase := `
9222 apex {
9223 name: "myapex",
9224 key: "myapex.key",
9225 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009226 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009227 }
9228 apex_key {
9229 name: "myapex.key",
9230 public_key: "testkey.avbpubkey",
9231 private_key: "testkey.pem",
9232 }
9233 cc_library {
9234 name: "mylib",
9235 srcs: ["mylib.cpp"],
9236 apex_available: ["myapex"],
9237 shared_libs: ["stublib"],
9238 system_shared_libs: [],
9239 }
9240 apex {
9241 name: "otherapex",
9242 enabled: %s,
9243 key: "myapex.key",
9244 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009245 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009246 }
9247 `
9248
9249 stublibSourceBp := `
9250 cc_library {
9251 name: "stublib",
9252 srcs: ["mylib.cpp"],
9253 apex_available: ["otherapex"],
9254 system_shared_libs: [],
9255 stl: "none",
9256 stubs: {
9257 versions: ["1"],
9258 },
9259 }
9260 `
9261
9262 stublibPrebuiltBp := `
9263 cc_prebuilt_library_shared {
9264 name: "stublib",
9265 srcs: ["prebuilt.so"],
9266 apex_available: ["otherapex"],
9267 stubs: {
9268 versions: ["1"],
9269 },
9270 %s
9271 }
9272 `
9273
9274 tests := []struct {
9275 name string
9276 stublibBp string
9277 usePrebuilt bool
9278 modNames []string // Modules to collect AndroidMkEntries for
9279 otherApexEnabled []string
9280 }{
9281 {
9282 name: "only_source",
9283 stublibBp: stublibSourceBp,
9284 usePrebuilt: false,
9285 modNames: []string{"stublib"},
9286 otherApexEnabled: []string{"true", "false"},
9287 },
9288 {
9289 name: "source_preferred",
9290 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9291 usePrebuilt: false,
9292 modNames: []string{"stublib", "prebuilt_stublib"},
9293 otherApexEnabled: []string{"true", "false"},
9294 },
9295 {
9296 name: "prebuilt_preferred",
9297 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9298 usePrebuilt: true,
9299 modNames: []string{"stublib", "prebuilt_stublib"},
9300 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9301 },
9302 {
9303 name: "only_prebuilt",
9304 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9305 usePrebuilt: true,
9306 modNames: []string{"stublib"},
9307 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9308 },
9309 }
9310
9311 for _, test := range tests {
9312 t.Run(test.name, func(t *testing.T) {
9313 for _, otherApexEnabled := range test.otherApexEnabled {
9314 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009315 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009316
9317 type modAndMkEntries struct {
9318 mod *cc.Module
9319 mkEntries android.AndroidMkEntries
9320 }
9321 entries := []*modAndMkEntries{}
9322
9323 // Gather shared lib modules that are installable
9324 for _, modName := range test.modNames {
9325 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9326 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9327 continue
9328 }
9329 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009330 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009331 continue
9332 }
Colin Crossaa255532020-07-03 13:18:24 -07009333 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009334 if ent.Disabled {
9335 continue
9336 }
9337 entries = append(entries, &modAndMkEntries{
9338 mod: mod,
9339 mkEntries: ent,
9340 })
9341 }
9342 }
9343 }
9344
9345 var entry *modAndMkEntries = nil
9346 for _, ent := range entries {
9347 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9348 if entry != nil {
9349 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9350 } else {
9351 entry = ent
9352 }
9353 }
9354 }
9355
9356 if entry == nil {
9357 t.Errorf("AndroidMk entry for \"stublib\" missing")
9358 } else {
9359 isPrebuilt := entry.mod.Prebuilt() != nil
9360 if isPrebuilt != test.usePrebuilt {
9361 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9362 }
9363 if !entry.mod.IsStubs() {
9364 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9365 }
9366 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9367 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9368 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009369 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009370 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009371 if !android.InList(expected, cflags) {
9372 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9373 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009374 }
9375 })
9376 }
9377 })
9378 }
9379}
9380
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009381func TestHostApexInHostOnlyBuild(t *testing.T) {
9382 testApex(t, `
9383 apex {
9384 name: "myapex",
9385 host_supported: true,
9386 key: "myapex.key",
9387 updatable: false,
9388 payload_type: "zip",
9389 }
9390 apex_key {
9391 name: "myapex.key",
9392 public_key: "testkey.avbpubkey",
9393 private_key: "testkey.pem",
9394 }
9395 `,
9396 android.FixtureModifyConfig(func(config android.Config) {
9397 // We may not have device targets in all builds, e.g. in
9398 // prebuilts/build-tools/build-prebuilts.sh
9399 config.Targets[android.Android] = []android.Target{}
9400 }))
9401}
9402
Colin Crossc33e5212021-05-25 18:16:02 -07009403func TestApexJavaCoverage(t *testing.T) {
9404 bp := `
9405 apex {
9406 name: "myapex",
9407 key: "myapex.key",
9408 java_libs: ["mylib"],
9409 bootclasspath_fragments: ["mybootclasspathfragment"],
9410 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9411 updatable: false,
9412 }
9413
9414 apex_key {
9415 name: "myapex.key",
9416 public_key: "testkey.avbpubkey",
9417 private_key: "testkey.pem",
9418 }
9419
9420 java_library {
9421 name: "mylib",
9422 srcs: ["mylib.java"],
9423 apex_available: ["myapex"],
9424 compile_dex: true,
9425 }
9426
9427 bootclasspath_fragment {
9428 name: "mybootclasspathfragment",
9429 contents: ["mybootclasspathlib"],
9430 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009431 hidden_api: {
9432 split_packages: ["*"],
9433 },
Colin Crossc33e5212021-05-25 18:16:02 -07009434 }
9435
9436 java_library {
9437 name: "mybootclasspathlib",
9438 srcs: ["mybootclasspathlib.java"],
9439 apex_available: ["myapex"],
9440 compile_dex: true,
9441 }
9442
9443 systemserverclasspath_fragment {
9444 name: "mysystemserverclasspathfragment",
9445 contents: ["mysystemserverclasspathlib"],
9446 apex_available: ["myapex"],
9447 }
9448
9449 java_library {
9450 name: "mysystemserverclasspathlib",
9451 srcs: ["mysystemserverclasspathlib.java"],
9452 apex_available: ["myapex"],
9453 compile_dex: true,
9454 }
9455 `
9456
9457 result := android.GroupFixturePreparers(
9458 PrepareForTestWithApexBuildComponents,
9459 prepareForTestWithMyapex,
9460 java.PrepareForTestWithJavaDefaultModules,
9461 android.PrepareForTestWithAndroidBuildComponents,
9462 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009463 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9464 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009465 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009466 ).RunTest(t)
9467
9468 // Make sure jacoco ran on both mylib and mybootclasspathlib
9469 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9470 t.Errorf("Failed to find jacoco rule for mylib")
9471 }
9472 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9473 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9474 }
9475 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9476 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9477 }
9478}
9479
Jiyong Park192600a2021-08-03 07:52:17 +00009480func TestProhibitStaticExecutable(t *testing.T) {
9481 testApexError(t, `executable mybin is static`, `
9482 apex {
9483 name: "myapex",
9484 key: "myapex.key",
9485 binaries: ["mybin"],
9486 min_sdk_version: "29",
9487 }
9488
9489 apex_key {
9490 name: "myapex.key",
9491 public_key: "testkey.avbpubkey",
9492 private_key: "testkey.pem",
9493 }
9494
9495 cc_binary {
9496 name: "mybin",
9497 srcs: ["mylib.cpp"],
9498 relative_install_path: "foo/bar",
9499 static_executable: true,
9500 system_shared_libs: [],
9501 stl: "none",
9502 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009503 min_sdk_version: "29",
9504 }
9505 `)
9506
9507 testApexError(t, `executable mybin.rust is static`, `
9508 apex {
9509 name: "myapex",
9510 key: "myapex.key",
9511 binaries: ["mybin.rust"],
9512 min_sdk_version: "29",
9513 }
9514
9515 apex_key {
9516 name: "myapex.key",
9517 public_key: "testkey.avbpubkey",
9518 private_key: "testkey.pem",
9519 }
9520
9521 rust_binary {
9522 name: "mybin.rust",
9523 srcs: ["foo.rs"],
9524 static_executable: true,
9525 apex_available: ["myapex"],
9526 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009527 }
9528 `)
9529}
9530
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009531func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9532 ctx := testApex(t, `
9533 apex {
9534 name: "myapex",
9535 key: "myapex.key",
9536 updatable: false,
9537 java_libs: ["foo"],
9538 }
9539
9540 apex_key {
9541 name: "myapex.key",
9542 public_key: "testkey.avbpubkey",
9543 private_key: "testkey.pem",
9544 }
9545
9546 java_library {
9547 name: "foo",
9548 srcs: ["foo.java"],
9549 apex_available: ["myapex"],
9550 installable: true,
9551 }
9552 `,
9553 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9554 )
9555
9556 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9557 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9558 var builder strings.Builder
9559 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9560 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009561 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex\n")
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009562}
9563
9564func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9565 ctx := testApex(t, `
9566 prebuilt_apex {
9567 name: "myapex",
9568 arch: {
9569 arm64: {
9570 src: "myapex-arm64.apex",
9571 },
9572 arm: {
9573 src: "myapex-arm.apex",
9574 },
9575 },
9576 exported_java_libs: ["foo"],
9577 }
9578
9579 java_import {
9580 name: "foo",
9581 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009582 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009583 }
9584 `,
9585 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9586 )
9587
9588 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9589 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9590 mainModuleEntries := entriesList[0]
9591 android.AssertArrayString(t,
9592 "LOCAL_REQUIRED_MODULES",
9593 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9594 []string{
9595 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9596 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9597 })
9598}
9599
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009600func TestAndroidMk_RequiredModules(t *testing.T) {
9601 ctx := testApex(t, `
9602 apex {
9603 name: "myapex",
9604 key: "myapex.key",
9605 updatable: false,
9606 java_libs: ["foo"],
9607 required: ["otherapex"],
9608 }
9609
9610 apex {
9611 name: "otherapex",
9612 key: "myapex.key",
9613 updatable: false,
9614 java_libs: ["foo"],
9615 required: ["otherapex"],
9616 }
9617
9618 apex_key {
9619 name: "myapex.key",
9620 public_key: "testkey.avbpubkey",
9621 private_key: "testkey.pem",
9622 }
9623
9624 java_library {
9625 name: "foo",
9626 srcs: ["foo.java"],
9627 apex_available: ["myapex", "otherapex"],
9628 installable: true,
9629 }
9630 `)
9631
9632 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9633 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9634 var builder strings.Builder
9635 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9636 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009637 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009638}
9639
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009640func TestAndroidMk_RequiredDeps(t *testing.T) {
9641 ctx := testApex(t, `
9642 apex {
9643 name: "myapex",
9644 key: "myapex.key",
9645 updatable: false,
9646 }
9647
9648 apex_key {
9649 name: "myapex.key",
9650 public_key: "testkey.avbpubkey",
9651 private_key: "testkey.pem",
9652 }
9653 `)
9654
9655 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009656 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009657 data := android.AndroidMkDataForTest(t, ctx, bundle)
9658 var builder strings.Builder
9659 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9660 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009661 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009662
9663 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009664 flattenedBundle.makeModulesToInstall = append(flattenedBundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009665 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9666 var flattenedBuilder strings.Builder
9667 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9668 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009669 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009670}
9671
Jooyung Hana6d36672022-02-24 13:58:07 +09009672func TestApexOutputFileProducer(t *testing.T) {
9673 for _, tc := range []struct {
9674 name string
9675 ref string
9676 expected_data []string
9677 }{
9678 {
9679 name: "test_using_output",
9680 ref: ":myapex",
9681 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9682 },
9683 {
9684 name: "test_using_apex",
9685 ref: ":myapex{.apex}",
9686 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9687 },
9688 } {
9689 t.Run(tc.name, func(t *testing.T) {
9690 ctx := testApex(t, `
9691 apex {
9692 name: "myapex",
9693 key: "myapex.key",
9694 compressible: true,
9695 updatable: false,
9696 }
9697
9698 apex_key {
9699 name: "myapex.key",
9700 public_key: "testkey.avbpubkey",
9701 private_key: "testkey.pem",
9702 }
9703
9704 java_test {
9705 name: "`+tc.name+`",
9706 srcs: ["a.java"],
9707 data: ["`+tc.ref+`"],
9708 }
9709 `,
9710 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9711 variables.CompressedApex = proptools.BoolPtr(true)
9712 }))
9713 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9714 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9715 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9716 })
9717 }
9718}
9719
satayev758968a2021-12-06 11:42:40 +00009720func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9721 preparer := android.GroupFixturePreparers(
9722 PrepareForTestWithApexBuildComponents,
9723 prepareForTestWithMyapex,
9724 java.PrepareForTestWithJavaSdkLibraryFiles,
9725 java.PrepareForTestWithJavaDefaultModules,
9726 android.PrepareForTestWithAndroidBuildComponents,
9727 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9728 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9729 )
9730
9731 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9732 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9733 preparer.RunTestWithBp(t, `
9734 apex {
9735 name: "myapex",
9736 key: "myapex.key",
9737 bootclasspath_fragments: ["mybootclasspathfragment"],
9738 min_sdk_version: "30",
9739 updatable: false,
9740 }
9741
9742 apex_key {
9743 name: "myapex.key",
9744 public_key: "testkey.avbpubkey",
9745 private_key: "testkey.pem",
9746 }
9747
9748 bootclasspath_fragment {
9749 name: "mybootclasspathfragment",
9750 contents: ["mybootclasspathlib"],
9751 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009752 hidden_api: {
9753 split_packages: ["*"],
9754 },
satayev758968a2021-12-06 11:42:40 +00009755 }
9756
9757 java_sdk_library {
9758 name: "mybootclasspathlib",
9759 srcs: ["mybootclasspathlib.java"],
9760 apex_available: ["myapex"],
9761 compile_dex: true,
9762 unsafe_ignore_missing_latest_api: true,
9763 min_sdk_version: "31",
9764 static_libs: ["util"],
9765 }
9766
9767 java_library {
9768 name: "util",
9769 srcs: ["a.java"],
9770 apex_available: ["myapex"],
9771 min_sdk_version: "31",
9772 static_libs: ["another_util"],
9773 }
9774
9775 java_library {
9776 name: "another_util",
9777 srcs: ["a.java"],
9778 min_sdk_version: "31",
9779 apex_available: ["myapex"],
9780 }
9781 `)
9782 })
9783
9784 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9785 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9786 preparer.RunTestWithBp(t, `
9787 apex {
9788 name: "myapex",
9789 key: "myapex.key",
9790 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9791 min_sdk_version: "30",
9792 updatable: false,
9793 }
9794
9795 apex_key {
9796 name: "myapex.key",
9797 public_key: "testkey.avbpubkey",
9798 private_key: "testkey.pem",
9799 }
9800
9801 systemserverclasspath_fragment {
9802 name: "mysystemserverclasspathfragment",
9803 contents: ["mysystemserverclasspathlib"],
9804 apex_available: ["myapex"],
9805 }
9806
9807 java_sdk_library {
9808 name: "mysystemserverclasspathlib",
9809 srcs: ["mysystemserverclasspathlib.java"],
9810 apex_available: ["myapex"],
9811 compile_dex: true,
9812 min_sdk_version: "32",
9813 unsafe_ignore_missing_latest_api: true,
9814 static_libs: ["util"],
9815 }
9816
9817 java_library {
9818 name: "util",
9819 srcs: ["a.java"],
9820 apex_available: ["myapex"],
9821 min_sdk_version: "31",
9822 static_libs: ["another_util"],
9823 }
9824
9825 java_library {
9826 name: "another_util",
9827 srcs: ["a.java"],
9828 min_sdk_version: "31",
9829 apex_available: ["myapex"],
9830 }
9831 `)
9832 })
9833
9834 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9835 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9836 RunTestWithBp(t, `
9837 apex {
9838 name: "myapex",
9839 key: "myapex.key",
9840 bootclasspath_fragments: ["mybootclasspathfragment"],
9841 min_sdk_version: "30",
9842 updatable: false,
9843 }
9844
9845 apex_key {
9846 name: "myapex.key",
9847 public_key: "testkey.avbpubkey",
9848 private_key: "testkey.pem",
9849 }
9850
9851 bootclasspath_fragment {
9852 name: "mybootclasspathfragment",
9853 contents: ["mybootclasspathlib"],
9854 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009855 hidden_api: {
9856 split_packages: ["*"],
9857 },
satayev758968a2021-12-06 11:42:40 +00009858 }
9859
9860 java_sdk_library {
9861 name: "mybootclasspathlib",
9862 srcs: ["mybootclasspathlib.java"],
9863 apex_available: ["myapex"],
9864 compile_dex: true,
9865 unsafe_ignore_missing_latest_api: true,
9866 }
9867 `)
9868 })
9869
9870 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9871 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9872 RunTestWithBp(t, `
9873 apex {
9874 name: "myapex",
9875 key: "myapex.key",
9876 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9877 min_sdk_version: "30",
9878 updatable: false,
9879 }
9880
9881 apex_key {
9882 name: "myapex.key",
9883 public_key: "testkey.avbpubkey",
9884 private_key: "testkey.pem",
9885 }
9886
9887 systemserverclasspath_fragment {
9888 name: "mysystemserverclasspathfragment",
9889 contents: ["mysystemserverclasspathlib"],
9890 apex_available: ["myapex"],
9891 }
9892
9893 java_sdk_library {
9894 name: "mysystemserverclasspathlib",
9895 srcs: ["mysystemserverclasspathlib.java"],
9896 apex_available: ["myapex"],
9897 compile_dex: true,
9898 unsafe_ignore_missing_latest_api: true,
9899 }
9900 `)
9901 })
9902}
9903
Jiakai Zhang6decef92022-01-12 17:56:19 +00009904// Verifies that the APEX depends on all the Make modules in the list.
9905func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9906 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9907 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009908 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009909 }
9910}
9911
9912// Verifies that the APEX does not depend on any of the Make modules in the list.
9913func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9914 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9915 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009916 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009917 }
9918}
9919
Cole Faust1021ccd2023-02-26 21:15:25 -08009920// TODO(b/193460475): Re-enable this test
9921//func TestApexStrictUpdtabilityLint(t *testing.T) {
9922// bpTemplate := `
9923// apex {
9924// name: "myapex",
9925// key: "myapex.key",
9926// java_libs: ["myjavalib"],
9927// updatable: %v,
9928// min_sdk_version: "29",
9929// }
9930// apex_key {
9931// name: "myapex.key",
9932// }
9933// java_library {
9934// name: "myjavalib",
9935// srcs: ["MyClass.java"],
9936// apex_available: [ "myapex" ],
9937// lint: {
9938// strict_updatability_linting: %v,
9939// },
9940// sdk_version: "current",
9941// min_sdk_version: "29",
9942// }
9943// `
9944// fs := android.MockFS{
9945// "lint-baseline.xml": nil,
9946// }
9947//
9948// testCases := []struct {
9949// testCaseName string
9950// apexUpdatable bool
9951// javaStrictUpdtabilityLint bool
9952// lintFileExists bool
9953// disallowedFlagExpected bool
9954// }{
9955// {
9956// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9957// apexUpdatable: true,
9958// javaStrictUpdtabilityLint: true,
9959// lintFileExists: false,
9960// disallowedFlagExpected: false,
9961// },
9962// {
9963// testCaseName: "non-updatable apex respects strict_updatability of javalib",
9964// apexUpdatable: false,
9965// javaStrictUpdtabilityLint: false,
9966// lintFileExists: true,
9967// disallowedFlagExpected: false,
9968// },
9969// {
9970// testCaseName: "non-updatable apex respects strict updatability of javalib",
9971// apexUpdatable: false,
9972// javaStrictUpdtabilityLint: true,
9973// lintFileExists: true,
9974// disallowedFlagExpected: true,
9975// },
9976// {
9977// testCaseName: "updatable apex sets strict updatability of javalib to true",
9978// apexUpdatable: true,
9979// javaStrictUpdtabilityLint: false, // will be set to true by mutator
9980// lintFileExists: true,
9981// disallowedFlagExpected: true,
9982// },
9983// }
9984//
9985// for _, testCase := range testCases {
9986// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9987// fixtures := []android.FixturePreparer{}
9988// if testCase.lintFileExists {
9989// fixtures = append(fixtures, fs.AddToFixture())
9990// }
9991//
9992// result := testApex(t, bp, fixtures...)
9993// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9994// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9995// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9996//
9997// if disallowedFlagActual != testCase.disallowedFlagExpected {
9998// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9999// }
10000// }
10001//}
10002//
10003//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10004// bp := `
10005// apex {
10006// name: "myapex",
10007// key: "myapex.key",
10008// java_libs: ["myjavalib"],
10009// updatable: true,
10010// min_sdk_version: "29",
10011// }
10012// apex_key {
10013// name: "myapex.key",
10014// }
10015// java_library {
10016// name: "myjavalib",
10017// srcs: ["MyClass.java"],
10018// apex_available: [ "myapex" ],
10019// sdk_version: "current",
10020// min_sdk_version: "29",
10021// }
10022// `
10023//
10024// testCases := []struct {
10025// testCaseName string
10026// moduleDirectory string
10027// disallowedFlagExpected bool
10028// }{
10029// {
10030// testCaseName: "lintable module defined outside libcore",
10031// moduleDirectory: "",
10032// disallowedFlagExpected: true,
10033// },
10034// {
10035// testCaseName: "lintable module defined in libcore root directory",
10036// moduleDirectory: "libcore/",
10037// disallowedFlagExpected: false,
10038// },
10039// {
10040// testCaseName: "lintable module defined in libcore child directory",
10041// moduleDirectory: "libcore/childdir/",
10042// disallowedFlagExpected: true,
10043// },
10044// }
10045//
10046// for _, testCase := range testCases {
10047// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10048// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10049// result := testApex(t, "", lintFileCreator, bpFileCreator)
10050// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10051// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10052// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10053// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10054//
10055// if disallowedFlagActual != testCase.disallowedFlagExpected {
10056// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10057// }
10058// }
10059//}
10060//
10061//// checks transtive deps of an apex coming from bootclasspath_fragment
10062//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10063// bp := `
10064// apex {
10065// name: "myapex",
10066// key: "myapex.key",
10067// bootclasspath_fragments: ["mybootclasspathfragment"],
10068// updatable: true,
10069// min_sdk_version: "29",
10070// }
10071// apex_key {
10072// name: "myapex.key",
10073// }
10074// bootclasspath_fragment {
10075// name: "mybootclasspathfragment",
10076// contents: ["myjavalib"],
10077// apex_available: ["myapex"],
10078// hidden_api: {
10079// split_packages: ["*"],
10080// },
10081// }
10082// java_library {
10083// name: "myjavalib",
10084// srcs: ["MyClass.java"],
10085// apex_available: [ "myapex" ],
10086// sdk_version: "current",
10087// min_sdk_version: "29",
10088// compile_dex: true,
10089// }
10090// `
10091// fs := android.MockFS{
10092// "lint-baseline.xml": nil,
10093// }
10094//
10095// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10096// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10097// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10098// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10099// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10100// }
10101//}
Spandan Das66773252022-01-15 00:23:18 +000010102
Spandan Das42e89502022-05-06 22:12:55 +000010103// updatable apexes should propagate updatable=true to its apps
10104func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10105 bp := `
10106 apex {
10107 name: "myapex",
10108 key: "myapex.key",
10109 updatable: %v,
10110 apps: [
10111 "myapp",
10112 ],
10113 min_sdk_version: "30",
10114 }
10115 apex_key {
10116 name: "myapex.key",
10117 }
10118 android_app {
10119 name: "myapp",
10120 updatable: %v,
10121 apex_available: [
10122 "myapex",
10123 ],
10124 sdk_version: "current",
10125 min_sdk_version: "30",
10126 }
10127 `
10128 testCases := []struct {
10129 name string
10130 apex_is_updatable_bp bool
10131 app_is_updatable_bp bool
10132 app_is_updatable_expected bool
10133 }{
10134 {
10135 name: "Non-updatable apex respects updatable property of non-updatable app",
10136 apex_is_updatable_bp: false,
10137 app_is_updatable_bp: false,
10138 app_is_updatable_expected: false,
10139 },
10140 {
10141 name: "Non-updatable apex respects updatable property of updatable app",
10142 apex_is_updatable_bp: false,
10143 app_is_updatable_bp: true,
10144 app_is_updatable_expected: true,
10145 },
10146 {
10147 name: "Updatable apex respects updatable property of updatable app",
10148 apex_is_updatable_bp: true,
10149 app_is_updatable_bp: true,
10150 app_is_updatable_expected: true,
10151 },
10152 {
10153 name: "Updatable apex sets updatable=true on non-updatable app",
10154 apex_is_updatable_bp: true,
10155 app_is_updatable_bp: false,
10156 app_is_updatable_expected: true,
10157 },
10158 }
10159 for _, testCase := range testCases {
10160 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10161 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10162 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10163 }
10164}
10165
Kiyoung Kim487689e2022-07-26 09:48:22 +090010166func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10167 bp := `
10168 apex {
10169 name: "myapex",
10170 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010171 native_shared_libs: ["libbaz"],
10172 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010173 min_sdk_version: "29",
10174 }
10175 apex_key {
10176 name: "myapex.key",
10177 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010178 cc_binary {
10179 name: "binfoo",
10180 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010181 apex_available: ["myapex"],
10182 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010183 recovery_available: false,
10184 }
10185 cc_library {
10186 name: "libbar",
10187 srcs: ["libbar.cc"],
10188 stubs: {
10189 symbol_file: "libbar.map.txt",
10190 versions: [
10191 "29",
10192 ],
10193 },
10194 }
10195 cc_library {
10196 name: "libbaz",
10197 srcs: ["libbaz.cc"],
10198 apex_available: ["myapex"],
10199 min_sdk_version: "29",
10200 stubs: {
10201 symbol_file: "libbaz.map.txt",
10202 versions: [
10203 "29",
10204 ],
10205 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010206 }
10207 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010208 name: "libbar",
10209 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010210 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010211 variants: ["apex.29"],
10212 }
10213 cc_api_variant {
10214 name: "libbar",
10215 variant: "apex",
10216 version: "29",
10217 src: "libbar_apex_29.so",
10218 }
10219 cc_api_library {
10220 name: "libbaz",
10221 src: "libbaz_stub.so",
10222 min_sdk_version: "29",
10223 variants: ["apex.29"],
10224 }
10225 cc_api_variant {
10226 name: "libbaz",
10227 variant: "apex",
10228 version: "29",
10229 src: "libbaz_apex_29.so",
10230 }
10231 cc_api_library {
10232 name: "libqux",
10233 src: "libqux_stub.so",
10234 min_sdk_version: "29",
10235 variants: ["apex.29"],
10236 }
10237 cc_api_variant {
10238 name: "libqux",
10239 variant: "apex",
10240 version: "29",
10241 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010242 }
10243 api_imports {
10244 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010245 apex_shared_libs: [
10246 "libbar",
10247 "libbaz",
10248 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010249 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010250 }
10251 `
10252 result := testApex(t, bp)
10253
10254 hasDep := func(m android.Module, wantDep android.Module) bool {
10255 t.Helper()
10256 var found bool
10257 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10258 if dep == wantDep {
10259 found = true
10260 }
10261 })
10262 return found
10263 }
10264
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010265 // Library defines stubs and cc_api_library should be used with cc_api_library
10266 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10267 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10268 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010269
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010270 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10271 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010272
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010273 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10274 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10275 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10276 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10277
10278 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10279 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10280 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10281 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10282 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10283
10284 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10285 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10286 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10287
10288 // cc_api_library defined without original library should be linked with cc_api_library
10289 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10290 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10291 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10292}
10293
10294func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10295 bp := `
10296 apex {
10297 name: "myapex",
10298 key: "myapex.key",
10299 native_shared_libs: ["libbar"],
10300 min_sdk_version: "29",
10301 }
10302 apex_key {
10303 name: "myapex.key",
10304 }
10305 cc_binary {
10306 name: "binfoo",
10307 shared_libs: ["libbar"],
10308 recovery_available: false,
10309 }
10310 cc_library {
10311 name: "libbar",
10312 srcs: ["libbar.cc"],
10313 apex_available: ["myapex"],
10314 min_sdk_version: "29",
10315 stubs: {
10316 symbol_file: "libbar.map.txt",
10317 versions: [
10318 "29",
10319 ],
10320 },
10321 }
10322 cc_api_library {
10323 name: "libbar",
10324 src: "libbar_stub.so",
10325 variants: ["apex.29"],
10326 }
10327 cc_api_variant {
10328 name: "libbar",
10329 variant: "apex",
10330 version: "29",
10331 src: "libbar_apex_29.so",
10332 }
10333 api_imports {
10334 name: "api_imports",
10335 apex_shared_libs: [
10336 "libbar",
10337 ],
10338 }
10339 `
10340
10341 result := testApex(t, bp)
10342
10343 hasDep := func(m android.Module, wantDep android.Module) bool {
10344 t.Helper()
10345 var found bool
10346 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10347 if dep == wantDep {
10348 found = true
10349 }
10350 })
10351 return found
10352 }
10353
10354 // Library defines stubs and cc_api_library should be used with cc_api_library
10355 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10356 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10357 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10358
10359 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10360 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10361
10362 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10363 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10364 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10365 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010366}
Dennis Shend4f5d932023-01-31 20:27:21 +000010367
10368func TestTrimmedApex(t *testing.T) {
10369 bp := `
10370 apex {
10371 name: "myapex",
10372 key: "myapex.key",
10373 native_shared_libs: ["libfoo","libbaz"],
10374 min_sdk_version: "29",
10375 trim_against: "mydcla",
10376 }
10377 apex {
10378 name: "mydcla",
10379 key: "myapex.key",
10380 native_shared_libs: ["libfoo","libbar"],
10381 min_sdk_version: "29",
10382 file_contexts: ":myapex-file_contexts",
10383 dynamic_common_lib_apex: true,
10384 }
10385 apex_key {
10386 name: "myapex.key",
10387 }
10388 cc_library {
10389 name: "libfoo",
10390 shared_libs: ["libc"],
10391 apex_available: ["myapex","mydcla"],
10392 min_sdk_version: "29",
10393 }
10394 cc_library {
10395 name: "libbar",
10396 shared_libs: ["libc"],
10397 apex_available: ["myapex","mydcla"],
10398 min_sdk_version: "29",
10399 }
10400 cc_library {
10401 name: "libbaz",
10402 shared_libs: ["libc"],
10403 apex_available: ["myapex","mydcla"],
10404 min_sdk_version: "29",
10405 }
10406 cc_api_library {
10407 name: "libc",
10408 src: "libc.so",
10409 min_sdk_version: "29",
10410 recovery_available: true,
10411 }
10412 api_imports {
10413 name: "api_imports",
10414 shared_libs: [
10415 "libc",
10416 ],
10417 header_libs: [],
10418 }
10419 `
10420 ctx := testApex(t, bp)
10421 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10422 apexRule := module.MaybeRule("apexRule")
10423 if apexRule.Rule == nil {
10424 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10425 }
10426
10427 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
10428 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
10429 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10430 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10431 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10432 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10433}
Jingwen Chendea7a642023-03-28 11:30:50 +000010434
10435func TestCannedFsConfig(t *testing.T) {
10436 ctx := testApex(t, `
10437 apex {
10438 name: "myapex",
10439 key: "myapex.key",
10440 updatable: false,
10441 }
10442
10443 apex_key {
10444 name: "myapex.key",
10445 public_key: "testkey.avbpubkey",
10446 private_key: "testkey.pem",
10447 }`)
10448 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10449 generateFsRule := mod.Rule("generateFsConfig")
10450 cmd := generateFsRule.RuleParams.Command
10451
10452 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10453}
10454
10455func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10456 ctx := testApex(t, `
10457 apex {
10458 name: "myapex",
10459 key: "myapex.key",
10460 canned_fs_config: "my_config",
10461 updatable: false,
10462 }
10463
10464 apex_key {
10465 name: "myapex.key",
10466 public_key: "testkey.avbpubkey",
10467 private_key: "testkey.pem",
10468 }`)
10469 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10470 generateFsRule := mod.Rule("generateFsConfig")
10471 cmd := generateFsRule.RuleParams.Command
10472
10473 // Ensure that canned_fs_config has "cat my_config" at the end
10474 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10475}
Spandan Das20fce2d2023-04-12 17:21:39 +000010476
10477func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10478 testCases := []struct {
10479 desc string
10480 hasStubs bool
10481 apexAvailable string
10482 expectedError string
10483 }{
10484 {
10485 desc: "non-stub library can have multiple apex_available",
10486 hasStubs: false,
10487 apexAvailable: `["myapex", "otherapex"]`,
10488 },
10489 {
10490 desc: "stub library should not be available to anyapex",
10491 hasStubs: true,
10492 apexAvailable: `["//apex_available:anyapex"]`,
10493 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10494 },
10495 {
10496 desc: "stub library should not be available to multiple apexes",
10497 hasStubs: true,
10498 apexAvailable: `["myapex", "otherapex"]`,
10499 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10500 },
10501 {
10502 desc: "stub library can be available to a core apex and a test apex",
10503 hasStubs: true,
10504 apexAvailable: `["myapex", "test_myapex"]`,
10505 },
10506 }
10507 bpTemplate := `
10508 cc_library {
10509 name: "libfoo",
10510 %v
10511 apex_available: %v,
10512 }
10513 apex {
10514 name: "myapex",
10515 key: "apex.key",
10516 updatable: false,
10517 native_shared_libs: ["libfoo"],
10518 }
10519 apex {
10520 name: "otherapex",
10521 key: "apex.key",
10522 updatable: false,
10523 }
10524 apex_test {
10525 name: "test_myapex",
10526 key: "apex.key",
10527 updatable: false,
10528 native_shared_libs: ["libfoo"],
10529 }
10530 apex_key {
10531 name: "apex.key",
10532 }
10533 `
10534 for _, tc := range testCases {
10535 stubs := ""
10536 if tc.hasStubs {
10537 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10538 }
10539 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10540 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10541 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10542 })
10543 if tc.expectedError == "" {
10544 testApex(t, bp, mockFsFixturePreparer)
10545 } else {
10546 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10547 }
10548 }
10549}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010550
10551func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10552 context := android.GroupFixturePreparers(
10553 android.PrepareForIntegrationTestWithAndroid,
10554 cc.PrepareForIntegrationTestWithCc,
10555 PrepareForTestWithApexBuildComponents,
10556 prepareForTestWithMyapex,
10557 filesystem.PrepareForTestWithFilesystemBuildComponents,
10558 )
10559 result := context.RunTestWithBp(t, `
10560 android_system_image {
10561 name: "myfilesystem",
10562 deps: [
10563 "libfoo",
10564 ],
10565 linker_config_src: "linker.config.json",
10566 }
10567
10568 cc_library {
10569 name: "libfoo",
10570 shared_libs: [
10571 "libbar",
10572 ],
10573 stl: "none",
10574 }
10575
10576 cc_library {
10577 name: "libbar",
10578 stl: "none",
10579 apex_available: ["myapex"],
10580 }
10581
10582 apex {
10583 name: "myapex",
10584 native_shared_libs: ["libbar"],
10585 key: "myapex.key",
10586 updatable: false,
10587 }
10588
10589 apex_key {
10590 name: "myapex.key",
10591 public_key: "testkey.avbpubkey",
10592 private_key: "testkey.pem",
10593 }
10594 `)
10595
10596 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10597 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10598 inputs.Strings(),
10599 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10600}