blob: 076dc3f0fb3734189a9cd8c9f16ad554b582feb6 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Kiyoung Kim487689e2022-07-26 09:48:22 +090028 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090029 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070036 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090037 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090038 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070039 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090040)
41
Jooyung Hand3639552019-08-09 12:57:43 +090042// names returns name list from white space separated string
43func names(s string) (ns []string) {
44 for _, n := range strings.Split(s, " ") {
45 if len(n) > 0 {
46 ns = append(ns, n)
47 }
48 }
49 return
50}
51
Paul Duffin40b62572021-03-20 11:39:01 +000052func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090053 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010054 android.GroupFixturePreparers(
55 prepareForApexTest,
56 android.GroupFixturePreparers(preparers...),
57 ).
Paul Duffine05480a2021-03-08 15:07:14 +000058 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000059 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090060}
61
Paul Duffin40b62572021-03-20 11:39:01 +000062func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090063 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010064
65 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000066 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010067 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000068 }
Paul Duffin284165a2021-03-29 01:50:31 +010069
70 result := android.GroupFixturePreparers(
71 prepareForApexTest,
72 android.GroupFixturePreparers(preparers...),
73 optionalBpPreparer,
74 ).RunTest(t)
75
Paul Duffine05480a2021-03-08 15:07:14 +000076 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090077}
78
Paul Duffin810f33d2021-03-09 14:12:32 +000079func withFiles(files android.MockFS) android.FixturePreparer {
80 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090081}
82
Paul Duffin810f33d2021-03-09 14:12:32 +000083func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
84 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090085 for k, v := range targets {
86 config.Targets[k] = v
87 }
Paul Duffin810f33d2021-03-09 14:12:32 +000088 })
Jooyung Han344d5432019-08-23 11:17:39 +090089}
90
Jooyung Han35155c42020-02-06 17:33:20 +090091// withNativeBridgeTargets sets configuration with targets including:
92// - X86_64 (primary)
93// - X86 (secondary)
94// - Arm64 on X86_64 (native bridge)
95// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000096var withNativeBridgeEnabled = android.FixtureModifyConfig(
97 func(config android.Config) {
98 config.Targets[android.Android] = []android.Target{
99 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
100 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
104 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
107 }
108 },
109)
110
111func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
112 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
113 variables.ManifestPackageNameOverrides = specs
114 })
Jooyung Han35155c42020-02-06 17:33:20 +0900115}
116
Albert Martineefabcf2022-03-21 20:11:16 +0000117func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
118 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
119 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
120 })
121}
122
Paul Duffin810f33d2021-03-09 14:12:32 +0000123var withBinder32bit = android.FixtureModifyProductVariables(
124 func(variables android.FixtureProductVariables) {
125 variables.Binder32bit = proptools.BoolPtr(true)
126 },
127)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900128
Paul Duffin810f33d2021-03-09 14:12:32 +0000129var withUnbundledBuild = android.FixtureModifyProductVariables(
130 func(variables android.FixtureProductVariables) {
131 variables.Unbundled_build = proptools.BoolPtr(true)
132 },
133)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900134
Paul Duffin284165a2021-03-29 01:50:31 +0100135// Legacy preparer used for running tests within the apex package.
136//
137// This includes everything that was needed to run any test in the apex package prior to the
138// introduction of the test fixtures. Tests that are being converted to use fixtures directly
139// rather than through the testApex...() methods should avoid using this and instead use the
140// various preparers directly, using android.GroupFixturePreparers(...) to group them when
141// necessary.
142//
143// deprecated
144var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000145 // General preparers in alphabetical order as test infrastructure will enforce correct
146 // registration order.
147 android.PrepareForTestWithAndroidBuildComponents,
148 bpf.PrepareForTestWithBpf,
149 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100150 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000151 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
152 rust.PrepareForTestWithRustDefaultModules,
153 sh.PrepareForTestWithShBuildComponents,
154
155 PrepareForTestWithApexBuildComponents,
156
157 // Additional apex test specific preparers.
158 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
159 filegroup {
160 name: "myapex-file_contexts",
161 srcs: [
162 "apex/myapex-file_contexts",
163 ],
164 }
165 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000166 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000167 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000168 "a.java": nil,
169 "PrebuiltAppFoo.apk": nil,
170 "PrebuiltAppFooPriv.apk": nil,
171 "apex_manifest.json": nil,
172 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000173 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
174 "system/sepolicy/apex/myapex2-file_contexts": nil,
175 "system/sepolicy/apex/otherapex-file_contexts": nil,
176 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
177 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700178 "mylib.cpp": nil,
179 "mytest.cpp": nil,
180 "mytest1.cpp": nil,
181 "mytest2.cpp": nil,
182 "mytest3.cpp": nil,
183 "myprebuilt": nil,
184 "my_include": nil,
185 "foo/bar/MyClass.java": nil,
186 "prebuilt.jar": nil,
187 "prebuilt.so": nil,
188 "vendor/foo/devkeys/test.x509.pem": nil,
189 "vendor/foo/devkeys/test.pk8": nil,
190 "testkey.x509.pem": nil,
191 "testkey.pk8": nil,
192 "testkey.override.x509.pem": nil,
193 "testkey.override.pk8": nil,
194 "vendor/foo/devkeys/testkey.avbpubkey": nil,
195 "vendor/foo/devkeys/testkey.pem": nil,
196 "NOTICE": nil,
197 "custom_notice": nil,
198 "custom_notice_for_static_lib": nil,
199 "testkey2.avbpubkey": nil,
200 "testkey2.pem": nil,
201 "myapex-arm64.apex": nil,
202 "myapex-arm.apex": nil,
203 "myapex.apks": nil,
204 "frameworks/base/api/current.txt": nil,
205 "framework/aidl/a.aidl": nil,
206 "dummy.txt": nil,
207 "baz": nil,
208 "bar/baz": nil,
209 "testdata/baz": nil,
210 "AppSet.apks": nil,
211 "foo.rs": nil,
212 "libfoo.jar": nil,
213 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000214 },
215 ),
216
217 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
218 variables.DeviceVndkVersion = proptools.StringPtr("current")
219 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
220 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
221 variables.Platform_sdk_codename = proptools.StringPtr("Q")
222 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000223 // "Tiramisu" needs to be in the next line for compatibility with soong code,
224 // not because of these tests specifically (it's not used by the tests)
225 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900226 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000227 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000228 }),
229)
230
Paul Duffin52bfaa42021-03-23 23:40:12 +0000231var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
232 "system/sepolicy/apex/myapex-file_contexts": nil,
233})
234
Jooyung Han643adc42020-02-27 13:50:06 +0900235// ensure that 'result' equals 'expected'
236func ensureEquals(t *testing.T, result string, expected string) {
237 t.Helper()
238 if result != expected {
239 t.Errorf("%q != %q", expected, result)
240 }
241}
242
Jiyong Park25fc6a92018-11-18 18:02:45 +0900243// ensure that 'result' contains 'expected'
244func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900245 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900246 if !strings.Contains(result, expected) {
247 t.Errorf("%q is not found in %q", expected, result)
248 }
249}
250
Liz Kammer5bd365f2020-05-27 15:15:11 -0700251// ensure that 'result' contains 'expected' exactly one time
252func ensureContainsOnce(t *testing.T, result string, expected string) {
253 t.Helper()
254 count := strings.Count(result, expected)
255 if count != 1 {
256 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
257 }
258}
259
Jiyong Park25fc6a92018-11-18 18:02:45 +0900260// ensures that 'result' does not contain 'notExpected'
261func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900262 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900263 if strings.Contains(result, notExpected) {
264 t.Errorf("%q is found in %q", notExpected, result)
265 }
266}
267
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700268func ensureMatches(t *testing.T, result string, expectedRex string) {
269 ok, err := regexp.MatchString(expectedRex, result)
270 if err != nil {
271 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
272 return
273 }
274 if !ok {
275 t.Errorf("%s does not match regular expession %s", result, expectedRex)
276 }
277}
278
Jiyong Park25fc6a92018-11-18 18:02:45 +0900279func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900280 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900281 if !android.InList(expected, result) {
282 t.Errorf("%q is not found in %v", expected, result)
283 }
284}
285
286func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900287 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900288 if android.InList(notExpected, result) {
289 t.Errorf("%q is found in %v", notExpected, result)
290 }
291}
292
Jooyung Hane1633032019-08-01 17:41:43 +0900293func ensureListEmpty(t *testing.T, result []string) {
294 t.Helper()
295 if len(result) > 0 {
296 t.Errorf("%q is expected to be empty", result)
297 }
298}
299
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000300func ensureListNotEmpty(t *testing.T, result []string) {
301 t.Helper()
302 if len(result) == 0 {
303 t.Errorf("%q is expected to be not empty", result)
304 }
305}
306
Jiyong Park25fc6a92018-11-18 18:02:45 +0900307// Minimal test
308func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800309 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900310 apex_defaults {
311 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900312 manifest: ":myapex.manifest",
313 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900314 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900315 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900316 native_shared_libs: [
317 "mylib",
318 "libfoo.ffi",
319 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900320 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800321 multilib: {
322 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900323 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800324 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900325 },
Jiyong Park77acec62020-06-01 21:39:15 +0900326 java_libs: [
327 "myjar",
328 "myjar_dex",
329 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000330 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900331 }
332
Jiyong Park30ca9372019-02-07 16:27:23 +0900333 apex {
334 name: "myapex",
335 defaults: ["myapex-defaults"],
336 }
337
Jiyong Park25fc6a92018-11-18 18:02:45 +0900338 apex_key {
339 name: "myapex.key",
340 public_key: "testkey.avbpubkey",
341 private_key: "testkey.pem",
342 }
343
Jiyong Park809bb722019-02-13 21:33:49 +0900344 filegroup {
345 name: "myapex.manifest",
346 srcs: ["apex_manifest.json"],
347 }
348
349 filegroup {
350 name: "myapex.androidmanifest",
351 srcs: ["AndroidManifest.xml"],
352 }
353
Jiyong Park25fc6a92018-11-18 18:02:45 +0900354 cc_library {
355 name: "mylib",
356 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900357 shared_libs: [
358 "mylib2",
359 "libbar.ffi",
360 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900361 system_shared_libs: [],
362 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000363 // TODO: remove //apex_available:platform
364 apex_available: [
365 "//apex_available:platform",
366 "myapex",
367 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900368 }
369
Alex Light3d673592019-01-18 14:37:31 -0800370 cc_binary {
371 name: "foo",
372 srcs: ["mylib.cpp"],
373 compile_multilib: "both",
374 multilib: {
375 lib32: {
376 suffix: "32",
377 },
378 lib64: {
379 suffix: "64",
380 },
381 },
382 symlinks: ["foo_link_"],
383 symlink_preferred_arch: true,
384 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800385 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700386 apex_available: [ "myapex", "com.android.gki.*" ],
387 }
388
Jiyong Park99644e92020-11-17 22:21:02 +0900389 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000390 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900391 srcs: ["foo.rs"],
392 rlibs: ["libfoo.rlib.rust"],
Vinh Tran4eeb2a92023-08-14 13:29:30 -0400393 rustlibs: ["libfoo.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900394 apex_available: ["myapex"],
395 }
396
397 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000398 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900399 srcs: ["foo.rs"],
400 crate_name: "foo",
401 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900402 shared_libs: ["libfoo.shared_from_rust"],
403 }
404
405 cc_library_shared {
406 name: "libfoo.shared_from_rust",
407 srcs: ["mylib.cpp"],
408 system_shared_libs: [],
409 stl: "none",
410 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900411 }
412
413 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000414 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900415 srcs: ["foo.rs"],
416 crate_name: "foo",
417 apex_available: ["myapex"],
418 }
419
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900420 rust_ffi_shared {
421 name: "libfoo.ffi",
422 srcs: ["foo.rs"],
423 crate_name: "foo",
424 apex_available: ["myapex"],
425 }
426
427 rust_ffi_shared {
428 name: "libbar.ffi",
429 srcs: ["foo.rs"],
430 crate_name: "bar",
431 apex_available: ["myapex"],
432 }
433
Yifan Hongd22a84a2020-07-28 17:37:46 -0700434 apex {
435 name: "com.android.gki.fake",
436 binaries: ["foo"],
437 key: "myapex.key",
438 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000439 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800440 }
441
Paul Duffindddd5462020-04-07 15:25:44 +0100442 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900443 name: "mylib2",
444 srcs: ["mylib.cpp"],
445 system_shared_libs: [],
446 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900447 static_libs: ["libstatic"],
448 // TODO: remove //apex_available:platform
449 apex_available: [
450 "//apex_available:platform",
451 "myapex",
452 ],
453 }
454
Paul Duffindddd5462020-04-07 15:25:44 +0100455 cc_prebuilt_library_shared {
456 name: "mylib2",
457 srcs: ["prebuilt.so"],
458 // TODO: remove //apex_available:platform
459 apex_available: [
460 "//apex_available:platform",
461 "myapex",
462 ],
463 }
464
Jiyong Park9918e1a2020-03-17 19:16:40 +0900465 cc_library_static {
466 name: "libstatic",
467 srcs: ["mylib.cpp"],
468 system_shared_libs: [],
469 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000470 // TODO: remove //apex_available:platform
471 apex_available: [
472 "//apex_available:platform",
473 "myapex",
474 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900475 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476
477 java_library {
478 name: "myjar",
479 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900480 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900481 sdk_version: "none",
482 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900484 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000485 // TODO: remove //apex_available:platform
486 apex_available: [
487 "//apex_available:platform",
488 "myapex",
489 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 }
491
Jiyong Park77acec62020-06-01 21:39:15 +0900492 dex_import {
493 name: "myjar_dex",
494 jars: ["prebuilt.jar"],
495 apex_available: [
496 "//apex_available:platform",
497 "myapex",
498 ],
499 }
500
Jiyong Park7f7766d2019-07-25 22:02:35 +0900501 java_library {
502 name: "myotherjar",
503 srcs: ["foo/bar/MyClass.java"],
504 sdk_version: "none",
505 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900506 // TODO: remove //apex_available:platform
507 apex_available: [
508 "//apex_available:platform",
509 "myapex",
510 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900511 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900512
513 java_library {
514 name: "mysharedjar",
515 srcs: ["foo/bar/MyClass.java"],
516 sdk_version: "none",
517 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900518 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900519 `)
520
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) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900789 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900790 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900791 if vendor {
792 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900793 }
794 ctx := testApex(t, `
795 apex {
796 name: "myapex",
797 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900798 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900799 `+prop+`
800 }
801
802 apex_key {
803 name: "myapex.key",
804 public_key: "testkey.avbpubkey",
805 private_key: "testkey.pem",
806 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900807 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900808
809 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900810 if vendor {
811 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
812 rule.RuleParams.Command,
813 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900814 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900815 android.AssertStringDoesContain(t, "should force-label as system_file",
816 rule.RuleParams.Command,
817 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900818 }
819 }
820}
821
Jiyong Park25fc6a92018-11-18 18:02:45 +0900822func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800823 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900824 apex {
825 name: "myapex",
826 key: "myapex.key",
827 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900828 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000829 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900830 }
831
832 apex_key {
833 name: "myapex.key",
834 public_key: "testkey.avbpubkey",
835 private_key: "testkey.pem",
836 }
837
838 cc_library {
839 name: "mylib",
840 srcs: ["mylib.cpp"],
841 shared_libs: ["mylib2", "mylib3"],
842 system_shared_libs: [],
843 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000844 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900845 }
846
847 cc_library {
848 name: "mylib2",
849 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900850 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900851 system_shared_libs: [],
852 stl: "none",
853 stubs: {
854 versions: ["1", "2", "3"],
855 },
856 }
857
858 cc_library {
859 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900860 srcs: ["mylib.cpp"],
861 shared_libs: ["mylib4"],
862 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900863 stl: "none",
864 stubs: {
865 versions: ["10", "11", "12"],
866 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000867 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900868 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900869
870 cc_library {
871 name: "mylib4",
872 srcs: ["mylib.cpp"],
873 system_shared_libs: [],
874 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000875 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900876 }
Jiyong Park105dc322021-06-11 17:22:09 +0900877
878 rust_binary {
879 name: "foo.rust",
880 srcs: ["foo.rs"],
881 shared_libs: ["libfoo.shared_from_rust"],
882 prefer_rlib: true,
883 apex_available: ["myapex"],
884 }
885
886 cc_library_shared {
887 name: "libfoo.shared_from_rust",
888 srcs: ["mylib.cpp"],
889 system_shared_libs: [],
890 stl: "none",
891 stubs: {
892 versions: ["10", "11", "12"],
893 },
894 }
895
Jiyong Park25fc6a92018-11-18 18:02:45 +0900896 `)
897
Sundong Ahnabb64432019-10-22 13:58:29 +0900898 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900899 copyCmds := apexRule.Args["copy_commands"]
900
901 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800902 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900903
904 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800905 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900906
907 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800908 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900909
Colin Crossaede88c2020-08-11 12:17:01 -0700910 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900911
912 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900913 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900914 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900915 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900916
917 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700918 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700920 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900921
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700922 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
923 // is replaced by sharing of "cFlags" in cc/builder.go.
924 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
925 // module variable representing "cflags". So it was not detected by ensureNotContains.
926 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
927 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
928 // including the original cflags's "-include mylib.h".
929 //
Jiyong Park64379952018-12-13 18:37:29 +0900930 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700931 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
932 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900933
Jiyong Park85cc35a2022-07-17 11:30:47 +0900934 // Ensure that genstub for platform-provided lib is invoked with --systemapi
935 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
936 // Ensure that genstub for apex-provided lib is invoked with --apex
937 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900938
Jooyung Hana57af4a2020-01-23 05:36:59 +0000939 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900940 "lib64/mylib.so",
941 "lib64/mylib3.so",
942 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900943 "bin/foo.rust",
944 "lib64/libc++.so", // by the implicit dependency from foo.rust
945 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900946 })
Jiyong Park105dc322021-06-11 17:22:09 +0900947
948 // Ensure that stub dependency from a rust module is not included
949 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
950 // The rust module is linked to the stub cc library
Peter Collingbournee7c71c32023-03-31 20:21:19 -0700951 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +0900952 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
953 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900954
955 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
956 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900957}
958
Jiyong Park1bc84122021-06-22 20:23:05 +0900959func TestApexCanUsePrivateApis(t *testing.T) {
960 ctx := testApex(t, `
961 apex {
962 name: "myapex",
963 key: "myapex.key",
964 native_shared_libs: ["mylib"],
965 binaries: ["foo.rust"],
966 updatable: false,
967 platform_apis: true,
968 }
969
970 apex_key {
971 name: "myapex.key",
972 public_key: "testkey.avbpubkey",
973 private_key: "testkey.pem",
974 }
975
976 cc_library {
977 name: "mylib",
978 srcs: ["mylib.cpp"],
979 shared_libs: ["mylib2"],
980 system_shared_libs: [],
981 stl: "none",
982 apex_available: [ "myapex" ],
983 }
984
985 cc_library {
986 name: "mylib2",
987 srcs: ["mylib.cpp"],
988 cflags: ["-include mylib.h"],
989 system_shared_libs: [],
990 stl: "none",
991 stubs: {
992 versions: ["1", "2", "3"],
993 },
994 }
995
996 rust_binary {
997 name: "foo.rust",
998 srcs: ["foo.rs"],
999 shared_libs: ["libfoo.shared_from_rust"],
1000 prefer_rlib: true,
1001 apex_available: ["myapex"],
1002 }
1003
1004 cc_library_shared {
1005 name: "libfoo.shared_from_rust",
1006 srcs: ["mylib.cpp"],
1007 system_shared_libs: [],
1008 stl: "none",
1009 stubs: {
1010 versions: ["10", "11", "12"],
1011 },
1012 }
1013 `)
1014
1015 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1016 copyCmds := apexRule.Args["copy_commands"]
1017
1018 // Ensure that indirect stubs dep is not included
1019 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1020 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1021
1022 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1023 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001024 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001025 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1026 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Peter Collingbournee7c71c32023-03-31 20:21:19 -07001027 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001028 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1029 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1030}
1031
Colin Cross7812fd32020-09-25 12:35:10 -07001032func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1033 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001034 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001035 apex {
1036 name: "myapex",
1037 key: "myapex.key",
1038 native_shared_libs: ["mylib", "mylib3"],
1039 min_sdk_version: "29",
1040 }
1041
1042 apex_key {
1043 name: "myapex.key",
1044 public_key: "testkey.avbpubkey",
1045 private_key: "testkey.pem",
1046 }
1047
1048 cc_library {
1049 name: "mylib",
1050 srcs: ["mylib.cpp"],
1051 shared_libs: ["mylib2", "mylib3"],
1052 system_shared_libs: [],
1053 stl: "none",
1054 apex_available: [ "myapex" ],
1055 min_sdk_version: "28",
1056 }
1057
1058 cc_library {
1059 name: "mylib2",
1060 srcs: ["mylib.cpp"],
1061 cflags: ["-include mylib.h"],
1062 system_shared_libs: [],
1063 stl: "none",
1064 stubs: {
1065 versions: ["28", "29", "30", "current"],
1066 },
1067 min_sdk_version: "28",
1068 }
1069
1070 cc_library {
1071 name: "mylib3",
1072 srcs: ["mylib.cpp"],
1073 shared_libs: ["mylib4"],
1074 system_shared_libs: [],
1075 stl: "none",
1076 stubs: {
1077 versions: ["28", "29", "30", "current"],
1078 },
1079 apex_available: [ "myapex" ],
1080 min_sdk_version: "28",
1081 }
1082
1083 cc_library {
1084 name: "mylib4",
1085 srcs: ["mylib.cpp"],
1086 system_shared_libs: [],
1087 stl: "none",
1088 apex_available: [ "myapex" ],
1089 min_sdk_version: "28",
1090 }
1091 `)
1092
1093 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1094 copyCmds := apexRule.Args["copy_commands"]
1095
1096 // Ensure that direct non-stubs dep is always included
1097 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1098
1099 // Ensure that indirect stubs dep is not included
1100 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1101
1102 // Ensure that direct stubs dep is included
1103 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1104
1105 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1106
Jiyong Park55549df2021-02-26 23:57:23 +09001107 // Ensure that mylib is linking with the latest version of stub for mylib2
1108 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001109 // ... and not linking to the non-stub (impl) variant of mylib2
1110 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1111
1112 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1113 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1114 // .. and not linking to the stubs variant of mylib3
1115 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1116
1117 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001118 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001119 ensureNotContains(t, mylib2Cflags, "-include ")
1120
Jiyong Park85cc35a2022-07-17 11:30:47 +09001121 // Ensure that genstub is invoked with --systemapi
1122 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001123
1124 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1125 "lib64/mylib.so",
1126 "lib64/mylib3.so",
1127 "lib64/mylib4.so",
1128 })
1129}
1130
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001131func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1132 t.Parallel()
1133 // myapex (Z)
1134 // mylib -----------------.
1135 // |
1136 // otherapex (29) |
1137 // libstub's versions: 29 Z current
1138 // |
1139 // <platform> |
1140 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001141 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001142 apex {
1143 name: "myapex",
1144 key: "myapex.key",
1145 native_shared_libs: ["mylib"],
1146 min_sdk_version: "Z", // non-final
1147 }
1148
1149 cc_library {
1150 name: "mylib",
1151 srcs: ["mylib.cpp"],
1152 shared_libs: ["libstub"],
1153 apex_available: ["myapex"],
1154 min_sdk_version: "Z",
1155 }
1156
1157 apex_key {
1158 name: "myapex.key",
1159 public_key: "testkey.avbpubkey",
1160 private_key: "testkey.pem",
1161 }
1162
1163 apex {
1164 name: "otherapex",
1165 key: "myapex.key",
1166 native_shared_libs: ["libstub"],
1167 min_sdk_version: "29",
1168 }
1169
1170 cc_library {
1171 name: "libstub",
1172 srcs: ["mylib.cpp"],
1173 stubs: {
1174 versions: ["29", "Z", "current"],
1175 },
1176 apex_available: ["otherapex"],
1177 min_sdk_version: "29",
1178 }
1179
1180 // platform module depending on libstub from otherapex should use the latest stub("current")
1181 cc_library {
1182 name: "libplatform",
1183 srcs: ["mylib.cpp"],
1184 shared_libs: ["libstub"],
1185 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001186 `,
1187 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1188 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1189 variables.Platform_sdk_final = proptools.BoolPtr(false)
1190 variables.Platform_version_active_codenames = []string{"Z"}
1191 }),
1192 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001193
Jiyong Park55549df2021-02-26 23:57:23 +09001194 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001195 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001196 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001197 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001198 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001199
1200 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1201 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1202 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1203 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1204 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1205}
1206
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001207func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001208 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001209 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001210 name: "myapex2",
1211 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001212 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001213 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001214 }
1215
1216 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001217 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001218 public_key: "testkey.avbpubkey",
1219 private_key: "testkey.pem",
1220 }
1221
1222 cc_library {
1223 name: "mylib",
1224 srcs: ["mylib.cpp"],
1225 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001226 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001227 system_shared_libs: [],
1228 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001229 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001230 }
1231
1232 cc_library {
1233 name: "libfoo",
1234 srcs: ["mylib.cpp"],
1235 shared_libs: ["libbar"],
1236 system_shared_libs: [],
1237 stl: "none",
1238 stubs: {
1239 versions: ["10", "20", "30"],
1240 },
1241 }
1242
1243 cc_library {
1244 name: "libbar",
1245 srcs: ["mylib.cpp"],
1246 system_shared_libs: [],
1247 stl: "none",
1248 }
1249
Jiyong Park678c8812020-02-07 17:25:49 +09001250 cc_library_static {
1251 name: "libbaz",
1252 srcs: ["mylib.cpp"],
1253 system_shared_libs: [],
1254 stl: "none",
1255 apex_available: [ "myapex2" ],
1256 }
1257
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001258 `)
1259
Jiyong Park83dc74b2020-01-14 18:38:44 +09001260 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001261 copyCmds := apexRule.Args["copy_commands"]
1262
1263 // Ensure that direct non-stubs dep is always included
1264 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1265
1266 // Ensure that indirect stubs dep is not included
1267 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1268
1269 // Ensure that dependency of stubs is not included
1270 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1271
Colin Crossaede88c2020-08-11 12:17:01 -07001272 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001273
1274 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001275 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001276 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001277 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001278
Jiyong Park3ff16992019-12-27 14:11:47 +09001279 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001280
1281 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1282 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001283
Artur Satayeva8bd1132020-04-27 18:07:06 +01001284 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001285 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001286
Artur Satayeva8bd1132020-04-27 18:07:06 +01001287 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001288 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001289}
1290
Jooyung Hand3639552019-08-09 12:57:43 +09001291func TestApexWithRuntimeLibsDependency(t *testing.T) {
1292 /*
1293 myapex
1294 |
1295 v (runtime_libs)
1296 mylib ------+------> libfoo [provides stub]
1297 |
1298 `------> libbar
1299 */
Colin Cross1c460562021-02-16 17:55:47 -08001300 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001301 apex {
1302 name: "myapex",
1303 key: "myapex.key",
1304 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001305 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001306 }
1307
1308 apex_key {
1309 name: "myapex.key",
1310 public_key: "testkey.avbpubkey",
1311 private_key: "testkey.pem",
1312 }
1313
1314 cc_library {
1315 name: "mylib",
1316 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001317 static_libs: ["libstatic"],
1318 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001319 runtime_libs: ["libfoo", "libbar"],
1320 system_shared_libs: [],
1321 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001322 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001323 }
1324
1325 cc_library {
1326 name: "libfoo",
1327 srcs: ["mylib.cpp"],
1328 system_shared_libs: [],
1329 stl: "none",
1330 stubs: {
1331 versions: ["10", "20", "30"],
1332 },
1333 }
1334
1335 cc_library {
1336 name: "libbar",
1337 srcs: ["mylib.cpp"],
1338 system_shared_libs: [],
1339 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001340 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001341 }
1342
Liz Kammer5f108fa2023-05-11 14:33:17 -04001343 cc_library {
1344 name: "libstatic",
1345 srcs: ["mylib.cpp"],
1346 system_shared_libs: [],
1347 stl: "none",
1348 apex_available: [ "myapex" ],
1349 runtime_libs: ["libstatic_to_runtime"],
1350 }
1351
1352 cc_library {
1353 name: "libshared",
1354 srcs: ["mylib.cpp"],
1355 system_shared_libs: [],
1356 stl: "none",
1357 apex_available: [ "myapex" ],
1358 runtime_libs: ["libshared_to_runtime"],
1359 }
1360
1361 cc_library {
1362 name: "libstatic_to_runtime",
1363 srcs: ["mylib.cpp"],
1364 system_shared_libs: [],
1365 stl: "none",
1366 apex_available: [ "myapex" ],
1367 }
1368
1369 cc_library {
1370 name: "libshared_to_runtime",
1371 srcs: ["mylib.cpp"],
1372 system_shared_libs: [],
1373 stl: "none",
1374 apex_available: [ "myapex" ],
1375 }
Jooyung Hand3639552019-08-09 12:57:43 +09001376 `)
1377
Sundong Ahnabb64432019-10-22 13:58:29 +09001378 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001379 copyCmds := apexRule.Args["copy_commands"]
1380
1381 // Ensure that direct non-stubs dep is always included
1382 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1383
1384 // Ensure that indirect stubs dep is not included
1385 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1386
1387 // Ensure that runtime_libs dep in included
1388 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001389 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1390 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1391
1392 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001393
Sundong Ahnabb64432019-10-22 13:58:29 +09001394 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001395 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1396 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001397}
1398
Paul Duffina02cae32021-03-09 01:44:06 +00001399var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1400 cc.PrepareForTestWithCcBuildComponents,
1401 PrepareForTestWithApexBuildComponents,
1402 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001403 apex {
1404 name: "com.android.runtime",
1405 key: "com.android.runtime.key",
1406 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001407 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001408 }
1409
1410 apex_key {
1411 name: "com.android.runtime.key",
1412 public_key: "testkey.avbpubkey",
1413 private_key: "testkey.pem",
1414 }
Paul Duffina02cae32021-03-09 01:44:06 +00001415 `),
1416 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1417)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001418
Paul Duffina02cae32021-03-09 01:44:06 +00001419func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001420 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001421 cc_library {
1422 name: "libc",
1423 no_libcrt: true,
1424 nocrt: true,
1425 stl: "none",
1426 system_shared_libs: [],
1427 stubs: { versions: ["1"] },
1428 apex_available: ["com.android.runtime"],
1429
1430 sanitize: {
1431 hwaddress: true,
1432 }
1433 }
1434
1435 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001436 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001437 no_libcrt: true,
1438 nocrt: true,
1439 stl: "none",
1440 system_shared_libs: [],
1441 srcs: [""],
1442 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001443 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001444
1445 sanitize: {
1446 never: true,
1447 },
Spandan Das4de7b492023-05-05 21:13:01 +00001448 apex_available: [
1449 "//apex_available:anyapex",
1450 "//apex_available:platform",
1451 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001452 } `)
1453 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001454
1455 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1456 "lib64/bionic/libc.so",
1457 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1458 })
1459
Colin Cross4c4c1be2022-02-10 11:41:18 -08001460 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001461
1462 installed := hwasan.Description("install libclang_rt.hwasan")
1463 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1464
1465 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1466 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1467 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1468}
1469
1470func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001471 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001472 prepareForTestOfRuntimeApexWithHwasan,
1473 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1474 variables.SanitizeDevice = []string{"hwaddress"}
1475 }),
1476 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001477 cc_library {
1478 name: "libc",
1479 no_libcrt: true,
1480 nocrt: true,
1481 stl: "none",
1482 system_shared_libs: [],
1483 stubs: { versions: ["1"] },
1484 apex_available: ["com.android.runtime"],
1485 }
1486
1487 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001488 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001489 no_libcrt: true,
1490 nocrt: true,
1491 stl: "none",
1492 system_shared_libs: [],
1493 srcs: [""],
1494 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001495 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001496
1497 sanitize: {
1498 never: true,
1499 },
Spandan Das4de7b492023-05-05 21:13:01 +00001500 apex_available: [
1501 "//apex_available:anyapex",
1502 "//apex_available:platform",
1503 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001504 }
Paul Duffina02cae32021-03-09 01:44:06 +00001505 `)
1506 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001507
1508 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1509 "lib64/bionic/libc.so",
1510 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1511 })
1512
Colin Cross4c4c1be2022-02-10 11:41:18 -08001513 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001514
1515 installed := hwasan.Description("install libclang_rt.hwasan")
1516 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1517
1518 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1519 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1520 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1521}
1522
Jooyung Han61b66e92020-03-21 14:21:46 +00001523func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1524 testcases := []struct {
1525 name string
1526 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001527 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001528 shouldLink string
1529 shouldNotLink []string
1530 }{
1531 {
Jiyong Park55549df2021-02-26 23:57:23 +09001532 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001533 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001534 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001535 shouldLink: "current",
1536 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001537 },
1538 {
Jiyong Park55549df2021-02-26 23:57:23 +09001539 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001540 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001541 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001542 shouldLink: "current",
1543 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001544 },
1545 }
1546 for _, tc := range testcases {
1547 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001548 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001549 apex {
1550 name: "myapex",
1551 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001552 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001553 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001554 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001555 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001556
Jooyung Han61b66e92020-03-21 14:21:46 +00001557 apex_key {
1558 name: "myapex.key",
1559 public_key: "testkey.avbpubkey",
1560 private_key: "testkey.pem",
1561 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001562
Jooyung Han61b66e92020-03-21 14:21:46 +00001563 cc_library {
1564 name: "mylib",
1565 srcs: ["mylib.cpp"],
1566 vendor_available: true,
1567 shared_libs: ["libbar"],
1568 system_shared_libs: [],
1569 stl: "none",
1570 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001571 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001572 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001573
Jooyung Han61b66e92020-03-21 14:21:46 +00001574 cc_library {
1575 name: "libbar",
1576 srcs: ["mylib.cpp"],
1577 system_shared_libs: [],
1578 stl: "none",
1579 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001580 llndk: {
1581 symbol_file: "libbar.map.txt",
1582 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001583 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001584 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001585 withUnbundledBuild,
1586 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001587
Jooyung Han61b66e92020-03-21 14:21:46 +00001588 // Ensure that LLNDK dep is not included
1589 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1590 "lib64/mylib.so",
1591 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001592
Jooyung Han61b66e92020-03-21 14:21:46 +00001593 // Ensure that LLNDK dep is required
1594 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1595 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1596 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001597
Steven Moreland2c4000c2021-04-27 02:08:49 +00001598 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1599 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001600 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001601 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001602 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001603
Steven Moreland2c4000c2021-04-27 02:08:49 +00001604 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001605 ver := tc.shouldLink
1606 if tc.shouldLink == "current" {
1607 ver = strconv.Itoa(android.FutureApiLevelInt)
1608 }
1609 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001610 })
1611 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001612}
1613
Jiyong Park25fc6a92018-11-18 18:02:45 +09001614func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001615 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001616 apex {
1617 name: "myapex",
1618 key: "myapex.key",
1619 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001620 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001621 }
1622
1623 apex_key {
1624 name: "myapex.key",
1625 public_key: "testkey.avbpubkey",
1626 private_key: "testkey.pem",
1627 }
1628
1629 cc_library {
1630 name: "mylib",
1631 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001632 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001633 shared_libs: ["libdl#27"],
1634 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001635 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001636 }
1637
1638 cc_library_shared {
1639 name: "mylib_shared",
1640 srcs: ["mylib.cpp"],
1641 shared_libs: ["libdl#27"],
1642 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001643 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001644 }
1645
1646 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001647 name: "libBootstrap",
1648 srcs: ["mylib.cpp"],
1649 stl: "none",
1650 bootstrap: true,
1651 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001652 `)
1653
Sundong Ahnabb64432019-10-22 13:58:29 +09001654 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001655 copyCmds := apexRule.Args["copy_commands"]
1656
1657 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001658 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001659 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1660 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001661
1662 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001663 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001664
Colin Crossaede88c2020-08-11 12:17:01 -07001665 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1666 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1667 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001668
1669 // For dependency to libc
1670 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001671 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001672 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001673 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001674 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001675 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1676 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001677
1678 // For dependency to libm
1679 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001680 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001681 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001682 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001683 // ... and is not compiling with the stub
1684 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1685 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1686
1687 // For dependency to libdl
1688 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001689 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001690 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001691 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1692 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001693 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001694 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001695 // ... Cflags from stub is correctly exported to mylib
1696 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1697 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001698
1699 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001700 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1701 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1702 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1703 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001704}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001705
Jooyung Han749dc692020-04-15 11:03:39 +09001706func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001707 // there are three links between liba --> libz.
1708 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001709 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001710 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001711 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001712 apex {
1713 name: "myapex",
1714 key: "myapex.key",
1715 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001716 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001717 }
1718
1719 apex {
1720 name: "otherapex",
1721 key: "myapex.key",
1722 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001723 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001724 }
1725
1726 apex_key {
1727 name: "myapex.key",
1728 public_key: "testkey.avbpubkey",
1729 private_key: "testkey.pem",
1730 }
1731
1732 cc_library {
1733 name: "libx",
1734 shared_libs: ["liba"],
1735 system_shared_libs: [],
1736 stl: "none",
1737 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001738 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001739 }
1740
1741 cc_library {
1742 name: "liby",
1743 shared_libs: ["liba"],
1744 system_shared_libs: [],
1745 stl: "none",
1746 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001747 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001748 }
1749
1750 cc_library {
1751 name: "liba",
1752 shared_libs: ["libz"],
1753 system_shared_libs: [],
1754 stl: "none",
1755 apex_available: [
1756 "//apex_available:anyapex",
1757 "//apex_available:platform",
1758 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001759 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001760 }
1761
1762 cc_library {
1763 name: "libz",
1764 system_shared_libs: [],
1765 stl: "none",
1766 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001767 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001768 },
1769 }
Jooyung Han749dc692020-04-15 11:03:39 +09001770 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001771
1772 expectLink := func(from, from_variant, to, to_variant string) {
1773 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1774 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1775 }
1776 expectNoLink := func(from, from_variant, to, to_variant string) {
1777 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1778 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1779 }
1780 // platform liba is linked to non-stub version
1781 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001782 // liba in myapex is linked to current
1783 expectLink("liba", "shared_apex29", "libz", "shared_current")
1784 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001785 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001786 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001787 // liba in otherapex is linked to current
1788 expectLink("liba", "shared_apex30", "libz", "shared_current")
1789 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001790 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1791 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001792}
1793
Jooyung Hanaed150d2020-04-02 01:41:41 +09001794func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001795 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001796 apex {
1797 name: "myapex",
1798 key: "myapex.key",
1799 native_shared_libs: ["libx"],
1800 min_sdk_version: "R",
1801 }
1802
1803 apex_key {
1804 name: "myapex.key",
1805 public_key: "testkey.avbpubkey",
1806 private_key: "testkey.pem",
1807 }
1808
1809 cc_library {
1810 name: "libx",
1811 shared_libs: ["libz"],
1812 system_shared_libs: [],
1813 stl: "none",
1814 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001815 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001816 }
1817
1818 cc_library {
1819 name: "libz",
1820 system_shared_libs: [],
1821 stl: "none",
1822 stubs: {
1823 versions: ["29", "R"],
1824 },
1825 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001826 `,
1827 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1828 variables.Platform_version_active_codenames = []string{"R"}
1829 }),
1830 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001831
1832 expectLink := func(from, from_variant, to, to_variant string) {
1833 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1834 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1835 }
1836 expectNoLink := func(from, from_variant, to, to_variant string) {
1837 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1838 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1839 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001840 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1841 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001842 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1843 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001844}
1845
Jooyung Han4c4da062021-06-23 10:23:16 +09001846func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1847 testApex(t, `
1848 apex {
1849 name: "myapex",
1850 key: "myapex.key",
1851 java_libs: ["libx"],
1852 min_sdk_version: "S",
1853 }
1854
1855 apex_key {
1856 name: "myapex.key",
1857 public_key: "testkey.avbpubkey",
1858 private_key: "testkey.pem",
1859 }
1860
1861 java_library {
1862 name: "libx",
1863 srcs: ["a.java"],
1864 apex_available: [ "myapex" ],
1865 sdk_version: "current",
1866 min_sdk_version: "S", // should be okay
1867 }
1868 `,
1869 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1870 variables.Platform_version_active_codenames = []string{"S"}
1871 variables.Platform_sdk_codename = proptools.StringPtr("S")
1872 }),
1873 )
1874}
1875
Jooyung Han749dc692020-04-15 11:03:39 +09001876func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001877 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001878 apex {
1879 name: "myapex",
1880 key: "myapex.key",
1881 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001882 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001883 }
1884
1885 apex_key {
1886 name: "myapex.key",
1887 public_key: "testkey.avbpubkey",
1888 private_key: "testkey.pem",
1889 }
1890
1891 cc_library {
1892 name: "libx",
1893 shared_libs: ["libz"],
1894 system_shared_libs: [],
1895 stl: "none",
1896 apex_available: [ "myapex" ],
1897 }
1898
1899 cc_library {
1900 name: "libz",
1901 system_shared_libs: [],
1902 stl: "none",
1903 stubs: {
1904 versions: ["1", "2"],
1905 },
1906 }
1907 `)
1908
1909 expectLink := func(from, from_variant, to, to_variant string) {
1910 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1911 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1912 }
1913 expectNoLink := func(from, from_variant, to, to_variant string) {
1914 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1915 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1916 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001917 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001918 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001919 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001920 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001921}
1922
Jooyung Handfc864c2023-03-20 18:19:07 +09001923func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001924 ctx := testApex(t, `
1925 apex {
1926 name: "myapex",
1927 key: "myapex.key",
1928 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001929 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001930 vendor: true,
1931 min_sdk_version: "29",
1932 }
1933
1934 apex_key {
1935 name: "myapex.key",
1936 public_key: "testkey.avbpubkey",
1937 private_key: "testkey.pem",
1938 }
1939
1940 cc_library {
1941 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001942 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001943 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001944 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001945 shared_libs: ["libbar"],
1946 }
1947
1948 cc_library {
1949 name: "libbar",
1950 stubs: { versions: ["29", "30"] },
1951 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09001952 }
1953 `)
1954
1955 vendorVariant := "android_vendor.29_arm64_armv8-a"
1956
Jooyung Handfc864c2023-03-20 18:19:07 +09001957 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
1958
1959 // Ensure that mylib links with "current" LLNDK
1960 libFlags := names(mylib.Rule("ld").Args["libFlags"])
1961 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
1962
1963 // Ensure that mylib is targeting 29
1964 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
1965 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
1966
1967 // Ensure that the correct variant of crtbegin_so is used.
1968 crtBegin := mylib.Rule("ld").Args["crtBegin"]
1969 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09001970
1971 // Ensure that the crtbegin_so used by the APEX is targeting 29
1972 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1973 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1974}
1975
Jooyung Han4495f842023-04-25 16:39:59 +09001976func TestTrackAllowedDeps(t *testing.T) {
1977 ctx := testApex(t, `
1978 apex {
1979 name: "myapex",
1980 key: "myapex.key",
1981 updatable: true,
1982 native_shared_libs: [
1983 "mylib",
1984 "yourlib",
1985 ],
1986 min_sdk_version: "29",
1987 }
1988
1989 apex {
1990 name: "myapex2",
1991 key: "myapex.key",
1992 updatable: false,
1993 native_shared_libs: ["yourlib"],
1994 }
1995
1996 apex_key {
1997 name: "myapex.key",
1998 public_key: "testkey.avbpubkey",
1999 private_key: "testkey.pem",
2000 }
2001
2002 cc_library {
2003 name: "mylib",
2004 srcs: ["mylib.cpp"],
2005 shared_libs: ["libbar"],
2006 min_sdk_version: "29",
2007 apex_available: ["myapex"],
2008 }
2009
2010 cc_library {
2011 name: "libbar",
2012 stubs: { versions: ["29", "30"] },
2013 }
2014
2015 cc_library {
2016 name: "yourlib",
2017 srcs: ["mylib.cpp"],
2018 min_sdk_version: "29",
2019 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2020 }
2021 `, withFiles(android.MockFS{
2022 "packages/modules/common/build/allowed_deps.txt": nil,
2023 }))
2024
2025 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2026 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2027 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2028 "out/soong/.intermediates/myapex/android_common_myapex_image/depsinfo/flatlist.txt")
2029 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2030 "out/soong/.intermediates/myapex2/android_common_myapex2_image/depsinfo/flatlist.txt")
2031
2032 myapex := ctx.ModuleForTests("myapex", "android_common_myapex_image")
2033 flatlist := strings.Split(myapex.Output("depsinfo/flatlist.txt").BuildParams.Args["content"], "\\n")
2034 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2035 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2036 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2037 flatlist, "mylib:(minSdkVersion:29)")
2038 android.AssertStringListContains(t, "track platform-available lib",
2039 flatlist, "yourlib(minSdkVersion:29)")
2040}
2041
2042func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2043 ctx := testApex(t, `
2044 apex {
2045 name: "myapex",
2046 key: "myapex.key",
2047 updatable: true,
2048 min_sdk_version: "29",
2049 }
2050
2051 apex_key {
2052 name: "myapex.key",
2053 public_key: "testkey.avbpubkey",
2054 private_key: "testkey.pem",
2055 }
2056 `)
2057 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2058 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2059 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2060 }
2061}
2062
Jooyung Han03b51852020-02-26 22:45:42 +09002063func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002064 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002065 apex {
2066 name: "myapex",
2067 key: "myapex.key",
2068 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002069 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002070 }
2071
2072 apex_key {
2073 name: "myapex.key",
2074 public_key: "testkey.avbpubkey",
2075 private_key: "testkey.pem",
2076 }
2077
2078 cc_library {
2079 name: "libx",
2080 system_shared_libs: [],
2081 stl: "none",
2082 apex_available: [ "myapex" ],
2083 stubs: {
2084 versions: ["1", "2"],
2085 },
2086 }
2087
2088 cc_library {
2089 name: "libz",
2090 shared_libs: ["libx"],
2091 system_shared_libs: [],
2092 stl: "none",
2093 }
2094 `)
2095
2096 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002097 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002098 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2099 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2100 }
2101 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002102 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002103 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2104 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2105 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002106 expectLink("libz", "shared", "libx", "shared_current")
2107 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002108 expectNoLink("libz", "shared", "libz", "shared_1")
2109 expectNoLink("libz", "shared", "libz", "shared")
2110}
2111
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002112var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2113 func(variables android.FixtureProductVariables) {
2114 variables.SanitizeDevice = []string{"hwaddress"}
2115 },
2116)
2117
Jooyung Han75568392020-03-20 04:29:24 +09002118func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002119 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002120 apex {
2121 name: "myapex",
2122 key: "myapex.key",
2123 native_shared_libs: ["libx"],
2124 min_sdk_version: "29",
2125 }
2126
2127 apex_key {
2128 name: "myapex.key",
2129 public_key: "testkey.avbpubkey",
2130 private_key: "testkey.pem",
2131 }
2132
2133 cc_library {
2134 name: "libx",
2135 shared_libs: ["libbar"],
2136 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002137 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002138 }
2139
2140 cc_library {
2141 name: "libbar",
2142 stubs: {
2143 versions: ["29", "30"],
2144 },
2145 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002146 `,
2147 prepareForTestWithSantitizeHwaddress,
2148 )
Jooyung Han03b51852020-02-26 22:45:42 +09002149 expectLink := func(from, from_variant, to, to_variant string) {
2150 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2151 libFlags := ld.Args["libFlags"]
2152 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2153 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002154 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002155}
2156
Jooyung Han75568392020-03-20 04:29:24 +09002157func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002158 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002159 apex {
2160 name: "myapex",
2161 key: "myapex.key",
2162 native_shared_libs: ["libx"],
2163 min_sdk_version: "29",
2164 }
2165
2166 apex_key {
2167 name: "myapex.key",
2168 public_key: "testkey.avbpubkey",
2169 private_key: "testkey.pem",
2170 }
2171
2172 cc_library {
2173 name: "libx",
2174 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002175 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002176 }
Jooyung Han75568392020-03-20 04:29:24 +09002177 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002178
2179 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002180 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002181 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002182 // note that platform variant is not.
2183 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002184 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002185}
2186
Jooyung Han749dc692020-04-15 11:03:39 +09002187func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2188 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002189 apex {
2190 name: "myapex",
2191 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002192 native_shared_libs: ["mylib"],
2193 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002194 }
2195
2196 apex_key {
2197 name: "myapex.key",
2198 public_key: "testkey.avbpubkey",
2199 private_key: "testkey.pem",
2200 }
Jooyung Han749dc692020-04-15 11:03:39 +09002201
2202 cc_library {
2203 name: "mylib",
2204 srcs: ["mylib.cpp"],
2205 system_shared_libs: [],
2206 stl: "none",
2207 apex_available: [
2208 "myapex",
2209 ],
2210 min_sdk_version: "30",
2211 }
2212 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002213
2214 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2215 apex {
2216 name: "myapex",
2217 key: "myapex.key",
2218 native_shared_libs: ["libfoo.ffi"],
2219 min_sdk_version: "29",
2220 }
2221
2222 apex_key {
2223 name: "myapex.key",
2224 public_key: "testkey.avbpubkey",
2225 private_key: "testkey.pem",
2226 }
2227
2228 rust_ffi_shared {
2229 name: "libfoo.ffi",
2230 srcs: ["foo.rs"],
2231 crate_name: "foo",
2232 apex_available: [
2233 "myapex",
2234 ],
2235 min_sdk_version: "30",
2236 }
2237 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002238
2239 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2240 apex {
2241 name: "myapex",
2242 key: "myapex.key",
2243 java_libs: ["libfoo"],
2244 min_sdk_version: "29",
2245 }
2246
2247 apex_key {
2248 name: "myapex.key",
2249 public_key: "testkey.avbpubkey",
2250 private_key: "testkey.pem",
2251 }
2252
2253 java_import {
2254 name: "libfoo",
2255 jars: ["libfoo.jar"],
2256 apex_available: [
2257 "myapex",
2258 ],
2259 min_sdk_version: "30",
2260 }
2261 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002262
2263 // Skip check for modules compiling against core API surface
2264 testApex(t, `
2265 apex {
2266 name: "myapex",
2267 key: "myapex.key",
2268 java_libs: ["libfoo"],
2269 min_sdk_version: "29",
2270 }
2271
2272 apex_key {
2273 name: "myapex.key",
2274 public_key: "testkey.avbpubkey",
2275 private_key: "testkey.pem",
2276 }
2277
2278 java_library {
2279 name: "libfoo",
2280 srcs: ["Foo.java"],
2281 apex_available: [
2282 "myapex",
2283 ],
2284 // Compile against core API surface
2285 sdk_version: "core_current",
2286 min_sdk_version: "30",
2287 }
2288 `)
2289
Jooyung Han749dc692020-04-15 11:03:39 +09002290}
2291
2292func TestApexMinSdkVersion_Okay(t *testing.T) {
2293 testApex(t, `
2294 apex {
2295 name: "myapex",
2296 key: "myapex.key",
2297 native_shared_libs: ["libfoo"],
2298 java_libs: ["libbar"],
2299 min_sdk_version: "29",
2300 }
2301
2302 apex_key {
2303 name: "myapex.key",
2304 public_key: "testkey.avbpubkey",
2305 private_key: "testkey.pem",
2306 }
2307
2308 cc_library {
2309 name: "libfoo",
2310 srcs: ["mylib.cpp"],
2311 shared_libs: ["libfoo_dep"],
2312 apex_available: ["myapex"],
2313 min_sdk_version: "29",
2314 }
2315
2316 cc_library {
2317 name: "libfoo_dep",
2318 srcs: ["mylib.cpp"],
2319 apex_available: ["myapex"],
2320 min_sdk_version: "29",
2321 }
2322
2323 java_library {
2324 name: "libbar",
2325 sdk_version: "current",
2326 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002327 static_libs: [
2328 "libbar_dep",
2329 "libbar_import_dep",
2330 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002331 apex_available: ["myapex"],
2332 min_sdk_version: "29",
2333 }
2334
2335 java_library {
2336 name: "libbar_dep",
2337 sdk_version: "current",
2338 srcs: ["a.java"],
2339 apex_available: ["myapex"],
2340 min_sdk_version: "29",
2341 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002342
2343 java_import {
2344 name: "libbar_import_dep",
2345 jars: ["libbar.jar"],
2346 apex_available: ["myapex"],
2347 min_sdk_version: "29",
2348 }
Jooyung Han03b51852020-02-26 22:45:42 +09002349 `)
2350}
2351
Colin Cross8ca61c12022-10-06 21:00:14 -07002352func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2353 // Tests that an apex dependency with min_sdk_version higher than the
2354 // min_sdk_version of the apex is allowed as long as the dependency's
2355 // min_sdk_version is less than or equal to the api level that the
2356 // architecture was introduced in. In this case, arm64 didn't exist
2357 // until api level 21, so the arm64 code will never need to run on
2358 // an api level 20 device, even if other architectures of the apex
2359 // will.
2360 testApex(t, `
2361 apex {
2362 name: "myapex",
2363 key: "myapex.key",
2364 native_shared_libs: ["libfoo"],
2365 min_sdk_version: "20",
2366 }
2367
2368 apex_key {
2369 name: "myapex.key",
2370 public_key: "testkey.avbpubkey",
2371 private_key: "testkey.pem",
2372 }
2373
2374 cc_library {
2375 name: "libfoo",
2376 srcs: ["mylib.cpp"],
2377 apex_available: ["myapex"],
2378 min_sdk_version: "21",
2379 stl: "none",
2380 }
2381 `)
2382}
2383
Artur Satayev8cf899a2020-04-15 17:29:42 +01002384func TestJavaStableSdkVersion(t *testing.T) {
2385 testCases := []struct {
2386 name string
2387 expectedError string
2388 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002389 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002390 }{
2391 {
2392 name: "Non-updatable apex with non-stable dep",
2393 bp: `
2394 apex {
2395 name: "myapex",
2396 java_libs: ["myjar"],
2397 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002398 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002399 }
2400 apex_key {
2401 name: "myapex.key",
2402 public_key: "testkey.avbpubkey",
2403 private_key: "testkey.pem",
2404 }
2405 java_library {
2406 name: "myjar",
2407 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002408 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002409 apex_available: ["myapex"],
2410 }
2411 `,
2412 },
2413 {
2414 name: "Updatable apex with stable dep",
2415 bp: `
2416 apex {
2417 name: "myapex",
2418 java_libs: ["myjar"],
2419 key: "myapex.key",
2420 updatable: true,
2421 min_sdk_version: "29",
2422 }
2423 apex_key {
2424 name: "myapex.key",
2425 public_key: "testkey.avbpubkey",
2426 private_key: "testkey.pem",
2427 }
2428 java_library {
2429 name: "myjar",
2430 srcs: ["foo/bar/MyClass.java"],
2431 sdk_version: "current",
2432 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002433 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002434 }
2435 `,
2436 },
2437 {
2438 name: "Updatable apex with non-stable dep",
2439 expectedError: "cannot depend on \"myjar\"",
2440 bp: `
2441 apex {
2442 name: "myapex",
2443 java_libs: ["myjar"],
2444 key: "myapex.key",
2445 updatable: true,
2446 }
2447 apex_key {
2448 name: "myapex.key",
2449 public_key: "testkey.avbpubkey",
2450 private_key: "testkey.pem",
2451 }
2452 java_library {
2453 name: "myjar",
2454 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002455 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002456 apex_available: ["myapex"],
2457 }
2458 `,
2459 },
2460 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002461 name: "Updatable apex with non-stable legacy core platform dep",
2462 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2463 bp: `
2464 apex {
2465 name: "myapex",
2466 java_libs: ["myjar-uses-legacy"],
2467 key: "myapex.key",
2468 updatable: true,
2469 }
2470 apex_key {
2471 name: "myapex.key",
2472 public_key: "testkey.avbpubkey",
2473 private_key: "testkey.pem",
2474 }
2475 java_library {
2476 name: "myjar-uses-legacy",
2477 srcs: ["foo/bar/MyClass.java"],
2478 sdk_version: "core_platform",
2479 apex_available: ["myapex"],
2480 }
2481 `,
2482 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2483 },
2484 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002485 name: "Updatable apex with non-stable transitive dep",
2486 // This is not actually detecting that the transitive dependency is unstable, rather it is
2487 // detecting that the transitive dependency is building against a wider API surface than the
2488 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002489 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002490 bp: `
2491 apex {
2492 name: "myapex",
2493 java_libs: ["myjar"],
2494 key: "myapex.key",
2495 updatable: true,
2496 }
2497 apex_key {
2498 name: "myapex.key",
2499 public_key: "testkey.avbpubkey",
2500 private_key: "testkey.pem",
2501 }
2502 java_library {
2503 name: "myjar",
2504 srcs: ["foo/bar/MyClass.java"],
2505 sdk_version: "current",
2506 apex_available: ["myapex"],
2507 static_libs: ["transitive-jar"],
2508 }
2509 java_library {
2510 name: "transitive-jar",
2511 srcs: ["foo/bar/MyClass.java"],
2512 sdk_version: "core_platform",
2513 apex_available: ["myapex"],
2514 }
2515 `,
2516 },
2517 }
2518
2519 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002520 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2521 continue
2522 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002523 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002524 errorHandler := android.FixtureExpectsNoErrors
2525 if test.expectedError != "" {
2526 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002527 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002528 android.GroupFixturePreparers(
2529 java.PrepareForTestWithJavaDefaultModules,
2530 PrepareForTestWithApexBuildComponents,
2531 prepareForTestWithMyapex,
2532 android.OptionalFixturePreparer(test.preparer),
2533 ).
2534 ExtendWithErrorHandler(errorHandler).
2535 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002536 })
2537 }
2538}
2539
Jooyung Han749dc692020-04-15 11:03:39 +09002540func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2541 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2542 apex {
2543 name: "myapex",
2544 key: "myapex.key",
2545 native_shared_libs: ["mylib"],
2546 min_sdk_version: "29",
2547 }
2548
2549 apex_key {
2550 name: "myapex.key",
2551 public_key: "testkey.avbpubkey",
2552 private_key: "testkey.pem",
2553 }
2554
2555 cc_library {
2556 name: "mylib",
2557 srcs: ["mylib.cpp"],
2558 shared_libs: ["mylib2"],
2559 system_shared_libs: [],
2560 stl: "none",
2561 apex_available: [
2562 "myapex",
2563 ],
2564 min_sdk_version: "29",
2565 }
2566
2567 // indirect part of the apex
2568 cc_library {
2569 name: "mylib2",
2570 srcs: ["mylib.cpp"],
2571 system_shared_libs: [],
2572 stl: "none",
2573 apex_available: [
2574 "myapex",
2575 ],
2576 min_sdk_version: "30",
2577 }
2578 `)
2579}
2580
2581func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2582 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2583 apex {
2584 name: "myapex",
2585 key: "myapex.key",
2586 apps: ["AppFoo"],
2587 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002588 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002589 }
2590
2591 apex_key {
2592 name: "myapex.key",
2593 public_key: "testkey.avbpubkey",
2594 private_key: "testkey.pem",
2595 }
2596
2597 android_app {
2598 name: "AppFoo",
2599 srcs: ["foo/bar/MyClass.java"],
2600 sdk_version: "current",
2601 min_sdk_version: "29",
2602 system_modules: "none",
2603 stl: "none",
2604 static_libs: ["bar"],
2605 apex_available: [ "myapex" ],
2606 }
2607
2608 java_library {
2609 name: "bar",
2610 sdk_version: "current",
2611 srcs: ["a.java"],
2612 apex_available: [ "myapex" ],
2613 }
2614 `)
2615}
2616
2617func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002618 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002619 apex {
2620 name: "myapex",
2621 key: "myapex.key",
2622 native_shared_libs: ["mylib"],
2623 min_sdk_version: "29",
2624 }
2625
2626 apex_key {
2627 name: "myapex.key",
2628 public_key: "testkey.avbpubkey",
2629 private_key: "testkey.pem",
2630 }
2631
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002632 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002633 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2634 cc_library {
2635 name: "mylib",
2636 srcs: ["mylib.cpp"],
2637 shared_libs: ["mylib2"],
2638 system_shared_libs: [],
2639 stl: "none",
2640 apex_available: ["myapex", "otherapex"],
2641 min_sdk_version: "29",
2642 }
2643
2644 cc_library {
2645 name: "mylib2",
2646 srcs: ["mylib.cpp"],
2647 system_shared_libs: [],
2648 stl: "none",
2649 apex_available: ["otherapex"],
2650 stubs: { versions: ["29", "30"] },
2651 min_sdk_version: "30",
2652 }
2653
2654 apex {
2655 name: "otherapex",
2656 key: "myapex.key",
2657 native_shared_libs: ["mylib", "mylib2"],
2658 min_sdk_version: "30",
2659 }
2660 `)
2661 expectLink := func(from, from_variant, to, to_variant string) {
2662 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2663 libFlags := ld.Args["libFlags"]
2664 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2665 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002666 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002667 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002668}
2669
Jooyung Haned124c32021-01-26 11:43:46 +09002670func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002671 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2672 func(variables android.FixtureProductVariables) {
2673 variables.Platform_sdk_codename = proptools.StringPtr("S")
2674 variables.Platform_version_active_codenames = []string{"S"}
2675 },
2676 )
Jooyung Haned124c32021-01-26 11:43:46 +09002677 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2678 apex {
2679 name: "myapex",
2680 key: "myapex.key",
2681 native_shared_libs: ["libfoo"],
2682 min_sdk_version: "S",
2683 }
2684 apex_key {
2685 name: "myapex.key",
2686 public_key: "testkey.avbpubkey",
2687 private_key: "testkey.pem",
2688 }
2689 cc_library {
2690 name: "libfoo",
2691 shared_libs: ["libbar"],
2692 apex_available: ["myapex"],
2693 min_sdk_version: "29",
2694 }
2695 cc_library {
2696 name: "libbar",
2697 apex_available: ["myapex"],
2698 }
2699 `, withSAsActiveCodeNames)
2700}
2701
2702func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002703 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2704 variables.Platform_sdk_codename = proptools.StringPtr("S")
2705 variables.Platform_version_active_codenames = []string{"S", "T"}
2706 })
Colin Cross1c460562021-02-16 17:55:47 -08002707 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002708 apex {
2709 name: "myapex",
2710 key: "myapex.key",
2711 native_shared_libs: ["libfoo"],
2712 min_sdk_version: "S",
2713 }
2714 apex_key {
2715 name: "myapex.key",
2716 public_key: "testkey.avbpubkey",
2717 private_key: "testkey.pem",
2718 }
2719 cc_library {
2720 name: "libfoo",
2721 shared_libs: ["libbar"],
2722 apex_available: ["myapex"],
2723 min_sdk_version: "S",
2724 }
2725 cc_library {
2726 name: "libbar",
2727 stubs: {
2728 symbol_file: "libbar.map.txt",
2729 versions: ["30", "S", "T"],
2730 },
2731 }
2732 `, withSAsActiveCodeNames)
2733
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002734 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002735 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2736 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002737 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002738}
2739
Jiyong Park7c2ee712018-12-07 00:42:25 +09002740func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002741 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002742 apex {
2743 name: "myapex",
2744 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002745 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002746 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002747 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002748 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002749 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002750 }
2751
2752 apex_key {
2753 name: "myapex.key",
2754 public_key: "testkey.avbpubkey",
2755 private_key: "testkey.pem",
2756 }
2757
2758 prebuilt_etc {
2759 name: "myetc",
2760 src: "myprebuilt",
2761 sub_dir: "foo/bar",
2762 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002763
2764 cc_library {
2765 name: "mylib",
2766 srcs: ["mylib.cpp"],
2767 relative_install_path: "foo/bar",
2768 system_shared_libs: [],
2769 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002770 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002771 }
2772
2773 cc_binary {
2774 name: "mybin",
2775 srcs: ["mylib.cpp"],
2776 relative_install_path: "foo/bar",
2777 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002778 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002779 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002780 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002781
2782 rust_binary {
2783 name: "mybin.rust",
2784 srcs: ["foo.rs"],
2785 relative_install_path: "rust_subdir",
2786 apex_available: [ "myapex" ],
2787 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002788 `)
2789
Sundong Ahnabb64432019-10-22 13:58:29 +09002790 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002791 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002792
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002793 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002794 ensureContains(t, cmd, "/etc ")
2795 ensureContains(t, cmd, "/etc/foo ")
2796 ensureContains(t, cmd, "/etc/foo/bar ")
2797 ensureContains(t, cmd, "/lib64 ")
2798 ensureContains(t, cmd, "/lib64/foo ")
2799 ensureContains(t, cmd, "/lib64/foo/bar ")
2800 ensureContains(t, cmd, "/lib ")
2801 ensureContains(t, cmd, "/lib/foo ")
2802 ensureContains(t, cmd, "/lib/foo/bar ")
2803 ensureContains(t, cmd, "/bin ")
2804 ensureContains(t, cmd, "/bin/foo ")
2805 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002806 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002807}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002808
Jooyung Han35155c42020-02-06 17:33:20 +09002809func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002810 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002811 apex {
2812 name: "myapex",
2813 key: "myapex.key",
2814 multilib: {
2815 both: {
2816 native_shared_libs: ["mylib"],
2817 binaries: ["mybin"],
2818 },
2819 },
2820 compile_multilib: "both",
2821 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002822 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002823 }
2824
2825 apex_key {
2826 name: "myapex.key",
2827 public_key: "testkey.avbpubkey",
2828 private_key: "testkey.pem",
2829 }
2830
2831 cc_library {
2832 name: "mylib",
2833 relative_install_path: "foo/bar",
2834 system_shared_libs: [],
2835 stl: "none",
2836 apex_available: [ "myapex" ],
2837 native_bridge_supported: true,
2838 }
2839
2840 cc_binary {
2841 name: "mybin",
2842 relative_install_path: "foo/bar",
2843 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002844 stl: "none",
2845 apex_available: [ "myapex" ],
2846 native_bridge_supported: true,
2847 compile_multilib: "both", // default is "first" for binary
2848 multilib: {
2849 lib64: {
2850 suffix: "64",
2851 },
2852 },
2853 }
2854 `, withNativeBridgeEnabled)
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 }
Kiyoung Kim8269cee2023-07-26 12:39:19 +09002989 `,
2990 android.FixtureModifyConfig(func(config android.Config) {
2991 config.TestProductVariables.KeepVndk = proptools.BoolPtr(true)
2992 }),
2993 )
Jooyung Handf78e212020-07-22 15:54:47 +09002994
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002995 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002996
Jooyung Han91f92032022-02-04 12:36:33 +09002997 for _, tc := range []struct {
2998 name string
2999 apexName string
3000 moduleName string
3001 moduleVariant string
3002 libs []string
3003 contents []string
3004 requireVndkNamespace bool
3005 }{
3006 {
3007 name: "use_vndk_as_stable",
3008 apexName: "myapex",
3009 moduleName: "mybin",
3010 moduleVariant: vendorVariant + "_apex10000",
3011 libs: []string{
3012 // should link with vendor variants of VNDK libs(libvndk/libc++)
3013 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3014 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3015 // unstable Vendor libs as APEX variant
3016 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3017 },
3018 contents: []string{
3019 "bin/mybin",
3020 "lib64/libvendor.so",
3021 // VNDK libs (libvndk/libc++) are not included
3022 },
3023 requireVndkNamespace: true,
3024 },
3025 {
3026 name: "!use_vndk_as_stable",
3027 apexName: "myapex2",
3028 moduleName: "mybin2",
3029 moduleVariant: vendorVariant + "_myapex2",
3030 libs: []string{
3031 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3032 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3033 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3034 // unstable vendor libs have "merged" APEX variants
3035 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3036 },
3037 contents: []string{
3038 "bin/mybin2",
3039 "lib64/libvendor.so",
3040 // VNDK libs are included as well
3041 "lib64/libvndk.so",
3042 "lib64/libc++.so",
3043 },
3044 requireVndkNamespace: false,
3045 },
3046 } {
3047 t.Run(tc.name, func(t *testing.T) {
3048 // Check linked libs
3049 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3050 libs := names(ldRule.Args["libFlags"])
3051 for _, lib := range tc.libs {
3052 ensureListContains(t, libs, lib)
3053 }
3054 // Check apex contents
3055 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003056
Jooyung Han91f92032022-02-04 12:36:33 +09003057 // Check "requireNativeLibs"
3058 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
3059 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3060 if tc.requireVndkNamespace {
3061 ensureListContains(t, requireNativeLibs, ":vndk")
3062 } else {
3063 ensureListNotContains(t, requireNativeLibs, ":vndk")
3064 }
3065 })
3066 }
Jooyung Handf78e212020-07-22 15:54:47 +09003067}
3068
Justin Yun13decfb2021-03-08 19:25:55 +09003069func TestProductVariant(t *testing.T) {
3070 ctx := testApex(t, `
3071 apex {
3072 name: "myapex",
3073 key: "myapex.key",
3074 updatable: false,
3075 product_specific: true,
3076 binaries: ["foo"],
3077 }
3078
3079 apex_key {
3080 name: "myapex.key",
3081 public_key: "testkey.avbpubkey",
3082 private_key: "testkey.pem",
3083 }
3084
3085 cc_binary {
3086 name: "foo",
3087 product_available: true,
3088 apex_available: ["myapex"],
3089 srcs: ["foo.cpp"],
3090 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003091 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3092 variables.ProductVndkVersion = proptools.StringPtr("current")
3093 }),
3094 )
Justin Yun13decfb2021-03-08 19:25:55 +09003095
3096 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003097 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003098 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3099 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3100 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3101 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3102}
3103
Jooyung Han8e5685d2020-09-21 11:02:57 +09003104func TestApex_withPrebuiltFirmware(t *testing.T) {
3105 testCases := []struct {
3106 name string
3107 additionalProp string
3108 }{
3109 {"system apex with prebuilt_firmware", ""},
3110 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3111 }
3112 for _, tc := range testCases {
3113 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003114 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003115 apex {
3116 name: "myapex",
3117 key: "myapex.key",
3118 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003119 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003120 `+tc.additionalProp+`
3121 }
3122 apex_key {
3123 name: "myapex.key",
3124 public_key: "testkey.avbpubkey",
3125 private_key: "testkey.pem",
3126 }
3127 prebuilt_firmware {
3128 name: "myfirmware",
3129 src: "myfirmware.bin",
3130 filename_from_src: true,
3131 `+tc.additionalProp+`
3132 }
3133 `)
3134 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3135 "etc/firmware/myfirmware.bin",
3136 })
3137 })
3138 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003139}
3140
Jooyung Hanefb184e2020-06-25 17:14:25 +09003141func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003142 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003143 apex {
3144 name: "myapex",
3145 key: "myapex.key",
3146 vendor: true,
3147 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003148 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003149 }
3150
3151 apex_key {
3152 name: "myapex.key",
3153 public_key: "testkey.avbpubkey",
3154 private_key: "testkey.pem",
3155 }
3156
3157 cc_library {
3158 name: "mylib",
3159 vendor_available: true,
3160 }
3161 `)
3162
3163 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003164 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003165 name := apexBundle.BaseModuleName()
3166 prefix := "TARGET_"
3167 var builder strings.Builder
3168 data.Custom(&builder, name, prefix, "", data)
3169 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003170 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003171}
3172
Jooyung Han2ed99d02020-06-24 23:26:26 +09003173func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003174 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003175 apex {
3176 name: "myapex",
3177 key: "myapex.key",
3178 vintf_fragments: ["fragment.xml"],
3179 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003180 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003181 }
3182 apex_key {
3183 name: "myapex.key",
3184 public_key: "testkey.avbpubkey",
3185 private_key: "testkey.pem",
3186 }
3187 cc_binary {
3188 name: "mybin",
3189 }
3190 `)
3191
3192 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003193 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003194 name := apexBundle.BaseModuleName()
3195 prefix := "TARGET_"
3196 var builder strings.Builder
3197 data.Custom(&builder, name, prefix, "", data)
3198 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003199 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003200 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003201}
3202
Jiyong Park16e91a02018-12-20 18:18:08 +09003203func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003204 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003205 apex {
3206 name: "myapex",
3207 key: "myapex.key",
3208 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003209 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003210 }
3211
3212 apex_key {
3213 name: "myapex.key",
3214 public_key: "testkey.avbpubkey",
3215 private_key: "testkey.pem",
3216 }
3217
3218 cc_library {
3219 name: "mylib",
3220 srcs: ["mylib.cpp"],
3221 system_shared_libs: [],
3222 stl: "none",
3223 stubs: {
3224 versions: ["1", "2", "3"],
3225 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003226 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003227 }
3228
3229 cc_binary {
3230 name: "not_in_apex",
3231 srcs: ["mylib.cpp"],
3232 static_libs: ["mylib"],
3233 static_executable: true,
3234 system_shared_libs: [],
3235 stl: "none",
3236 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003237 `)
3238
Colin Cross7113d202019-11-20 16:39:12 -08003239 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003240
3241 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003242 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003243}
Jiyong Park9335a262018-12-24 11:31:58 +09003244
3245func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003246 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003247 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003248 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003249 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003250 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003251 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003252 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003253 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003254 }
3255
3256 cc_library {
3257 name: "mylib",
3258 srcs: ["mylib.cpp"],
3259 system_shared_libs: [],
3260 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003261 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003262 }
3263
3264 apex_key {
3265 name: "myapex.key",
3266 public_key: "testkey.avbpubkey",
3267 private_key: "testkey.pem",
3268 }
3269
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003270 android_app_certificate {
3271 name: "myapex.certificate",
3272 certificate: "testkey",
3273 }
3274
3275 android_app_certificate {
3276 name: "myapex.certificate.override",
3277 certificate: "testkey.override",
3278 }
3279
Jiyong Park9335a262018-12-24 11:31:58 +09003280 `)
3281
3282 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003283 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003284
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003285 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3286 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003287 "vendor/foo/devkeys/testkey.avbpubkey")
3288 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003289 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3290 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003291 "vendor/foo/devkeys/testkey.pem")
3292 }
3293
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003294 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003295 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003296 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003297 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003298 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003299 }
3300}
Jiyong Park58e364a2019-01-19 19:24:06 +09003301
Jooyung Hanf121a652019-12-17 14:30:11 +09003302func TestCertificate(t *testing.T) {
3303 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003304 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003305 apex {
3306 name: "myapex",
3307 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003308 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003309 }
3310 apex_key {
3311 name: "myapex.key",
3312 public_key: "testkey.avbpubkey",
3313 private_key: "testkey.pem",
3314 }`)
3315 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3316 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3317 if actual := rule.Args["certificates"]; actual != expected {
3318 t.Errorf("certificates should be %q, not %q", expected, actual)
3319 }
3320 })
3321 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003322 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003323 apex {
3324 name: "myapex_keytest",
3325 key: "myapex.key",
3326 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003327 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003328 }
3329 apex_key {
3330 name: "myapex.key",
3331 public_key: "testkey.avbpubkey",
3332 private_key: "testkey.pem",
3333 }
3334 android_app_certificate {
3335 name: "myapex.certificate.override",
3336 certificate: "testkey.override",
3337 }`)
3338 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3339 expected := "testkey.override.x509.pem testkey.override.pk8"
3340 if actual := rule.Args["certificates"]; actual != expected {
3341 t.Errorf("certificates should be %q, not %q", expected, actual)
3342 }
3343 })
3344 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003345 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003346 apex {
3347 name: "myapex",
3348 key: "myapex.key",
3349 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003350 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003351 }
3352 apex_key {
3353 name: "myapex.key",
3354 public_key: "testkey.avbpubkey",
3355 private_key: "testkey.pem",
3356 }
3357 android_app_certificate {
3358 name: "myapex.certificate",
3359 certificate: "testkey",
3360 }`)
3361 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3362 expected := "testkey.x509.pem testkey.pk8"
3363 if actual := rule.Args["certificates"]; actual != expected {
3364 t.Errorf("certificates should be %q, not %q", expected, actual)
3365 }
3366 })
3367 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003368 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003369 apex {
3370 name: "myapex_keytest",
3371 key: "myapex.key",
3372 file_contexts: ":myapex-file_contexts",
3373 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003374 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003375 }
3376 apex_key {
3377 name: "myapex.key",
3378 public_key: "testkey.avbpubkey",
3379 private_key: "testkey.pem",
3380 }
3381 android_app_certificate {
3382 name: "myapex.certificate.override",
3383 certificate: "testkey.override",
3384 }`)
3385 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3386 expected := "testkey.override.x509.pem testkey.override.pk8"
3387 if actual := rule.Args["certificates"]; actual != expected {
3388 t.Errorf("certificates should be %q, not %q", expected, actual)
3389 }
3390 })
3391 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003392 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003393 apex {
3394 name: "myapex",
3395 key: "myapex.key",
3396 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003397 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003398 }
3399 apex_key {
3400 name: "myapex.key",
3401 public_key: "testkey.avbpubkey",
3402 private_key: "testkey.pem",
3403 }`)
3404 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3405 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3406 if actual := rule.Args["certificates"]; actual != expected {
3407 t.Errorf("certificates should be %q, not %q", expected, actual)
3408 }
3409 })
3410 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003411 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003412 apex {
3413 name: "myapex_keytest",
3414 key: "myapex.key",
3415 file_contexts: ":myapex-file_contexts",
3416 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003417 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003418 }
3419 apex_key {
3420 name: "myapex.key",
3421 public_key: "testkey.avbpubkey",
3422 private_key: "testkey.pem",
3423 }
3424 android_app_certificate {
3425 name: "myapex.certificate.override",
3426 certificate: "testkey.override",
3427 }`)
3428 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3429 expected := "testkey.override.x509.pem testkey.override.pk8"
3430 if actual := rule.Args["certificates"]; actual != expected {
3431 t.Errorf("certificates should be %q, not %q", expected, actual)
3432 }
3433 })
3434}
3435
Jiyong Park58e364a2019-01-19 19:24:06 +09003436func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003437 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003438 apex {
3439 name: "myapex",
3440 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003441 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003442 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003443 }
3444
3445 apex {
3446 name: "otherapex",
3447 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003448 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003449 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003450 }
3451
3452 apex_key {
3453 name: "myapex.key",
3454 public_key: "testkey.avbpubkey",
3455 private_key: "testkey.pem",
3456 }
3457
3458 cc_library {
3459 name: "mylib",
3460 srcs: ["mylib.cpp"],
3461 system_shared_libs: [],
3462 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003463 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003464 "myapex",
3465 "otherapex",
3466 ],
Jooyung Han24282772020-03-21 23:20:55 +09003467 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003468 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003469 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003470 cc_library {
3471 name: "mylib2",
3472 srcs: ["mylib.cpp"],
3473 system_shared_libs: [],
3474 stl: "none",
3475 apex_available: [
3476 "myapex",
3477 "otherapex",
3478 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003479 static_libs: ["mylib3"],
3480 recovery_available: true,
3481 min_sdk_version: "29",
3482 }
3483 cc_library {
3484 name: "mylib3",
3485 srcs: ["mylib.cpp"],
3486 system_shared_libs: [],
3487 stl: "none",
3488 apex_available: [
3489 "myapex",
3490 "otherapex",
3491 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003492 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003493 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003494 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003495 `)
3496
Jooyung Hanc87a0592020-03-02 17:44:33 +09003497 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003498 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003499 ensureNotContains(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_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003503 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003504
Vinh Tranf9754732023-01-19 22:41:46 -05003505 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003506 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003507 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003508
Colin Crossaede88c2020-08-11 12:17:01 -07003509 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3510 // each variant defines additional macros to distinguish which apex variant it is built for
3511
3512 // non-APEX variant does not have __ANDROID_APEX__ defined
3513 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3514 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3515
Vinh Tranf9754732023-01-19 22:41:46 -05003516 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003517 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3518 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003519
Jooyung Hanc87a0592020-03-02 17:44:33 +09003520 // non-APEX variant does not have __ANDROID_APEX__ defined
3521 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3522 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3523
Vinh Tranf9754732023-01-19 22:41:46 -05003524 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003525 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003526 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003527}
Jiyong Park7e636d02019-01-28 16:16:54 +09003528
3529func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003530 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003531 apex {
3532 name: "myapex",
3533 key: "myapex.key",
3534 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003535 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003536 }
3537
3538 apex_key {
3539 name: "myapex.key",
3540 public_key: "testkey.avbpubkey",
3541 private_key: "testkey.pem",
3542 }
3543
3544 cc_library_headers {
3545 name: "mylib_headers",
3546 export_include_dirs: ["my_include"],
3547 system_shared_libs: [],
3548 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003549 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003550 }
3551
3552 cc_library {
3553 name: "mylib",
3554 srcs: ["mylib.cpp"],
3555 system_shared_libs: [],
3556 stl: "none",
3557 header_libs: ["mylib_headers"],
3558 export_header_lib_headers: ["mylib_headers"],
3559 stubs: {
3560 versions: ["1", "2", "3"],
3561 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003562 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003563 }
3564
3565 cc_library {
3566 name: "otherlib",
3567 srcs: ["mylib.cpp"],
3568 system_shared_libs: [],
3569 stl: "none",
3570 shared_libs: ["mylib"],
3571 }
3572 `)
3573
Colin Cross7113d202019-11-20 16:39:12 -08003574 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003575
3576 // Ensure that the include path of the header lib is exported to 'otherlib'
3577 ensureContains(t, cFlags, "-Imy_include")
3578}
Alex Light9670d332019-01-29 18:07:33 -08003579
Jiyong Park7cd10e32020-01-14 09:22:18 +09003580type fileInApex struct {
3581 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003582 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003583 isLink bool
3584}
3585
Jooyung Han1724d582022-12-21 10:17:44 +09003586func (f fileInApex) String() string {
3587 return f.src + ":" + f.path
3588}
3589
3590func (f fileInApex) match(expectation string) bool {
3591 parts := strings.Split(expectation, ":")
3592 if len(parts) == 1 {
3593 match, _ := path.Match(parts[0], f.path)
3594 return match
3595 }
3596 if len(parts) == 2 {
3597 matchSrc, _ := path.Match(parts[0], f.src)
3598 matchDst, _ := path.Match(parts[1], f.path)
3599 return matchSrc && matchDst
3600 }
3601 panic("invalid expected file specification: " + expectation)
3602}
3603
Jooyung Hana57af4a2020-01-23 05:36:59 +00003604func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003605 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003606 module := ctx.ModuleForTests(moduleName, variant)
3607 apexRule := module.MaybeRule("apexRule")
3608 apexDir := "/image.apex/"
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)
Kiyoung Kima2d6dee2023-08-11 10:14:43 +09003818 variables.KeepVndk = proptools.BoolPtr(true)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003819 }))
3820 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3821 })
3822 }
Jooyung Han344d5432019-08-23 11:17:39 +09003823}
3824
3825func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003826 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003827 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003828 name: "com.android.vndk.current",
3829 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003830 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003831 }
3832
3833 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003834 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003835 public_key: "testkey.avbpubkey",
3836 private_key: "testkey.pem",
3837 }
3838
3839 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003840 name: "libvndk",
3841 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003842 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003843 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003844 vndk: {
3845 enabled: true,
3846 },
3847 system_shared_libs: [],
3848 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003849 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003850 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003851
3852 cc_prebuilt_library_shared {
3853 name: "libvndk.arm",
3854 srcs: ["libvndk.arm.so"],
3855 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003856 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003857 vndk: {
3858 enabled: true,
3859 },
3860 enabled: false,
3861 arch: {
3862 arm: {
3863 enabled: true,
3864 },
3865 },
3866 system_shared_libs: [],
3867 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003868 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003869 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003870 `+vndkLibrariesTxtFiles("current"),
3871 withFiles(map[string][]byte{
3872 "libvndk.so": nil,
3873 "libvndk.arm.so": nil,
3874 }))
Colin Cross2807f002021-03-02 10:15:29 -08003875 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003876 "lib/libvndk.so",
3877 "lib/libvndk.arm.so",
3878 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003879 "lib/libc++.so",
3880 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003881 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003882 })
Jooyung Han344d5432019-08-23 11:17:39 +09003883}
3884
Jooyung Han39edb6c2019-11-06 16:53:07 +09003885func vndkLibrariesTxtFiles(vers ...string) (result string) {
3886 for _, v := range vers {
3887 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003888 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003889 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003890 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003891 name: "` + txt + `.libraries.txt",
3892 }
3893 `
3894 }
3895 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003896 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003897 result += `
3898 prebuilt_etc {
3899 name: "` + txt + `.libraries.` + v + `.txt",
3900 src: "dummy.txt",
3901 }
3902 `
3903 }
3904 }
3905 }
3906 return
3907}
3908
Jooyung Han344d5432019-08-23 11:17:39 +09003909func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003910 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003911 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003912 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003913 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003914 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003915 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003916 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003917 }
3918
3919 apex_key {
3920 name: "myapex.key",
3921 public_key: "testkey.avbpubkey",
3922 private_key: "testkey.pem",
3923 }
3924
Jooyung Han31c470b2019-10-18 16:26:59 +09003925 vndk_prebuilt_shared {
3926 name: "libvndk27",
3927 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003928 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003929 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003930 vndk: {
3931 enabled: true,
3932 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003933 target_arch: "arm64",
3934 arch: {
3935 arm: {
3936 srcs: ["libvndk27_arm.so"],
3937 },
3938 arm64: {
3939 srcs: ["libvndk27_arm64.so"],
3940 },
3941 },
Colin Cross2807f002021-03-02 10:15:29 -08003942 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003943 }
3944
3945 vndk_prebuilt_shared {
3946 name: "libvndk27",
3947 version: "27",
3948 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003949 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003950 vndk: {
3951 enabled: true,
3952 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003953 target_arch: "x86_64",
3954 arch: {
3955 x86: {
3956 srcs: ["libvndk27_x86.so"],
3957 },
3958 x86_64: {
3959 srcs: ["libvndk27_x86_64.so"],
3960 },
3961 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003962 }
3963 `+vndkLibrariesTxtFiles("27"),
3964 withFiles(map[string][]byte{
3965 "libvndk27_arm.so": nil,
3966 "libvndk27_arm64.so": nil,
3967 "libvndk27_x86.so": nil,
3968 "libvndk27_x86_64.so": nil,
3969 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003970
Colin Cross2807f002021-03-02 10:15:29 -08003971 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003972 "lib/libvndk27_arm.so",
3973 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003974 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003975 })
Jooyung Han344d5432019-08-23 11:17:39 +09003976}
3977
Jooyung Han90eee022019-10-01 20:02:42 +09003978func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003979 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003980 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003981 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003982 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003983 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003984 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003985 }
3986 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003987 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003988 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003989 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003990 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003991 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003992 }
3993 apex_key {
3994 name: "myapex.key",
3995 public_key: "testkey.avbpubkey",
3996 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003997 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003998
3999 assertApexName := func(expected, moduleName string) {
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004000 module := ctx.ModuleForTests(moduleName, "android_common_image")
4001 apexManifestRule := module.Rule("apexManifestRule")
4002 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004003 }
4004
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004005 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004006 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004007}
4008
Jooyung Han344d5432019-08-23 11:17:39 +09004009func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004010 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004011 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004012 name: "com.android.vndk.current",
4013 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004014 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004015 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004016 }
4017
4018 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004019 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004020 public_key: "testkey.avbpubkey",
4021 private_key: "testkey.pem",
4022 }
4023
4024 cc_library {
4025 name: "libvndk",
4026 srcs: ["mylib.cpp"],
4027 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004028 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004029 native_bridge_supported: true,
4030 host_supported: true,
4031 vndk: {
4032 enabled: true,
4033 },
4034 system_shared_libs: [],
4035 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004036 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004037 }
Colin Cross2807f002021-03-02 10:15:29 -08004038 `+vndkLibrariesTxtFiles("current"),
4039 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004040
Colin Cross2807f002021-03-02 10:15:29 -08004041 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004042 "lib/libvndk.so",
4043 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004044 "lib/libc++.so",
4045 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004046 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004047 })
Jooyung Han344d5432019-08-23 11:17:39 +09004048}
4049
4050func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004051 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004052 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004053 name: "com.android.vndk.current",
4054 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004055 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004056 native_bridge_supported: true,
4057 }
4058
4059 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004060 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004061 public_key: "testkey.avbpubkey",
4062 private_key: "testkey.pem",
4063 }
4064
4065 cc_library {
4066 name: "libvndk",
4067 srcs: ["mylib.cpp"],
4068 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004069 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004070 native_bridge_supported: true,
4071 host_supported: true,
4072 vndk: {
4073 enabled: true,
4074 },
4075 system_shared_libs: [],
4076 stl: "none",
4077 }
4078 `)
4079}
4080
Jooyung Han31c470b2019-10-18 16:26:59 +09004081func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004082 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004083 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004084 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004085 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004086 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004087 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004088 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004089 }
4090
4091 apex_key {
4092 name: "myapex.key",
4093 public_key: "testkey.avbpubkey",
4094 private_key: "testkey.pem",
4095 }
4096
4097 vndk_prebuilt_shared {
4098 name: "libvndk27",
4099 version: "27",
4100 target_arch: "arm",
4101 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004102 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004103 vndk: {
4104 enabled: true,
4105 },
4106 arch: {
4107 arm: {
4108 srcs: ["libvndk27.so"],
4109 }
4110 },
4111 }
4112
4113 vndk_prebuilt_shared {
4114 name: "libvndk27",
4115 version: "27",
4116 target_arch: "arm",
4117 binder32bit: true,
4118 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004119 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004120 vndk: {
4121 enabled: true,
4122 },
4123 arch: {
4124 arm: {
4125 srcs: ["libvndk27binder32.so"],
4126 }
4127 },
Colin Cross2807f002021-03-02 10:15:29 -08004128 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004129 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004130 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004131 withFiles(map[string][]byte{
4132 "libvndk27.so": nil,
4133 "libvndk27binder32.so": nil,
4134 }),
4135 withBinder32bit,
4136 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004137 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004138 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4139 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004140 },
4141 }),
4142 )
4143
Colin Cross2807f002021-03-02 10:15:29 -08004144 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004145 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004146 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004147 })
4148}
4149
Jooyung Han45a96772020-06-15 14:59:42 +09004150func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004151 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004152 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004153 name: "com.android.vndk.current",
4154 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004155 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004156 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004157 }
4158
4159 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004160 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004161 public_key: "testkey.avbpubkey",
4162 private_key: "testkey.pem",
4163 }
4164
4165 cc_library {
4166 name: "libz",
4167 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004168 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004169 vndk: {
4170 enabled: true,
4171 },
4172 stubs: {
4173 symbol_file: "libz.map.txt",
4174 versions: ["30"],
4175 }
4176 }
4177 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4178 "libz.map.txt": nil,
4179 }))
4180
Colin Cross2807f002021-03-02 10:15:29 -08004181 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004182 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4183 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09004184 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
4185 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4186 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4187 "*/*",
4188 })
Jooyung Han45a96772020-06-15 14:59:42 +09004189}
4190
Jooyung Hane3f02812023-05-08 13:54:50 +09004191func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4192 ctx := testApex(t, "",
4193 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4194 variables.DeviceVndkVersion = proptools.StringPtr("27")
4195 }),
4196 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4197 cc.RegisterVendorSnapshotModules(ctx)
4198 }),
4199 withFiles(map[string][]byte{
4200 "vendor/foo/Android.bp": []byte(`
4201 apex {
4202 name: "myapex",
4203 binaries: ["foo"],
4204 key: "myapex.key",
4205 min_sdk_version: "27",
4206 vendor: true,
4207 }
4208
4209 cc_binary {
4210 name: "foo",
4211 vendor: true,
4212 srcs: ["abc.cpp"],
4213 shared_libs: [
4214 "libllndk",
4215 "libvndk",
4216 ],
4217 nocrt: true,
4218 system_shared_libs: [],
4219 min_sdk_version: "27",
4220 }
4221
4222 apex_key {
4223 name: "myapex.key",
4224 public_key: "testkey.avbpubkey",
4225 private_key: "testkey.pem",
4226 }
4227 `),
4228 // Simulate VNDK prebuilts with vendor_snapshot
4229 "prebuilts/vndk/Android.bp": []byte(`
4230 vndk_prebuilt_shared {
4231 name: "libllndk",
4232 version: "27",
4233 vendor_available: true,
4234 product_available: true,
4235 target_arch: "arm64",
4236 arch: {
4237 arm64: {
4238 srcs: ["libllndk.so"],
4239 },
4240 },
4241 }
4242
4243 vndk_prebuilt_shared {
4244 name: "libvndk",
4245 version: "27",
4246 vendor_available: true,
4247 product_available: true,
4248 target_arch: "arm64",
4249 arch: {
4250 arm64: {
4251 srcs: ["libvndk.so"],
4252 },
4253 },
4254 vndk: {
4255 enabled: true,
4256 },
4257 min_sdk_version: "27",
4258 }
4259
4260 vndk_prebuilt_shared {
4261 name: "libc++",
4262 version: "27",
4263 target_arch: "arm64",
4264 vendor_available: true,
4265 product_available: true,
4266 vndk: {
4267 enabled: true,
4268 support_system_process: true,
4269 },
4270 arch: {
4271 arm64: {
4272 srcs: ["libc++.so"],
4273 },
4274 },
4275 min_sdk_version: "apex_inherit",
4276 }
4277
4278 vendor_snapshot {
4279 name: "vendor_snapshot",
4280 version: "27",
4281 arch: {
4282 arm64: {
4283 vndk_libs: [
4284 "libc++",
4285 "libllndk",
4286 "libvndk",
4287 ],
4288 static_libs: [
4289 "libc++demangle",
4290 "libclang_rt.builtins",
4291 "libunwind",
4292 ],
4293 },
4294 }
4295 }
4296
4297 vendor_snapshot_static {
4298 name: "libclang_rt.builtins",
4299 version: "27",
4300 target_arch: "arm64",
4301 vendor: true,
4302 arch: {
4303 arm64: {
4304 src: "libclang_rt.builtins-aarch64-android.a",
4305 },
4306 },
4307 }
4308
4309 vendor_snapshot_static {
4310 name: "libc++demangle",
4311 version: "27",
4312 target_arch: "arm64",
4313 compile_multilib: "64",
4314 vendor: true,
4315 arch: {
4316 arm64: {
4317 src: "libc++demangle.a",
4318 },
4319 },
4320 min_sdk_version: "apex_inherit",
4321 }
4322
4323 vendor_snapshot_static {
4324 name: "libunwind",
4325 version: "27",
4326 target_arch: "arm64",
4327 compile_multilib: "64",
4328 vendor: true,
4329 arch: {
4330 arm64: {
4331 src: "libunwind.a",
4332 },
4333 },
4334 min_sdk_version: "apex_inherit",
4335 }
4336 `),
4337 }))
4338
4339 // Should embed the prebuilt VNDK libraries in the apex
4340 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4341 "bin/foo",
4342 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4343 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4344 })
4345
4346 // Should link foo with prebuilt libraries (shared/static)
4347 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4348 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4349 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4350 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4351 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4352
4353 // Should declare the LLNDK library as a "required" external dependency
4354 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4355 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4356 ensureListContains(t, requireNativeLibs, "libllndk.so")
4357}
4358
Jooyung Hane1633032019-08-01 17:41:43 +09004359func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004360 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004361 apex {
4362 name: "myapex_nodep",
4363 key: "myapex.key",
4364 native_shared_libs: ["lib_nodep"],
4365 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004366 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004367 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004368 }
4369
4370 apex {
4371 name: "myapex_dep",
4372 key: "myapex.key",
4373 native_shared_libs: ["lib_dep"],
4374 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004375 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004376 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004377 }
4378
4379 apex {
4380 name: "myapex_provider",
4381 key: "myapex.key",
4382 native_shared_libs: ["libfoo"],
4383 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004384 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004385 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004386 }
4387
4388 apex {
4389 name: "myapex_selfcontained",
4390 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004391 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004392 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004393 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004394 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004395 }
4396
4397 apex_key {
4398 name: "myapex.key",
4399 public_key: "testkey.avbpubkey",
4400 private_key: "testkey.pem",
4401 }
4402
4403 cc_library {
4404 name: "lib_nodep",
4405 srcs: ["mylib.cpp"],
4406 system_shared_libs: [],
4407 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004408 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004409 }
4410
4411 cc_library {
4412 name: "lib_dep",
4413 srcs: ["mylib.cpp"],
4414 shared_libs: ["libfoo"],
4415 system_shared_libs: [],
4416 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004417 apex_available: [
4418 "myapex_dep",
4419 "myapex_provider",
4420 "myapex_selfcontained",
4421 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004422 }
4423
4424 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004425 name: "lib_dep_on_bar",
4426 srcs: ["mylib.cpp"],
4427 shared_libs: ["libbar"],
4428 system_shared_libs: [],
4429 stl: "none",
4430 apex_available: [
4431 "myapex_selfcontained",
4432 ],
4433 }
4434
4435
4436 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004437 name: "libfoo",
4438 srcs: ["mytest.cpp"],
4439 stubs: {
4440 versions: ["1"],
4441 },
4442 system_shared_libs: [],
4443 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004444 apex_available: [
4445 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004446 ],
4447 }
4448
4449 cc_library {
4450 name: "libbar",
4451 srcs: ["mytest.cpp"],
4452 stubs: {
4453 versions: ["1"],
4454 },
4455 system_shared_libs: [],
4456 stl: "none",
4457 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004458 "myapex_selfcontained",
4459 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004460 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004461
Jooyung Hane1633032019-08-01 17:41:43 +09004462 `)
4463
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004464 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004465 var provideNativeLibs, requireNativeLibs []string
4466
Sundong Ahnabb64432019-10-22 13:58:29 +09004467 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004468 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4469 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004470 ensureListEmpty(t, provideNativeLibs)
4471 ensureListEmpty(t, requireNativeLibs)
4472
Sundong Ahnabb64432019-10-22 13:58:29 +09004473 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004474 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4475 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004476 ensureListEmpty(t, provideNativeLibs)
4477 ensureListContains(t, requireNativeLibs, "libfoo.so")
4478
Sundong Ahnabb64432019-10-22 13:58:29 +09004479 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004480 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4481 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004482 ensureListContains(t, provideNativeLibs, "libfoo.so")
4483 ensureListEmpty(t, requireNativeLibs)
4484
Sundong Ahnabb64432019-10-22 13:58:29 +09004485 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004486 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4487 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004488 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004489 ensureListEmpty(t, requireNativeLibs)
4490}
4491
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004492func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4493 ctx := testApex(t, `
4494 apex {
4495 name: "myapex",
4496 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004497 native_shared_libs: ["mylib"],
4498 updatable: false,
4499 }
4500
4501 apex_key {
4502 name: "myapex.key",
4503 public_key: "testkey.avbpubkey",
4504 private_key: "testkey.pem",
4505 }
4506
4507 cc_library {
4508 name: "mylib",
4509 srcs: ["mylib.cpp"],
4510 system_shared_libs: [],
4511 stl: "none",
4512 apex_available: [
4513 "//apex_available:platform",
4514 "myapex",
4515 ],
4516 }
4517 `, android.FixtureMergeEnv(map[string]string{
4518 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4519 }))
4520
Jooyung Han63dff462023-02-09 00:11:27 +00004521 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004522 apexManifestRule := module.Rule("apexManifestRule")
4523 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4524}
4525
Vinh Tran8f5310f2022-10-07 18:16:47 -04004526func TestCompileMultilibProp(t *testing.T) {
4527 testCases := []struct {
4528 compileMultiLibProp string
4529 containedLibs []string
4530 notContainedLibs []string
4531 }{
4532 {
4533 containedLibs: []string{
4534 "image.apex/lib64/mylib.so",
4535 "image.apex/lib/mylib.so",
4536 },
4537 compileMultiLibProp: `compile_multilib: "both",`,
4538 },
4539 {
4540 containedLibs: []string{"image.apex/lib64/mylib.so"},
4541 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4542 compileMultiLibProp: `compile_multilib: "first",`,
4543 },
4544 {
4545 containedLibs: []string{"image.apex/lib64/mylib.so"},
4546 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4547 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4548 },
4549 {
4550 containedLibs: []string{"image.apex/lib64/mylib.so"},
4551 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4552 compileMultiLibProp: `compile_multilib: "64",`,
4553 },
4554 {
4555 containedLibs: []string{"image.apex/lib/mylib.so"},
4556 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4557 compileMultiLibProp: `compile_multilib: "32",`,
4558 },
4559 }
4560 for _, testCase := range testCases {
4561 ctx := testApex(t, fmt.Sprintf(`
4562 apex {
4563 name: "myapex",
4564 key: "myapex.key",
4565 %s
4566 native_shared_libs: ["mylib"],
4567 updatable: false,
4568 }
4569 apex_key {
4570 name: "myapex.key",
4571 public_key: "testkey.avbpubkey",
4572 private_key: "testkey.pem",
4573 }
4574 cc_library {
4575 name: "mylib",
4576 srcs: ["mylib.cpp"],
4577 apex_available: [
4578 "//apex_available:platform",
4579 "myapex",
4580 ],
4581 }
4582 `, testCase.compileMultiLibProp),
4583 )
4584 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4585 apexRule := module.Rule("apexRule")
4586 copyCmds := apexRule.Args["copy_commands"]
4587 for _, containedLib := range testCase.containedLibs {
4588 ensureContains(t, copyCmds, containedLib)
4589 }
4590 for _, notContainedLib := range testCase.notContainedLibs {
4591 ensureNotContains(t, copyCmds, notContainedLib)
4592 }
4593 }
4594}
4595
Alex Light0851b882019-02-07 13:20:53 -08004596func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004597 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004598 apex {
4599 name: "myapex",
4600 key: "myapex.key",
4601 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004602 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004603 }
4604
4605 apex_key {
4606 name: "myapex.key",
4607 public_key: "testkey.avbpubkey",
4608 private_key: "testkey.pem",
4609 }
4610
4611 cc_library {
4612 name: "mylib_common",
4613 srcs: ["mylib.cpp"],
4614 system_shared_libs: [],
4615 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004616 apex_available: [
4617 "//apex_available:platform",
4618 "myapex",
4619 ],
Alex Light0851b882019-02-07 13:20:53 -08004620 }
4621 `)
4622
Sundong Ahnabb64432019-10-22 13:58:29 +09004623 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004624 apexRule := module.Rule("apexRule")
4625 copyCmds := apexRule.Args["copy_commands"]
4626
4627 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4628 t.Log("Apex was a test apex!")
4629 t.Fail()
4630 }
4631 // Ensure that main rule creates an output
4632 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4633
4634 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004635 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004636
4637 // Ensure that both direct and indirect deps are copied into apex
4638 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4639
Colin Cross7113d202019-11-20 16:39:12 -08004640 // Ensure that the platform variant ends with _shared
4641 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004642
Colin Cross56a83212020-09-15 18:30:11 -07004643 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004644 t.Log("Found mylib_common not in any apex!")
4645 t.Fail()
4646 }
4647}
4648
4649func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004650 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004651 apex_test {
4652 name: "myapex",
4653 key: "myapex.key",
4654 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004655 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004656 }
4657
4658 apex_key {
4659 name: "myapex.key",
4660 public_key: "testkey.avbpubkey",
4661 private_key: "testkey.pem",
4662 }
4663
4664 cc_library {
4665 name: "mylib_common_test",
4666 srcs: ["mylib.cpp"],
4667 system_shared_libs: [],
4668 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004669 // TODO: remove //apex_available:platform
4670 apex_available: [
4671 "//apex_available:platform",
4672 "myapex",
4673 ],
Alex Light0851b882019-02-07 13:20:53 -08004674 }
4675 `)
4676
Sundong Ahnabb64432019-10-22 13:58:29 +09004677 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004678 apexRule := module.Rule("apexRule")
4679 copyCmds := apexRule.Args["copy_commands"]
4680
4681 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4682 t.Log("Apex was not a test apex!")
4683 t.Fail()
4684 }
4685 // Ensure that main rule creates an output
4686 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4687
4688 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004689 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004690
4691 // Ensure that both direct and indirect deps are copied into apex
4692 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4693
Colin Cross7113d202019-11-20 16:39:12 -08004694 // Ensure that the platform variant ends with _shared
4695 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004696}
4697
Alex Light9670d332019-01-29 18:07:33 -08004698func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004699 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004700 apex {
4701 name: "myapex",
4702 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004703 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004704 multilib: {
4705 first: {
4706 native_shared_libs: ["mylib_common"],
4707 }
4708 },
4709 target: {
4710 android: {
4711 multilib: {
4712 first: {
4713 native_shared_libs: ["mylib"],
4714 }
4715 }
4716 },
4717 host: {
4718 multilib: {
4719 first: {
4720 native_shared_libs: ["mylib2"],
4721 }
4722 }
4723 }
4724 }
4725 }
4726
4727 apex_key {
4728 name: "myapex.key",
4729 public_key: "testkey.avbpubkey",
4730 private_key: "testkey.pem",
4731 }
4732
4733 cc_library {
4734 name: "mylib",
4735 srcs: ["mylib.cpp"],
4736 system_shared_libs: [],
4737 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004738 // TODO: remove //apex_available:platform
4739 apex_available: [
4740 "//apex_available:platform",
4741 "myapex",
4742 ],
Alex Light9670d332019-01-29 18:07:33 -08004743 }
4744
4745 cc_library {
4746 name: "mylib_common",
4747 srcs: ["mylib.cpp"],
4748 system_shared_libs: [],
4749 stl: "none",
4750 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004751 // TODO: remove //apex_available:platform
4752 apex_available: [
4753 "//apex_available:platform",
4754 "myapex",
4755 ],
Alex Light9670d332019-01-29 18:07:33 -08004756 }
4757
4758 cc_library {
4759 name: "mylib2",
4760 srcs: ["mylib.cpp"],
4761 system_shared_libs: [],
4762 stl: "none",
4763 compile_multilib: "first",
4764 }
4765 `)
4766
Sundong Ahnabb64432019-10-22 13:58:29 +09004767 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004768 copyCmds := apexRule.Args["copy_commands"]
4769
4770 // Ensure that main rule creates an output
4771 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4772
4773 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004774 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4775 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4776 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004777
4778 // Ensure that both direct and indirect deps are copied into apex
4779 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4780 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4781 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4782
Colin Cross7113d202019-11-20 16:39:12 -08004783 // Ensure that the platform variant ends with _shared
4784 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4785 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4786 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004787}
Jiyong Park04480cf2019-02-06 00:16:29 +09004788
Jiyong Park59140302020-12-14 18:44:04 +09004789func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004790 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004791 apex {
4792 name: "myapex",
4793 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004794 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004795 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004796 arch: {
4797 arm64: {
4798 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004799 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004800 },
4801 x86_64: {
4802 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004803 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004804 },
4805 }
4806 }
4807
4808 apex_key {
4809 name: "myapex.key",
4810 public_key: "testkey.avbpubkey",
4811 private_key: "testkey.pem",
4812 }
4813
4814 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004815 name: "mylib.generic",
4816 srcs: ["mylib.cpp"],
4817 system_shared_libs: [],
4818 stl: "none",
4819 // TODO: remove //apex_available:platform
4820 apex_available: [
4821 "//apex_available:platform",
4822 "myapex",
4823 ],
4824 }
4825
4826 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004827 name: "mylib.arm64",
4828 srcs: ["mylib.cpp"],
4829 system_shared_libs: [],
4830 stl: "none",
4831 // TODO: remove //apex_available:platform
4832 apex_available: [
4833 "//apex_available:platform",
4834 "myapex",
4835 ],
4836 }
4837
4838 cc_library {
4839 name: "mylib.x64",
4840 srcs: ["mylib.cpp"],
4841 system_shared_libs: [],
4842 stl: "none",
4843 // TODO: remove //apex_available:platform
4844 apex_available: [
4845 "//apex_available:platform",
4846 "myapex",
4847 ],
4848 }
4849 `)
4850
4851 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4852 copyCmds := apexRule.Args["copy_commands"]
4853
4854 // Ensure that apex variant is created for the direct dep
4855 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004856 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004857 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4858
4859 // Ensure that both direct and indirect deps are copied into apex
4860 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4861 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4862}
4863
Jiyong Park04480cf2019-02-06 00:16:29 +09004864func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004865 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004866 apex {
4867 name: "myapex",
4868 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004869 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004870 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004871 }
4872
4873 apex_key {
4874 name: "myapex.key",
4875 public_key: "testkey.avbpubkey",
4876 private_key: "testkey.pem",
4877 }
4878
4879 sh_binary {
4880 name: "myscript",
4881 src: "mylib.cpp",
4882 filename: "myscript.sh",
4883 sub_dir: "script",
4884 }
4885 `)
4886
Sundong Ahnabb64432019-10-22 13:58:29 +09004887 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004888 copyCmds := apexRule.Args["copy_commands"]
4889
4890 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4891}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004892
Jooyung Han91df2082019-11-20 01:49:42 +09004893func TestApexInVariousPartition(t *testing.T) {
4894 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004895 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004896 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004897 {"", "system"},
4898 {"product_specific: true", "product"},
4899 {"soc_specific: true", "vendor"},
4900 {"proprietary: true", "vendor"},
4901 {"vendor: true", "vendor"},
4902 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004903 }
4904 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004905 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004906 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004907 apex {
4908 name: "myapex",
4909 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004910 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004911 `+tc.propName+`
4912 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004913
Jooyung Han91df2082019-11-20 01:49:42 +09004914 apex_key {
4915 name: "myapex.key",
4916 public_key: "testkey.avbpubkey",
4917 private_key: "testkey.pem",
4918 }
4919 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004920
Jooyung Han91df2082019-11-20 01:49:42 +09004921 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004922 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004923 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004924 if actual != expected {
4925 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4926 }
Jooyung Han91df2082019-11-20 01:49:42 +09004927 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004928 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004929}
Jiyong Park67882562019-03-21 01:11:21 +09004930
Jooyung Han580eb4f2020-06-24 19:33:06 +09004931func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004932 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004933 apex {
4934 name: "myapex",
4935 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004936 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004937 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004938
Jooyung Han580eb4f2020-06-24 19:33:06 +09004939 apex_key {
4940 name: "myapex.key",
4941 public_key: "testkey.avbpubkey",
4942 private_key: "testkey.pem",
4943 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004944 `)
4945 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004946 rule := module.Output("file_contexts")
4947 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4948}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004949
Jooyung Han580eb4f2020-06-24 19:33:06 +09004950func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004951 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004952 apex {
4953 name: "myapex",
4954 key: "myapex.key",
4955 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004956 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004957 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004958
Jooyung Han580eb4f2020-06-24 19:33:06 +09004959 apex_key {
4960 name: "myapex.key",
4961 public_key: "testkey.avbpubkey",
4962 private_key: "testkey.pem",
4963 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004964 `, withFiles(map[string][]byte{
4965 "my_own_file_contexts": nil,
4966 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004967}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004968
Jooyung Han580eb4f2020-06-24 19:33:06 +09004969func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004970 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004971 apex {
4972 name: "myapex",
4973 key: "myapex.key",
4974 product_specific: true,
4975 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004976 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004977 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004978
Jooyung Han580eb4f2020-06-24 19:33:06 +09004979 apex_key {
4980 name: "myapex.key",
4981 public_key: "testkey.avbpubkey",
4982 private_key: "testkey.pem",
4983 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004984 `)
4985
Colin Cross1c460562021-02-16 17:55:47 -08004986 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004987 apex {
4988 name: "myapex",
4989 key: "myapex.key",
4990 product_specific: true,
4991 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004992 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004993 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004994
Jooyung Han580eb4f2020-06-24 19:33:06 +09004995 apex_key {
4996 name: "myapex.key",
4997 public_key: "testkey.avbpubkey",
4998 private_key: "testkey.pem",
4999 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005000 `, withFiles(map[string][]byte{
5001 "product_specific_file_contexts": nil,
5002 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005003 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5004 rule := module.Output("file_contexts")
5005 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5006}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005007
Jooyung Han580eb4f2020-06-24 19:33:06 +09005008func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005009 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005010 apex {
5011 name: "myapex",
5012 key: "myapex.key",
5013 product_specific: true,
5014 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005015 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005016 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005017
Jooyung Han580eb4f2020-06-24 19:33:06 +09005018 apex_key {
5019 name: "myapex.key",
5020 public_key: "testkey.avbpubkey",
5021 private_key: "testkey.pem",
5022 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005023
Jooyung Han580eb4f2020-06-24 19:33:06 +09005024 filegroup {
5025 name: "my-file-contexts",
5026 srcs: ["product_specific_file_contexts"],
5027 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005028 `, withFiles(map[string][]byte{
5029 "product_specific_file_contexts": nil,
5030 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005031 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5032 rule := module.Output("file_contexts")
5033 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005034}
5035
Jiyong Park67882562019-03-21 01:11:21 +09005036func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005037 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005038 apex_key {
5039 name: "myapex.key",
5040 public_key: ":my.avbpubkey",
5041 private_key: ":my.pem",
5042 product_specific: true,
5043 }
5044
5045 filegroup {
5046 name: "my.avbpubkey",
5047 srcs: ["testkey2.avbpubkey"],
5048 }
5049
5050 filegroup {
5051 name: "my.pem",
5052 srcs: ["testkey2.pem"],
5053 }
5054 `)
5055
5056 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5057 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005058 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005059 if actual_pubkey != expected_pubkey {
5060 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5061 }
5062 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005063 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005064 if actual_privkey != expected_privkey {
5065 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5066 }
5067}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005068
5069func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005070 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005071 prebuilt_apex {
5072 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005073 arch: {
5074 arm64: {
5075 src: "myapex-arm64.apex",
5076 },
5077 arm: {
5078 src: "myapex-arm.apex",
5079 },
5080 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005081 }
5082 `)
5083
Wei Li340ee8e2022-03-18 17:33:24 -07005084 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5085 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005086
Jiyong Parkc95714e2019-03-29 14:23:10 +09005087 expectedInput := "myapex-arm64.apex"
5088 if prebuilt.inputApex.String() != expectedInput {
5089 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5090 }
Wei Li340ee8e2022-03-18 17:33:24 -07005091 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5092 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5093 rule := testingModule.Rule("genProvenanceMetaData")
5094 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5095 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5096 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5097 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005098
5099 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5100 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005101}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005102
Paul Duffinc0609c62021-03-01 17:27:16 +00005103func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005104 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005105 prebuilt_apex {
5106 name: "myapex",
5107 }
5108 `)
5109}
5110
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005111func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005112 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005113 prebuilt_apex {
5114 name: "myapex",
5115 src: "myapex-arm.apex",
5116 filename: "notmyapex.apex",
5117 }
5118 `)
5119
Wei Li340ee8e2022-03-18 17:33:24 -07005120 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5121 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005122
5123 expected := "notmyapex.apex"
5124 if p.installFilename != expected {
5125 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5126 }
Wei Li340ee8e2022-03-18 17:33:24 -07005127 rule := testingModule.Rule("genProvenanceMetaData")
5128 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5129 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5130 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5131 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005132}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005133
Samiul Islam7c02e262021-09-08 17:48:28 +01005134func TestApexSetFilenameOverride(t *testing.T) {
5135 testApex(t, `
5136 apex_set {
5137 name: "com.company.android.myapex",
5138 apex_name: "com.android.myapex",
5139 set: "company-myapex.apks",
5140 filename: "com.company.android.myapex.apex"
5141 }
5142 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5143
5144 testApex(t, `
5145 apex_set {
5146 name: "com.company.android.myapex",
5147 apex_name: "com.android.myapex",
5148 set: "company-myapex.apks",
5149 filename: "com.company.android.myapex.capex"
5150 }
5151 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5152
5153 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5154 apex_set {
5155 name: "com.company.android.myapex",
5156 apex_name: "com.android.myapex",
5157 set: "company-myapex.apks",
5158 filename: "some-random-suffix"
5159 }
5160 `)
5161}
5162
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005163func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005164 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005165 prebuilt_apex {
5166 name: "myapex.prebuilt",
5167 src: "myapex-arm.apex",
5168 overrides: [
5169 "myapex",
5170 ],
5171 }
5172 `)
5173
Wei Li340ee8e2022-03-18 17:33:24 -07005174 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5175 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005176
5177 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005178 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005179 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005180 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005181 }
Wei Li340ee8e2022-03-18 17:33:24 -07005182 rule := testingModule.Rule("genProvenanceMetaData")
5183 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5184 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5185 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5186 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005187}
5188
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005189func TestPrebuiltApexName(t *testing.T) {
5190 testApex(t, `
5191 prebuilt_apex {
5192 name: "com.company.android.myapex",
5193 apex_name: "com.android.myapex",
5194 src: "company-myapex-arm.apex",
5195 }
5196 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5197
5198 testApex(t, `
5199 apex_set {
5200 name: "com.company.android.myapex",
5201 apex_name: "com.android.myapex",
5202 set: "company-myapex.apks",
5203 }
5204 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5205}
5206
5207func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5208 _ = android.GroupFixturePreparers(
5209 java.PrepareForTestWithJavaDefaultModules,
5210 PrepareForTestWithApexBuildComponents,
5211 android.FixtureWithRootAndroidBp(`
5212 platform_bootclasspath {
5213 name: "platform-bootclasspath",
5214 fragments: [
5215 {
5216 apex: "com.android.art",
5217 module: "art-bootclasspath-fragment",
5218 },
5219 ],
5220 }
5221
5222 prebuilt_apex {
5223 name: "com.company.android.art",
5224 apex_name: "com.android.art",
5225 src: "com.company.android.art-arm.apex",
5226 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5227 }
5228
5229 prebuilt_bootclasspath_fragment {
5230 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005231 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005232 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005233 hidden_api: {
5234 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5235 metadata: "my-bootclasspath-fragment/metadata.csv",
5236 index: "my-bootclasspath-fragment/index.csv",
5237 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5238 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5239 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005240 }
5241
5242 java_import {
5243 name: "core-oj",
5244 jars: ["prebuilt.jar"],
5245 }
5246 `),
5247 ).RunTest(t)
5248}
5249
Paul Duffin092153d2021-01-26 11:42:39 +00005250// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5251// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005252func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005253 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005254
Paul Duffin89886cb2021-02-05 16:44:03 +00005255 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005256 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005257 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005258 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005259 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005260 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005261 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5262 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5263 android.NormalizePathForTesting(dexJarBuildPath))
5264 }
5265
5266 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005267 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005268 // Make sure the import has been given the correct path to the dex jar.
5269 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5270 dexJarBuildPath := p.DexJarInstallPath()
5271 stem := android.RemoveOptionalPrebuiltPrefix(name)
5272 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5273 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5274 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005275 }
5276
Paul Duffin39853512021-02-26 11:09:39 +00005277 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005278 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005279 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005280 android.AssertArrayString(t, "Check if there is no source variant",
5281 []string{"android_common"},
5282 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005283 }
5284
5285 t.Run("prebuilt only", func(t *testing.T) {
5286 bp := `
5287 prebuilt_apex {
5288 name: "myapex",
5289 arch: {
5290 arm64: {
5291 src: "myapex-arm64.apex",
5292 },
5293 arm: {
5294 src: "myapex-arm.apex",
5295 },
5296 },
Paul Duffin39853512021-02-26 11:09:39 +00005297 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005298 }
5299
5300 java_import {
5301 name: "libfoo",
5302 jars: ["libfoo.jar"],
5303 }
Paul Duffin39853512021-02-26 11:09:39 +00005304
5305 java_sdk_library_import {
5306 name: "libbar",
5307 public: {
5308 jars: ["libbar.jar"],
5309 },
5310 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005311 `
5312
5313 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5314 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5315
Martin Stjernholm44825602021-09-17 01:44:12 +01005316 deapexerName := deapexerModuleName("myapex")
5317 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5318
Paul Duffinf6932af2021-02-26 18:21:56 +00005319 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005320 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005321 rule := deapexer.Rule("deapexer")
5322 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5323 t.Errorf("expected: %q, found: %q", expected, actual)
5324 }
5325
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005326 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005327 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005328 rule = prebuiltApex.Rule("android/soong/android.Cp")
5329 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5330 t.Errorf("expected: %q, found: %q", expected, actual)
5331 }
5332
Paul Duffin89886cb2021-02-05 16:44:03 +00005333 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005334 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005335
5336 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005337 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005338 })
5339
5340 t.Run("prebuilt with source preferred", func(t *testing.T) {
5341
5342 bp := `
5343 prebuilt_apex {
5344 name: "myapex",
5345 arch: {
5346 arm64: {
5347 src: "myapex-arm64.apex",
5348 },
5349 arm: {
5350 src: "myapex-arm.apex",
5351 },
5352 },
Paul Duffin39853512021-02-26 11:09:39 +00005353 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005354 }
5355
5356 java_import {
5357 name: "libfoo",
5358 jars: ["libfoo.jar"],
5359 }
5360
5361 java_library {
5362 name: "libfoo",
5363 }
Paul Duffin39853512021-02-26 11:09:39 +00005364
5365 java_sdk_library_import {
5366 name: "libbar",
5367 public: {
5368 jars: ["libbar.jar"],
5369 },
5370 }
5371
5372 java_sdk_library {
5373 name: "libbar",
5374 srcs: ["foo/bar/MyClass.java"],
5375 unsafe_ignore_missing_latest_api: true,
5376 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005377 `
5378
5379 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5380 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5381
Paul Duffin89886cb2021-02-05 16:44:03 +00005382 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005383 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005384 ensureNoSourceVariant(t, ctx, "libfoo")
5385
5386 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005387 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005388 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005389 })
5390
5391 t.Run("prebuilt preferred with source", func(t *testing.T) {
5392 bp := `
5393 prebuilt_apex {
5394 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005395 arch: {
5396 arm64: {
5397 src: "myapex-arm64.apex",
5398 },
5399 arm: {
5400 src: "myapex-arm.apex",
5401 },
5402 },
Paul Duffin39853512021-02-26 11:09:39 +00005403 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005404 }
5405
5406 java_import {
5407 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005408 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005409 jars: ["libfoo.jar"],
5410 }
5411
5412 java_library {
5413 name: "libfoo",
5414 }
Paul Duffin39853512021-02-26 11:09:39 +00005415
5416 java_sdk_library_import {
5417 name: "libbar",
5418 prefer: true,
5419 public: {
5420 jars: ["libbar.jar"],
5421 },
5422 }
5423
5424 java_sdk_library {
5425 name: "libbar",
5426 srcs: ["foo/bar/MyClass.java"],
5427 unsafe_ignore_missing_latest_api: true,
5428 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005429 `
5430
5431 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5432 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5433
Paul Duffin89886cb2021-02-05 16:44:03 +00005434 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005435 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005436 ensureNoSourceVariant(t, ctx, "libfoo")
5437
5438 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005439 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005440 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005441 })
5442}
5443
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005444func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005445 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005446 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005447 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5448 // is disabled.
5449 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5450 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005451
Paul Duffin37856732021-02-26 14:24:15 +00005452 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5453 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005454 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005455 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005456 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005457 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005458 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005459 foundLibfooJar = true
5460 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005461 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005462 }
5463 }
5464 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005465 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 +00005466 }
5467 }
5468
Paul Duffin40a3f652021-07-19 13:11:24 +01005469 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005470 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005471 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005472 var rule android.TestingBuildParams
5473
5474 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5475 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005476 }
5477
Paul Duffin40a3f652021-07-19 13:11:24 +01005478 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5479 t.Helper()
5480 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5481 var rule android.TestingBuildParams
5482
5483 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5484 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5485 }
5486
Paul Duffin89f570a2021-06-16 01:42:33 +01005487 fragment := java.ApexVariantReference{
5488 Apex: proptools.StringPtr("myapex"),
5489 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5490 }
5491
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005492 t.Run("prebuilt only", func(t *testing.T) {
5493 bp := `
5494 prebuilt_apex {
5495 name: "myapex",
5496 arch: {
5497 arm64: {
5498 src: "myapex-arm64.apex",
5499 },
5500 arm: {
5501 src: "myapex-arm.apex",
5502 },
5503 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005504 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5505 }
5506
5507 prebuilt_bootclasspath_fragment {
5508 name: "my-bootclasspath-fragment",
5509 contents: ["libfoo", "libbar"],
5510 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005511 hidden_api: {
5512 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5513 metadata: "my-bootclasspath-fragment/metadata.csv",
5514 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005515 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5516 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5517 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005518 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005519 }
5520
5521 java_import {
5522 name: "libfoo",
5523 jars: ["libfoo.jar"],
5524 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005525 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005526 }
Paul Duffin37856732021-02-26 14:24:15 +00005527
5528 java_sdk_library_import {
5529 name: "libbar",
5530 public: {
5531 jars: ["libbar.jar"],
5532 },
5533 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005534 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005535 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005536 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005537 `
5538
Paul Duffin89f570a2021-06-16 01:42:33 +01005539 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005540 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5541 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005542
Paul Duffin537ea3d2021-05-14 10:38:00 +01005543 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005544 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005545 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005546 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005547 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005548 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005549 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005550 })
5551
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005552 t.Run("apex_set only", func(t *testing.T) {
5553 bp := `
5554 apex_set {
5555 name: "myapex",
5556 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005557 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005558 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005559 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5560 }
5561
5562 java_import {
5563 name: "myjavalib",
5564 jars: ["myjavalib.jar"],
5565 apex_available: ["myapex"],
5566 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005567 }
5568
5569 prebuilt_bootclasspath_fragment {
5570 name: "my-bootclasspath-fragment",
5571 contents: ["libfoo", "libbar"],
5572 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005573 hidden_api: {
5574 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5575 metadata: "my-bootclasspath-fragment/metadata.csv",
5576 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005577 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5578 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5579 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005580 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005581 }
5582
Liz Kammer2dc72442023-04-20 10:10:48 -04005583 prebuilt_systemserverclasspath_fragment {
5584 name: "my-systemserverclasspath-fragment",
5585 contents: ["libbaz"],
5586 apex_available: ["myapex"],
5587 }
5588
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005589 java_import {
5590 name: "libfoo",
5591 jars: ["libfoo.jar"],
5592 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005593 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005594 }
5595
5596 java_sdk_library_import {
5597 name: "libbar",
5598 public: {
5599 jars: ["libbar.jar"],
5600 },
5601 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005602 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005603 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005604 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005605
5606 java_sdk_library_import {
5607 name: "libbaz",
5608 public: {
5609 jars: ["libbaz.jar"],
5610 },
5611 apex_available: ["myapex"],
5612 shared_library: false,
5613 permitted_packages: ["baz"],
5614 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005615 `
5616
Paul Duffin89f570a2021-06-16 01:42:33 +01005617 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005618 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5619 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5620
Paul Duffin537ea3d2021-05-14 10:38:00 +01005621 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005622 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005623 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005624 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005625 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005626 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005627 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005628
5629 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5630
5631 overrideNames := []string{
5632 "",
5633 "myjavalib.myapex",
5634 "libfoo.myapex",
5635 "libbar.myapex",
5636 "libbaz.myapex",
5637 }
5638 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5639 for i, e := range mkEntries {
5640 g := e.OverrideName
5641 if w := overrideNames[i]; w != g {
5642 t.Errorf("Expected override name %q, got %q", w, g)
5643 }
5644 }
5645
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005646 })
5647
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005648 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5649 bp := `
5650 prebuilt_apex {
5651 name: "myapex",
5652 arch: {
5653 arm64: {
5654 src: "myapex-arm64.apex",
5655 },
5656 arm: {
5657 src: "myapex-arm.apex",
5658 },
5659 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005660 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5661 }
5662
5663 prebuilt_bootclasspath_fragment {
5664 name: "my-bootclasspath-fragment",
5665 contents: ["libfoo", "libbar"],
5666 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005667 hidden_api: {
5668 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5669 metadata: "my-bootclasspath-fragment/metadata.csv",
5670 index: "my-bootclasspath-fragment/index.csv",
5671 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5672 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5673 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005674 }
5675
5676 java_import {
5677 name: "libfoo",
5678 jars: ["libfoo.jar"],
5679 apex_available: ["myapex"],
5680 }
5681
5682 java_library {
5683 name: "libfoo",
5684 srcs: ["foo/bar/MyClass.java"],
5685 apex_available: ["myapex"],
5686 }
Paul Duffin37856732021-02-26 14:24:15 +00005687
5688 java_sdk_library_import {
5689 name: "libbar",
5690 public: {
5691 jars: ["libbar.jar"],
5692 },
5693 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005694 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005695 }
5696
5697 java_sdk_library {
5698 name: "libbar",
5699 srcs: ["foo/bar/MyClass.java"],
5700 unsafe_ignore_missing_latest_api: true,
5701 apex_available: ["myapex"],
5702 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005703 `
5704
5705 // In this test the source (java_library) libfoo is active since the
5706 // prebuilt (java_import) defaults to prefer:false. However the
5707 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5708 // find the dex boot jar in it. We either need to disable the source libfoo
5709 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005710 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005711 // dexbootjar check is skipped if AllowMissingDependencies is true
5712 preparerAllowMissingDeps := android.GroupFixturePreparers(
5713 preparer,
5714 android.PrepareForTestWithAllowMissingDependencies,
5715 )
5716 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005717 })
5718
5719 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5720 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005721 apex {
5722 name: "myapex",
5723 key: "myapex.key",
5724 updatable: false,
5725 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5726 }
5727
5728 apex_key {
5729 name: "myapex.key",
5730 public_key: "testkey.avbpubkey",
5731 private_key: "testkey.pem",
5732 }
5733
5734 bootclasspath_fragment {
5735 name: "my-bootclasspath-fragment",
5736 contents: ["libfoo", "libbar"],
5737 apex_available: ["myapex"],
5738 hidden_api: {
5739 split_packages: ["*"],
5740 },
5741 }
5742
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005743 prebuilt_apex {
5744 name: "myapex",
5745 arch: {
5746 arm64: {
5747 src: "myapex-arm64.apex",
5748 },
5749 arm: {
5750 src: "myapex-arm.apex",
5751 },
5752 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005753 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5754 }
5755
5756 prebuilt_bootclasspath_fragment {
5757 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005758 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005759 contents: ["libfoo", "libbar"],
5760 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005761 hidden_api: {
5762 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5763 metadata: "my-bootclasspath-fragment/metadata.csv",
5764 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005765 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5766 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5767 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005768 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005769 }
5770
5771 java_import {
5772 name: "libfoo",
5773 prefer: true,
5774 jars: ["libfoo.jar"],
5775 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005776 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005777 }
5778
5779 java_library {
5780 name: "libfoo",
5781 srcs: ["foo/bar/MyClass.java"],
5782 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005783 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005784 }
Paul Duffin37856732021-02-26 14:24:15 +00005785
5786 java_sdk_library_import {
5787 name: "libbar",
5788 prefer: true,
5789 public: {
5790 jars: ["libbar.jar"],
5791 },
5792 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005793 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005794 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005795 }
5796
5797 java_sdk_library {
5798 name: "libbar",
5799 srcs: ["foo/bar/MyClass.java"],
5800 unsafe_ignore_missing_latest_api: true,
5801 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005802 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005803 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005804 `
5805
Paul Duffin89f570a2021-06-16 01:42:33 +01005806 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005807 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5808 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005809
Paul Duffin537ea3d2021-05-14 10:38:00 +01005810 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005811 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005812 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005813 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005814 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005815 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005816 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005817 })
5818
5819 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5820 bp := `
5821 apex {
5822 name: "myapex",
5823 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005824 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005825 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005826 }
5827
5828 apex_key {
5829 name: "myapex.key",
5830 public_key: "testkey.avbpubkey",
5831 private_key: "testkey.pem",
5832 }
5833
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005834 bootclasspath_fragment {
5835 name: "my-bootclasspath-fragment",
5836 contents: ["libfoo", "libbar"],
5837 apex_available: ["myapex"],
5838 hidden_api: {
5839 split_packages: ["*"],
5840 },
5841 }
5842
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005843 prebuilt_apex {
5844 name: "myapex",
5845 arch: {
5846 arm64: {
5847 src: "myapex-arm64.apex",
5848 },
5849 arm: {
5850 src: "myapex-arm.apex",
5851 },
5852 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005853 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5854 }
5855
5856 prebuilt_bootclasspath_fragment {
5857 name: "my-bootclasspath-fragment",
5858 contents: ["libfoo", "libbar"],
5859 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005860 hidden_api: {
5861 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5862 metadata: "my-bootclasspath-fragment/metadata.csv",
5863 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005864 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5865 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5866 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005867 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005868 }
5869
5870 java_import {
5871 name: "libfoo",
5872 jars: ["libfoo.jar"],
5873 apex_available: ["myapex"],
5874 }
5875
5876 java_library {
5877 name: "libfoo",
5878 srcs: ["foo/bar/MyClass.java"],
5879 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005880 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005881 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005882 }
Paul Duffin37856732021-02-26 14:24:15 +00005883
5884 java_sdk_library_import {
5885 name: "libbar",
5886 public: {
5887 jars: ["libbar.jar"],
5888 },
5889 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005890 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005891 }
5892
5893 java_sdk_library {
5894 name: "libbar",
5895 srcs: ["foo/bar/MyClass.java"],
5896 unsafe_ignore_missing_latest_api: true,
5897 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005898 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005899 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005900 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005901 `
5902
Paul Duffin89f570a2021-06-16 01:42:33 +01005903 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005904 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5905 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005906
Paul Duffin537ea3d2021-05-14 10:38:00 +01005907 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005908 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005909 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5910 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005911 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5912 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005913 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005914 })
5915
5916 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5917 bp := `
5918 apex {
5919 name: "myapex",
5920 enabled: false,
5921 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005922 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005923 }
5924
5925 apex_key {
5926 name: "myapex.key",
5927 public_key: "testkey.avbpubkey",
5928 private_key: "testkey.pem",
5929 }
5930
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005931 bootclasspath_fragment {
5932 name: "my-bootclasspath-fragment",
5933 enabled: false,
5934 contents: ["libfoo", "libbar"],
5935 apex_available: ["myapex"],
5936 hidden_api: {
5937 split_packages: ["*"],
5938 },
5939 }
5940
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005941 prebuilt_apex {
5942 name: "myapex",
5943 arch: {
5944 arm64: {
5945 src: "myapex-arm64.apex",
5946 },
5947 arm: {
5948 src: "myapex-arm.apex",
5949 },
5950 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005951 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5952 }
5953
5954 prebuilt_bootclasspath_fragment {
5955 name: "my-bootclasspath-fragment",
5956 contents: ["libfoo", "libbar"],
5957 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005958 hidden_api: {
5959 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5960 metadata: "my-bootclasspath-fragment/metadata.csv",
5961 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005962 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5963 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5964 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005965 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005966 }
5967
5968 java_import {
5969 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005970 jars: ["libfoo.jar"],
5971 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005972 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005973 }
5974
5975 java_library {
5976 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005977 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005978 srcs: ["foo/bar/MyClass.java"],
5979 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005980 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005981 }
Paul Duffin37856732021-02-26 14:24:15 +00005982
5983 java_sdk_library_import {
5984 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005985 public: {
5986 jars: ["libbar.jar"],
5987 },
5988 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005989 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005990 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005991 }
5992
5993 java_sdk_library {
5994 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005995 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00005996 srcs: ["foo/bar/MyClass.java"],
5997 unsafe_ignore_missing_latest_api: true,
5998 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005999 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006000 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006001 `
6002
Paul Duffin89f570a2021-06-16 01:42:33 +01006003 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01006004 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6005 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006006
Paul Duffin537ea3d2021-05-14 10:38:00 +01006007 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006008 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006009 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006010 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006011 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006012 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006013 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006014 })
6015}
6016
Roland Levillain630846d2019-06-26 12:48:34 +01006017func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006018 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006019 apex_test {
6020 name: "myapex",
6021 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006022 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006023 tests: [
6024 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006025 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006026 ],
6027 }
6028
6029 apex_key {
6030 name: "myapex.key",
6031 public_key: "testkey.avbpubkey",
6032 private_key: "testkey.pem",
6033 }
6034
Liz Kammer1c14a212020-05-12 15:26:55 -07006035 filegroup {
6036 name: "fg",
6037 srcs: [
6038 "baz",
6039 "bar/baz"
6040 ],
6041 }
6042
Roland Levillain630846d2019-06-26 12:48:34 +01006043 cc_test {
6044 name: "mytest",
6045 gtest: false,
6046 srcs: ["mytest.cpp"],
6047 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006048 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006049 system_shared_libs: [],
6050 static_executable: true,
6051 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006052 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006053 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006054
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006055 cc_library {
6056 name: "mylib",
6057 srcs: ["mylib.cpp"],
6058 system_shared_libs: [],
6059 stl: "none",
6060 }
6061
Liz Kammer5bd365f2020-05-27 15:15:11 -07006062 filegroup {
6063 name: "fg2",
6064 srcs: [
6065 "testdata/baz"
6066 ],
6067 }
6068
Roland Levillain9b5fde92019-06-28 15:41:19 +01006069 cc_test {
6070 name: "mytests",
6071 gtest: false,
6072 srcs: [
6073 "mytest1.cpp",
6074 "mytest2.cpp",
6075 "mytest3.cpp",
6076 ],
6077 test_per_src: true,
6078 relative_install_path: "test",
6079 system_shared_libs: [],
6080 static_executable: true,
6081 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006082 data: [
6083 ":fg",
6084 ":fg2",
6085 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006086 }
Roland Levillain630846d2019-06-26 12:48:34 +01006087 `)
6088
Sundong Ahnabb64432019-10-22 13:58:29 +09006089 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006090 copyCmds := apexRule.Args["copy_commands"]
6091
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006092 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006093 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006094 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006095
Liz Kammer1c14a212020-05-12 15:26:55 -07006096 //Ensure that test data are copied into apex.
6097 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6098 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6099
Roland Levillain9b5fde92019-06-28 15:41:19 +01006100 // Ensure that test deps built with `test_per_src` are copied into apex.
6101 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6102 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6103 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006104
6105 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07006106 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006107 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006108 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006109 prefix := "TARGET_"
6110 var builder strings.Builder
6111 data.Custom(&builder, name, prefix, "", data)
6112 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006113 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6114 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6115 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6116 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006117 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006118}
6119
Jooyung Hand48f3c32019-08-23 11:18:57 +09006120func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6121 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6122 apex {
6123 name: "myapex",
6124 key: "myapex.key",
6125 native_shared_libs: ["libfoo"],
6126 }
6127
6128 apex_key {
6129 name: "myapex.key",
6130 public_key: "testkey.avbpubkey",
6131 private_key: "testkey.pem",
6132 }
6133
6134 cc_library {
6135 name: "libfoo",
6136 stl: "none",
6137 system_shared_libs: [],
6138 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006139 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006140 }
6141 `)
6142 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6143 apex {
6144 name: "myapex",
6145 key: "myapex.key",
6146 java_libs: ["myjar"],
6147 }
6148
6149 apex_key {
6150 name: "myapex.key",
6151 public_key: "testkey.avbpubkey",
6152 private_key: "testkey.pem",
6153 }
6154
6155 java_library {
6156 name: "myjar",
6157 srcs: ["foo/bar/MyClass.java"],
6158 sdk_version: "none",
6159 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006160 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006161 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006162 }
6163 `)
6164}
6165
Bill Peckhama41a6962021-01-11 10:58:54 -08006166func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006167 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006168 apex {
6169 name: "myapex",
6170 key: "myapex.key",
6171 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006172 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006173 }
6174
6175 apex_key {
6176 name: "myapex.key",
6177 public_key: "testkey.avbpubkey",
6178 private_key: "testkey.pem",
6179 }
6180
6181 java_import {
6182 name: "myjavaimport",
6183 apex_available: ["myapex"],
6184 jars: ["my.jar"],
6185 compile_dex: true,
6186 }
6187 `)
6188
6189 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6190 apexRule := module.Rule("apexRule")
6191 copyCmds := apexRule.Args["copy_commands"]
6192 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6193}
6194
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006195func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006196 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006197 apex {
6198 name: "myapex",
6199 key: "myapex.key",
6200 apps: [
6201 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006202 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006203 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006204 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006205 }
6206
6207 apex_key {
6208 name: "myapex.key",
6209 public_key: "testkey.avbpubkey",
6210 private_key: "testkey.pem",
6211 }
6212
6213 android_app {
6214 name: "AppFoo",
6215 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006216 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006217 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006218 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006219 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006220 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006221 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006222
6223 android_app {
6224 name: "AppFooPriv",
6225 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006226 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006227 system_modules: "none",
6228 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006229 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006230 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006231 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006232 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006233
6234 cc_library_shared {
6235 name: "libjni",
6236 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006237 shared_libs: ["libfoo"],
6238 stl: "none",
6239 system_shared_libs: [],
6240 apex_available: [ "myapex" ],
6241 sdk_version: "current",
6242 }
6243
6244 cc_library_shared {
6245 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006246 stl: "none",
6247 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006248 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006249 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006250 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006251 `)
6252
Sundong Ahnabb64432019-10-22 13:58:29 +09006253 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006254 apexRule := module.Rule("apexRule")
6255 copyCmds := apexRule.Args["copy_commands"]
6256
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006257 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6258 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006259 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006260
Colin Crossaede88c2020-08-11 12:17:01 -07006261 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006262 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006263 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006264 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006265 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006266 // JNI libraries including transitive deps are
6267 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006268 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006269 // ... embedded inside APK (jnilibs.zip)
6270 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6271 // ... and not directly inside the APEX
6272 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6273 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006274
6275 apexBundle := module.Module().(*apexBundle)
6276 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6277 var builder strings.Builder
6278 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6279 androidMk := builder.String()
6280 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6281 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6282 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6283 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6284 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6285 ensureContains(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := privapp_allowlist_com.android.AppFooPriv.xml:$(PRODUCT_OUT)/apex/myapex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Dario Frenicde2a032019-10-27 00:29:22 +01006286}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006287
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006288func TestApexWithAppImportBuildId(t *testing.T) {
6289 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6290 for _, id := range invalidBuildIds {
6291 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6292 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6293 variables.BuildId = proptools.StringPtr(id)
6294 })
6295 testApexError(t, message, `apex {
6296 name: "myapex",
6297 key: "myapex.key",
6298 apps: ["AppFooPrebuilt"],
6299 updatable: false,
6300 }
6301
6302 apex_key {
6303 name: "myapex.key",
6304 public_key: "testkey.avbpubkey",
6305 private_key: "testkey.pem",
6306 }
6307
6308 android_app_import {
6309 name: "AppFooPrebuilt",
6310 apk: "PrebuiltAppFoo.apk",
6311 presigned: true,
6312 apex_available: ["myapex"],
6313 }
6314 `, fixture)
6315 }
6316}
6317
Dario Frenicde2a032019-10-27 00:29:22 +01006318func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006319 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006320 apex {
6321 name: "myapex",
6322 key: "myapex.key",
6323 apps: [
6324 "AppFooPrebuilt",
6325 "AppFooPrivPrebuilt",
6326 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006327 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006328 }
6329
6330 apex_key {
6331 name: "myapex.key",
6332 public_key: "testkey.avbpubkey",
6333 private_key: "testkey.pem",
6334 }
6335
6336 android_app_import {
6337 name: "AppFooPrebuilt",
6338 apk: "PrebuiltAppFoo.apk",
6339 presigned: true,
6340 dex_preopt: {
6341 enabled: false,
6342 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006343 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006344 }
6345
6346 android_app_import {
6347 name: "AppFooPrivPrebuilt",
6348 apk: "PrebuiltAppFooPriv.apk",
6349 privileged: true,
6350 presigned: true,
6351 dex_preopt: {
6352 enabled: false,
6353 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006354 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006355 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006356 }
6357 `)
6358
Sundong Ahnabb64432019-10-22 13:58:29 +09006359 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01006360 apexRule := module.Rule("apexRule")
6361 copyCmds := apexRule.Args["copy_commands"]
6362
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006363 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6364 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006365}
6366
6367func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006368 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006369 apex {
6370 name: "myapex",
6371 key: "myapex.key",
6372 apps: [
6373 "AppFoo",
6374 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006375 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006376 }
6377
6378 apex_key {
6379 name: "myapex.key",
6380 public_key: "testkey.avbpubkey",
6381 private_key: "testkey.pem",
6382 }
6383
6384 android_app {
6385 name: "AppFoo",
6386 srcs: ["foo/bar/MyClass.java"],
6387 sdk_version: "none",
6388 system_modules: "none",
6389 apex_available: [ "myapex" ],
6390 }
6391
6392 android_app_import {
6393 name: "AppFoo",
6394 apk: "AppFooPrebuilt.apk",
6395 filename: "AppFooPrebuilt.apk",
6396 presigned: true,
6397 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006398 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006399 }
6400 `, withFiles(map[string][]byte{
6401 "AppFooPrebuilt.apk": nil,
6402 }))
6403
6404 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006405 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006406 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006407}
6408
Dario Freni6f3937c2019-12-20 22:58:03 +00006409func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006410 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006411 apex {
6412 name: "myapex",
6413 key: "myapex.key",
6414 apps: [
6415 "TesterHelpAppFoo",
6416 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006417 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006418 }
6419
6420 apex_key {
6421 name: "myapex.key",
6422 public_key: "testkey.avbpubkey",
6423 private_key: "testkey.pem",
6424 }
6425
6426 android_test_helper_app {
6427 name: "TesterHelpAppFoo",
6428 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006429 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006430 }
6431
6432 `)
6433
6434 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6435 apexRule := module.Rule("apexRule")
6436 copyCmds := apexRule.Args["copy_commands"]
6437
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006438 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006439}
6440
Jooyung Han18020ea2019-11-13 10:50:48 +09006441func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6442 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006443 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006444 apex {
6445 name: "myapex",
6446 key: "myapex.key",
6447 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006448 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006449 }
6450
6451 apex_key {
6452 name: "myapex.key",
6453 public_key: "testkey.avbpubkey",
6454 private_key: "testkey.pem",
6455 }
6456
6457 apex {
6458 name: "otherapex",
6459 key: "myapex.key",
6460 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006461 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006462 }
6463
6464 cc_defaults {
6465 name: "libfoo-defaults",
6466 apex_available: ["otherapex"],
6467 }
6468
6469 cc_library {
6470 name: "libfoo",
6471 defaults: ["libfoo-defaults"],
6472 stl: "none",
6473 system_shared_libs: [],
6474 }`)
6475}
6476
Paul Duffine52e66f2020-03-30 17:54:29 +01006477func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006478 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006479 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006480 apex {
6481 name: "myapex",
6482 key: "myapex.key",
6483 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006484 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006485 }
6486
6487 apex_key {
6488 name: "myapex.key",
6489 public_key: "testkey.avbpubkey",
6490 private_key: "testkey.pem",
6491 }
6492
6493 apex {
6494 name: "otherapex",
6495 key: "otherapex.key",
6496 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006497 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006498 }
6499
6500 apex_key {
6501 name: "otherapex.key",
6502 public_key: "testkey.avbpubkey",
6503 private_key: "testkey.pem",
6504 }
6505
6506 cc_library {
6507 name: "libfoo",
6508 stl: "none",
6509 system_shared_libs: [],
6510 apex_available: ["otherapex"],
6511 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006512}
Jiyong Park127b40b2019-09-30 16:04:35 +09006513
Paul Duffine52e66f2020-03-30 17:54:29 +01006514func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006515 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006516 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006517.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006518.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006519.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006520.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006521.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006522.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006523 apex {
6524 name: "myapex",
6525 key: "myapex.key",
6526 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006527 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006528 }
6529
6530 apex_key {
6531 name: "myapex.key",
6532 public_key: "testkey.avbpubkey",
6533 private_key: "testkey.pem",
6534 }
6535
Jiyong Park127b40b2019-09-30 16:04:35 +09006536 cc_library {
6537 name: "libfoo",
6538 stl: "none",
6539 shared_libs: ["libbar"],
6540 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006541 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006542 }
6543
6544 cc_library {
6545 name: "libbar",
6546 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006547 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006548 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006549 apex_available: ["myapex"],
6550 }
6551
6552 cc_library {
6553 name: "libbaz",
6554 stl: "none",
6555 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006556 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006557}
Jiyong Park127b40b2019-09-30 16:04:35 +09006558
Liz Kammer5f108fa2023-05-11 14:33:17 -04006559func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6560 testApex(t, `
6561 apex {
6562 name: "myapex",
6563 key: "myapex.key",
6564 native_shared_libs: ["libfoo"],
6565 updatable: false,
6566 }
6567
6568 apex_key {
6569 name: "myapex.key",
6570 public_key: "testkey.avbpubkey",
6571 private_key: "testkey.pem",
6572 }
6573
6574 cc_library {
6575 name: "libfoo",
6576 stl: "none",
6577 static_libs: ["libbar"],
6578 system_shared_libs: [],
6579 apex_available: ["myapex"],
6580 }
6581
6582 cc_library {
6583 name: "libbar",
6584 stl: "none",
6585 shared_libs: ["libbaz"],
6586 system_shared_libs: [],
6587 apex_available: ["myapex"],
6588 }
6589
6590 cc_library {
6591 name: "libbaz",
6592 stl: "none",
6593 system_shared_libs: [],
6594 }`)
6595
6596 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6597 apex {
6598 name: "myapex",
6599 key: "myapex.key",
6600 native_shared_libs: ["libfoo"],
6601 updatable: false,
6602 }
6603
6604 apex_key {
6605 name: "myapex.key",
6606 public_key: "testkey.avbpubkey",
6607 private_key: "testkey.pem",
6608 }
6609
6610 cc_library {
6611 name: "libfoo",
6612 stl: "none",
6613 static_libs: ["libbar"],
6614 system_shared_libs: [],
6615 apex_available: ["myapex"],
6616 }
6617
6618 cc_library {
6619 name: "libbar",
6620 stl: "none",
6621 system_shared_libs: [],
6622 }`)
6623}
6624
Paul Duffine52e66f2020-03-30 17:54:29 +01006625func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006626 testApexError(t, "\"otherapex\" is not a valid module name", `
6627 apex {
6628 name: "myapex",
6629 key: "myapex.key",
6630 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006631 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006632 }
6633
6634 apex_key {
6635 name: "myapex.key",
6636 public_key: "testkey.avbpubkey",
6637 private_key: "testkey.pem",
6638 }
6639
6640 cc_library {
6641 name: "libfoo",
6642 stl: "none",
6643 system_shared_libs: [],
6644 apex_available: ["otherapex"],
6645 }`)
6646
Paul Duffine52e66f2020-03-30 17:54:29 +01006647 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006648 apex {
6649 name: "myapex",
6650 key: "myapex.key",
6651 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006652 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006653 }
6654
6655 apex_key {
6656 name: "myapex.key",
6657 public_key: "testkey.avbpubkey",
6658 private_key: "testkey.pem",
6659 }
6660
6661 cc_library {
6662 name: "libfoo",
6663 stl: "none",
6664 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006665 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006666 apex_available: ["myapex"],
6667 }
6668
6669 cc_library {
6670 name: "libbar",
6671 stl: "none",
6672 system_shared_libs: [],
6673 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006674 }
6675
6676 cc_library {
6677 name: "libbaz",
6678 stl: "none",
6679 system_shared_libs: [],
6680 stubs: {
6681 versions: ["10", "20", "30"],
6682 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006683 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006684}
Jiyong Park127b40b2019-09-30 16:04:35 +09006685
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006686func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6687 t.Run("negative variant_version produces error", func(t *testing.T) {
6688 testApexError(t, "expected an integer between 0-9; got -1", `
6689 apex {
6690 name: "myapex",
6691 key: "myapex.key",
6692 apex_available_name: "com.android.foo",
6693 variant_version: "-1",
6694 updatable: false,
6695 }
6696 apex_key {
6697 name: "myapex.key",
6698 public_key: "testkey.avbpubkey",
6699 private_key: "testkey.pem",
6700 }
6701 `)
6702 })
6703
6704 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6705 testApexError(t, "expected an integer between 0-9; got 10", `
6706 apex {
6707 name: "myapex",
6708 key: "myapex.key",
6709 apex_available_name: "com.android.foo",
6710 variant_version: "10",
6711 updatable: false,
6712 }
6713 apex_key {
6714 name: "myapex.key",
6715 public_key: "testkey.avbpubkey",
6716 private_key: "testkey.pem",
6717 }
6718 `)
6719 })
6720}
6721
6722func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6723 context := android.GroupFixturePreparers(
6724 android.PrepareForIntegrationTestWithAndroid,
6725 PrepareForTestWithApexBuildComponents,
6726 android.FixtureMergeMockFs(android.MockFS{
6727 "system/sepolicy/apex/foo-file_contexts": nil,
6728 "system/sepolicy/apex/bar-file_contexts": nil,
6729 }),
6730 )
6731 result := context.RunTestWithBp(t, `
6732 apex {
6733 name: "foo",
6734 key: "myapex.key",
6735 apex_available_name: "com.android.foo",
6736 variant_version: "0",
6737 updatable: false,
6738 }
6739 apex {
6740 name: "bar",
6741 key: "myapex.key",
6742 apex_available_name: "com.android.foo",
6743 variant_version: "3",
6744 updatable: false,
6745 }
6746 apex_key {
6747 name: "myapex.key",
6748 public_key: "testkey.avbpubkey",
6749 private_key: "testkey.pem",
6750 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006751 override_apex {
6752 name: "myoverrideapex",
6753 base: "bar",
6754 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006755 `)
6756
6757 fooManifestRule := result.ModuleForTests("foo", "android_common_foo_image").Rule("apexManifestRule")
6758 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6759 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6760 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6761 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6762 }
6763
6764 barManifestRule := result.ModuleForTests("bar", "android_common_bar_image").Rule("apexManifestRule")
6765 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6766 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6767 barActualDefaultVersion := barManifestRule.Args["default_version"]
6768 if barActualDefaultVersion != barExpectedDefaultVersion {
6769 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6770 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006771
6772 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar_image").Rule("apexManifestRule")
6773 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6774 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6775 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6776 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006777}
6778
Sam Delmericoca816532023-06-02 14:09:50 -04006779func TestApexAvailable_ApexAvailableName(t *testing.T) {
6780 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6781 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6782 apex {
6783 name: "myapex_sminus",
6784 key: "myapex.key",
6785 apps: ["AppFoo"],
6786 apex_available_name: "myapex",
6787 updatable: false,
6788 }
6789 apex {
6790 name: "myapex",
6791 key: "myapex.key",
6792 apps: ["AppFoo"],
6793 updatable: false,
6794 }
6795 apex_key {
6796 name: "myapex.key",
6797 public_key: "testkey.avbpubkey",
6798 private_key: "testkey.pem",
6799 }
6800 android_app {
6801 name: "AppFoo",
6802 srcs: ["foo/bar/MyClass.java"],
6803 sdk_version: "none",
6804 system_modules: "none",
6805 apex_available: [ "myapex_sminus" ],
6806 }`,
6807 android.FixtureMergeMockFs(android.MockFS{
6808 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6809 }),
6810 )
6811 })
6812
6813 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6814 testApex(t, `
6815 apex {
6816 name: "myapex_sminus",
6817 key: "myapex.key",
6818 apps: ["AppFoo"],
6819 apex_available_name: "myapex",
6820 updatable: false,
6821 }
6822 apex {
6823 name: "myapex",
6824 key: "myapex.key",
6825 apps: ["AppFoo"],
6826 updatable: false,
6827 }
6828 apex_key {
6829 name: "myapex.key",
6830 public_key: "testkey.avbpubkey",
6831 private_key: "testkey.pem",
6832 }
6833 android_app {
6834 name: "AppFoo",
6835 srcs: ["foo/bar/MyClass.java"],
6836 sdk_version: "none",
6837 system_modules: "none",
6838 apex_available: [ "myapex" ],
6839 }`,
6840 android.FixtureMergeMockFs(android.MockFS{
6841 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6842 }),
6843 )
6844 })
6845
6846 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6847 testApex(t, `
6848 override_apex {
6849 name: "myoverrideapex_sminus",
6850 base: "myapex_sminus",
6851 key: "myapex.key",
6852 apps: ["AppFooOverride"],
6853 }
6854 override_apex {
6855 name: "myoverrideapex",
6856 base: "myapex",
6857 key: "myapex.key",
6858 apps: ["AppFooOverride"],
6859 }
6860 apex {
6861 name: "myapex_sminus",
6862 key: "myapex.key",
6863 apps: ["AppFoo"],
6864 apex_available_name: "myapex",
6865 updatable: false,
6866 }
6867 apex {
6868 name: "myapex",
6869 key: "myapex.key",
6870 apps: ["AppFoo"],
6871 updatable: false,
6872 }
6873 apex_key {
6874 name: "myapex.key",
6875 public_key: "testkey.avbpubkey",
6876 private_key: "testkey.pem",
6877 }
6878 android_app {
6879 name: "AppFooOverride",
6880 srcs: ["foo/bar/MyClass.java"],
6881 sdk_version: "none",
6882 system_modules: "none",
6883 apex_available: [ "myapex" ],
6884 }
6885 android_app {
6886 name: "AppFoo",
6887 srcs: ["foo/bar/MyClass.java"],
6888 sdk_version: "none",
6889 system_modules: "none",
6890 apex_available: [ "myapex" ],
6891 }`,
6892 android.FixtureMergeMockFs(android.MockFS{
6893 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6894 }),
6895 )
6896 })
6897}
6898
6899func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6900 context := android.GroupFixturePreparers(
6901 android.PrepareForIntegrationTestWithAndroid,
6902 PrepareForTestWithApexBuildComponents,
6903 java.PrepareForTestWithDexpreopt,
6904 android.FixtureMergeMockFs(android.MockFS{
6905 "system/sepolicy/apex/myapex-file_contexts": nil,
6906 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6907 }),
6908 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6909 variables.BuildId = proptools.StringPtr("buildid")
6910 }),
6911 )
6912 context.RunTestWithBp(t, `
6913 override_apex {
6914 name: "myoverrideapex_sminus",
6915 base: "myapex_sminus",
6916 }
6917 override_apex {
6918 name: "myoverrideapex",
6919 base: "myapex",
6920 }
6921 apex {
6922 name: "myapex",
6923 key: "myapex.key",
6924 apps: ["AppFoo"],
6925 updatable: false,
6926 }
6927 apex {
6928 name: "myapex_sminus",
6929 apex_available_name: "myapex",
6930 key: "myapex.key",
6931 apps: ["AppFoo_sminus"],
6932 updatable: false,
6933 }
6934 apex_key {
6935 name: "myapex.key",
6936 public_key: "testkey.avbpubkey",
6937 private_key: "testkey.pem",
6938 }
6939 android_app {
6940 name: "AppFoo",
6941 srcs: ["foo/bar/MyClass.java"],
6942 sdk_version: "none",
6943 system_modules: "none",
6944 apex_available: [ "myapex" ],
6945 }
6946 android_app {
6947 name: "AppFoo_sminus",
6948 srcs: ["foo/bar/MyClass.java"],
6949 sdk_version: "none",
6950 min_sdk_version: "29",
6951 system_modules: "none",
6952 apex_available: [ "myapex" ],
6953 }`)
6954}
6955
Jiyong Park89e850a2020-04-07 16:37:39 +09006956func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006957 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006958 apex {
6959 name: "myapex",
6960 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006961 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006962 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006963 }
6964
6965 apex_key {
6966 name: "myapex.key",
6967 public_key: "testkey.avbpubkey",
6968 private_key: "testkey.pem",
6969 }
6970
6971 cc_library {
6972 name: "libfoo",
6973 stl: "none",
6974 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006975 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006976 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006977 }
6978
6979 cc_library {
6980 name: "libfoo2",
6981 stl: "none",
6982 system_shared_libs: [],
6983 shared_libs: ["libbaz"],
6984 apex_available: ["//apex_available:platform"],
6985 }
6986
6987 cc_library {
6988 name: "libbar",
6989 stl: "none",
6990 system_shared_libs: [],
6991 apex_available: ["myapex"],
6992 }
6993
6994 cc_library {
6995 name: "libbaz",
6996 stl: "none",
6997 system_shared_libs: [],
6998 apex_available: ["myapex"],
6999 stubs: {
7000 versions: ["1"],
7001 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007002 }`)
7003
Jiyong Park89e850a2020-04-07 16:37:39 +09007004 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7005 // because it depends on libbar which isn't available to platform
7006 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7007 if libfoo.NotAvailableForPlatform() != true {
7008 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7009 }
7010
7011 // libfoo2 however can be available to platform because it depends on libbaz which provides
7012 // stubs
7013 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7014 if libfoo2.NotAvailableForPlatform() == true {
7015 t.Errorf("%q should be available to platform", libfoo2.String())
7016 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007017}
Jiyong Parka90ca002019-10-07 15:47:24 +09007018
Paul Duffine52e66f2020-03-30 17:54:29 +01007019func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007020 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007021 apex {
7022 name: "myapex",
7023 key: "myapex.key",
7024 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007025 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007026 }
7027
7028 apex_key {
7029 name: "myapex.key",
7030 public_key: "testkey.avbpubkey",
7031 private_key: "testkey.pem",
7032 }
7033
7034 cc_library {
7035 name: "libfoo",
7036 stl: "none",
7037 system_shared_libs: [],
7038 apex_available: ["myapex"],
7039 static: {
7040 apex_available: ["//apex_available:platform"],
7041 },
7042 }`)
7043
Jiyong Park89e850a2020-04-07 16:37:39 +09007044 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7045 if libfooShared.NotAvailableForPlatform() != true {
7046 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7047 }
7048 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7049 if libfooStatic.NotAvailableForPlatform() != false {
7050 t.Errorf("%q should be available to platform", libfooStatic.String())
7051 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007052}
7053
Jiyong Park5d790c32019-11-15 18:40:32 +09007054func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007055 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007056 apex {
7057 name: "myapex",
7058 key: "myapex.key",
7059 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007060 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007061 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007062 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007063 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007064 }
7065
7066 override_apex {
7067 name: "override_myapex",
7068 base: "myapex",
7069 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007070 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007071 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007072 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007073 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007074 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007075 key: "mynewapex.key",
7076 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007077 }
7078
7079 apex_key {
7080 name: "myapex.key",
7081 public_key: "testkey.avbpubkey",
7082 private_key: "testkey.pem",
7083 }
7084
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007085 apex_key {
7086 name: "mynewapex.key",
7087 public_key: "testkey2.avbpubkey",
7088 private_key: "testkey2.pem",
7089 }
7090
7091 android_app_certificate {
7092 name: "myapex.certificate",
7093 certificate: "testkey",
7094 }
7095
Jiyong Park5d790c32019-11-15 18:40:32 +09007096 android_app {
7097 name: "app",
7098 srcs: ["foo/bar/MyClass.java"],
7099 package_name: "foo",
7100 sdk_version: "none",
7101 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007102 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007103 }
7104
7105 override_android_app {
7106 name: "override_app",
7107 base: "app",
7108 package_name: "bar",
7109 }
markchien7c803b82021-08-26 22:10:06 +08007110
7111 bpf {
7112 name: "bpf",
7113 srcs: ["bpf.c"],
7114 }
7115
7116 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007117 name: "overrideBpf",
7118 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007119 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007120
7121 prebuilt_etc {
7122 name: "myetc",
7123 src: "myprebuilt",
7124 }
7125
7126 prebuilt_etc {
7127 name: "override_myetc",
7128 src: "override_myprebuilt",
7129 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007130 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007131
Jiyong Park317645e2019-12-05 13:20:58 +09007132 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
7133 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
7134 if originalVariant.GetOverriddenBy() != "" {
7135 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7136 }
7137 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7138 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7139 }
7140
Jiyong Park5d790c32019-11-15 18:40:32 +09007141 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
7142 apexRule := module.Rule("apexRule")
7143 copyCmds := apexRule.Args["copy_commands"]
7144
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007145 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7146 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007147
markchien7c803b82021-08-26 22:10:06 +08007148 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007149 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007150
Daniel Norman5a3ce132021-08-26 15:44:43 -07007151 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7152 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7153
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007154 apexBundle := module.Module().(*apexBundle)
7155 name := apexBundle.Name()
7156 if name != "override_myapex" {
7157 t.Errorf("name should be \"override_myapex\", but was %q", name)
7158 }
7159
Baligh Uddin004d7172020-02-19 21:29:28 -08007160 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7161 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7162 }
7163
Jiyong Park20bacab2020-03-03 11:45:41 +09007164 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007165 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007166 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7167
7168 signApkRule := module.Rule("signapk")
7169 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007170
Colin Crossaa255532020-07-03 13:18:24 -07007171 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007172 var builder strings.Builder
7173 data.Custom(&builder, name, "TARGET_", "", data)
7174 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007175 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7176 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007177 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007178 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007179 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007180 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007181 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007182 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007183}
7184
Albert Martineefabcf2022-03-21 20:11:16 +00007185func TestMinSdkVersionOverride(t *testing.T) {
7186 // Override from 29 to 31
7187 minSdkOverride31 := "31"
7188 ctx := testApex(t, `
7189 apex {
7190 name: "myapex",
7191 key: "myapex.key",
7192 native_shared_libs: ["mylib"],
7193 updatable: true,
7194 min_sdk_version: "29"
7195 }
7196
7197 override_apex {
7198 name: "override_myapex",
7199 base: "myapex",
7200 logging_parent: "com.foo.bar",
7201 package_name: "test.overridden.package"
7202 }
7203
7204 apex_key {
7205 name: "myapex.key",
7206 public_key: "testkey.avbpubkey",
7207 private_key: "testkey.pem",
7208 }
7209
7210 cc_library {
7211 name: "mylib",
7212 srcs: ["mylib.cpp"],
7213 runtime_libs: ["libbar"],
7214 system_shared_libs: [],
7215 stl: "none",
7216 apex_available: [ "myapex" ],
7217 min_sdk_version: "apex_inherit"
7218 }
7219
7220 cc_library {
7221 name: "libbar",
7222 srcs: ["mylib.cpp"],
7223 system_shared_libs: [],
7224 stl: "none",
7225 apex_available: [ "myapex" ],
7226 min_sdk_version: "apex_inherit"
7227 }
7228
7229 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7230
7231 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
7232 copyCmds := apexRule.Args["copy_commands"]
7233
7234 // Ensure that direct non-stubs dep is always included
7235 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7236
7237 // Ensure that runtime_libs dep in included
7238 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7239
7240 // Ensure libraries target overridden min_sdk_version value
7241 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7242}
7243
7244func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7245 // Attempt to override from 31 to 29, should be a NOOP
7246 minSdkOverride29 := "29"
7247 ctx := testApex(t, `
7248 apex {
7249 name: "myapex",
7250 key: "myapex.key",
7251 native_shared_libs: ["mylib"],
7252 updatable: true,
7253 min_sdk_version: "31"
7254 }
7255
7256 override_apex {
7257 name: "override_myapex",
7258 base: "myapex",
7259 logging_parent: "com.foo.bar",
7260 package_name: "test.overridden.package"
7261 }
7262
7263 apex_key {
7264 name: "myapex.key",
7265 public_key: "testkey.avbpubkey",
7266 private_key: "testkey.pem",
7267 }
7268
7269 cc_library {
7270 name: "mylib",
7271 srcs: ["mylib.cpp"],
7272 runtime_libs: ["libbar"],
7273 system_shared_libs: [],
7274 stl: "none",
7275 apex_available: [ "myapex" ],
7276 min_sdk_version: "apex_inherit"
7277 }
7278
7279 cc_library {
7280 name: "libbar",
7281 srcs: ["mylib.cpp"],
7282 system_shared_libs: [],
7283 stl: "none",
7284 apex_available: [ "myapex" ],
7285 min_sdk_version: "apex_inherit"
7286 }
7287
7288 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7289
7290 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
7291 copyCmds := apexRule.Args["copy_commands"]
7292
7293 // Ensure that direct non-stubs dep is always included
7294 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7295
7296 // Ensure that runtime_libs dep in included
7297 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7298
7299 // Ensure libraries target the original min_sdk_version value rather than the overridden
7300 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7301}
7302
Jooyung Han214bf372019-11-12 13:03:50 +09007303func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007304 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007305 apex {
7306 name: "myapex",
7307 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007308 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007309 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007310 }
7311
7312 apex_key {
7313 name: "myapex.key",
7314 public_key: "testkey.avbpubkey",
7315 private_key: "testkey.pem",
7316 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007317
7318 cc_library {
7319 name: "mylib",
7320 srcs: ["mylib.cpp"],
7321 stl: "libc++",
7322 system_shared_libs: [],
7323 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007324 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007325 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007326 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007327
7328 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
7329 args := module.Rule("apexRule").Args
7330 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007331 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007332
7333 // The copies of the libraries in the apex should have one more dependency than
7334 // the ones outside the apex, namely the unwinder. Ideally we should check
7335 // the dependency names directly here but for some reason the names are blank in
7336 // this test.
7337 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007338 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007339 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7340 if len(apexImplicits) != len(nonApexImplicits)+1 {
7341 t.Errorf("%q missing unwinder dep", lib)
7342 }
7343 }
Jooyung Han214bf372019-11-12 13:03:50 +09007344}
7345
Paul Duffine05480a2021-03-08 15:07:14 +00007346var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007347 "api/current.txt": nil,
7348 "api/removed.txt": nil,
7349 "api/system-current.txt": nil,
7350 "api/system-removed.txt": nil,
7351 "api/test-current.txt": nil,
7352 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007353
Anton Hanssondff2c782020-12-21 17:10:01 +00007354 "100/public/api/foo.txt": nil,
7355 "100/public/api/foo-removed.txt": nil,
7356 "100/system/api/foo.txt": nil,
7357 "100/system/api/foo-removed.txt": nil,
7358
Paul Duffineedc5d52020-06-12 17:46:39 +01007359 // For java_sdk_library_import
7360 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007361}
7362
Jooyung Han58f26ab2019-12-18 15:34:32 +09007363func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007364 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007365 apex {
7366 name: "myapex",
7367 key: "myapex.key",
7368 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007369 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007370 }
7371
7372 apex_key {
7373 name: "myapex.key",
7374 public_key: "testkey.avbpubkey",
7375 private_key: "testkey.pem",
7376 }
7377
7378 java_sdk_library {
7379 name: "foo",
7380 srcs: ["a.java"],
7381 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007382 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007383 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007384
7385 prebuilt_apis {
7386 name: "sdk",
7387 api_dirs: ["100"],
7388 }
Paul Duffin9b879592020-05-26 13:21:35 +01007389 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007390
7391 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00007392 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007393 "javalib/foo.jar",
7394 "etc/permissions/foo.xml",
7395 })
7396 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007397 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007398 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 +09007399}
7400
Paul Duffin9b879592020-05-26 13:21:35 +01007401func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007402 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007403 apex {
7404 name: "myapex",
7405 key: "myapex.key",
7406 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007407 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007408 }
7409
7410 apex_key {
7411 name: "myapex.key",
7412 public_key: "testkey.avbpubkey",
7413 private_key: "testkey.pem",
7414 }
7415
7416 java_sdk_library {
7417 name: "foo",
7418 srcs: ["a.java"],
7419 api_packages: ["foo"],
7420 apex_available: ["myapex"],
7421 sdk_version: "none",
7422 system_modules: "none",
7423 }
7424
7425 java_library {
7426 name: "bar",
7427 srcs: ["a.java"],
7428 libs: ["foo"],
7429 apex_available: ["myapex"],
7430 sdk_version: "none",
7431 system_modules: "none",
7432 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007433
7434 prebuilt_apis {
7435 name: "sdk",
7436 api_dirs: ["100"],
7437 }
Paul Duffin9b879592020-05-26 13:21:35 +01007438 `, withFiles(filesForSdkLibrary))
7439
7440 // java_sdk_library installs both impl jar and permission XML
7441 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7442 "javalib/bar.jar",
7443 "javalib/foo.jar",
7444 "etc/permissions/foo.xml",
7445 })
7446
7447 // The bar library should depend on the implementation jar.
7448 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007449 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007450 t.Errorf("expected %q, found %#q", expected, actual)
7451 }
7452}
7453
7454func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007455 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007456 apex {
7457 name: "myapex",
7458 key: "myapex.key",
7459 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007460 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007461 }
7462
7463 apex_key {
7464 name: "myapex.key",
7465 public_key: "testkey.avbpubkey",
7466 private_key: "testkey.pem",
7467 }
7468
7469 java_sdk_library {
7470 name: "foo",
7471 srcs: ["a.java"],
7472 api_packages: ["foo"],
7473 apex_available: ["myapex"],
7474 sdk_version: "none",
7475 system_modules: "none",
7476 }
7477
7478 java_library {
7479 name: "bar",
7480 srcs: ["a.java"],
7481 libs: ["foo"],
7482 sdk_version: "none",
7483 system_modules: "none",
7484 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007485
7486 prebuilt_apis {
7487 name: "sdk",
7488 api_dirs: ["100"],
7489 }
Paul Duffin9b879592020-05-26 13:21:35 +01007490 `, withFiles(filesForSdkLibrary))
7491
7492 // java_sdk_library installs both impl jar and permission XML
7493 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7494 "javalib/foo.jar",
7495 "etc/permissions/foo.xml",
7496 })
7497
7498 // The bar library should depend on the stubs jar.
7499 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007500 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007501 t.Errorf("expected %q, found %#q", expected, actual)
7502 }
7503}
7504
Paul Duffineedc5d52020-06-12 17:46:39 +01007505func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007506 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007507 prebuilt_apis {
7508 name: "sdk",
7509 api_dirs: ["100"],
7510 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007511 withFiles(map[string][]byte{
7512 "apex/a.java": nil,
7513 "apex/apex_manifest.json": nil,
7514 "apex/Android.bp": []byte(`
7515 package {
7516 default_visibility: ["//visibility:private"],
7517 }
7518
7519 apex {
7520 name: "myapex",
7521 key: "myapex.key",
7522 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007523 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007524 }
7525
7526 apex_key {
7527 name: "myapex.key",
7528 public_key: "testkey.avbpubkey",
7529 private_key: "testkey.pem",
7530 }
7531
7532 java_library {
7533 name: "bar",
7534 srcs: ["a.java"],
7535 libs: ["foo"],
7536 apex_available: ["myapex"],
7537 sdk_version: "none",
7538 system_modules: "none",
7539 }
7540`),
7541 "source/a.java": nil,
7542 "source/api/current.txt": nil,
7543 "source/api/removed.txt": nil,
7544 "source/Android.bp": []byte(`
7545 package {
7546 default_visibility: ["//visibility:private"],
7547 }
7548
7549 java_sdk_library {
7550 name: "foo",
7551 visibility: ["//apex"],
7552 srcs: ["a.java"],
7553 api_packages: ["foo"],
7554 apex_available: ["myapex"],
7555 sdk_version: "none",
7556 system_modules: "none",
7557 public: {
7558 enabled: true,
7559 },
7560 }
7561`),
7562 "prebuilt/a.jar": nil,
7563 "prebuilt/Android.bp": []byte(`
7564 package {
7565 default_visibility: ["//visibility:private"],
7566 }
7567
7568 java_sdk_library_import {
7569 name: "foo",
7570 visibility: ["//apex", "//source"],
7571 apex_available: ["myapex"],
7572 prefer: true,
7573 public: {
7574 jars: ["a.jar"],
7575 },
7576 }
7577`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007578 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007579 )
7580
7581 // java_sdk_library installs both impl jar and permission XML
7582 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7583 "javalib/bar.jar",
7584 "javalib/foo.jar",
7585 "etc/permissions/foo.xml",
7586 })
7587
7588 // The bar library should depend on the implementation jar.
7589 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007590 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007591 t.Errorf("expected %q, found %#q", expected, actual)
7592 }
7593}
7594
7595func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7596 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7597 apex {
7598 name: "myapex",
7599 key: "myapex.key",
7600 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007601 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007602 }
7603
7604 apex_key {
7605 name: "myapex.key",
7606 public_key: "testkey.avbpubkey",
7607 private_key: "testkey.pem",
7608 }
7609
7610 java_sdk_library_import {
7611 name: "foo",
7612 apex_available: ["myapex"],
7613 prefer: true,
7614 public: {
7615 jars: ["a.jar"],
7616 },
7617 }
7618
7619 `, withFiles(filesForSdkLibrary))
7620}
7621
atrost6e126252020-01-27 17:01:16 +00007622func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007623 result := android.GroupFixturePreparers(
7624 prepareForApexTest,
7625 java.PrepareForTestWithPlatformCompatConfig,
7626 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007627 apex {
7628 name: "myapex",
7629 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007630 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007631 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007632 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007633 }
7634
7635 apex_key {
7636 name: "myapex.key",
7637 public_key: "testkey.avbpubkey",
7638 private_key: "testkey.pem",
7639 }
7640
7641 platform_compat_config {
7642 name: "myjar-platform-compat-config",
7643 src: ":myjar",
7644 }
7645
7646 java_library {
7647 name: "myjar",
7648 srcs: ["foo/bar/MyClass.java"],
7649 sdk_version: "none",
7650 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007651 apex_available: [ "myapex" ],
7652 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007653
7654 // Make sure that a preferred prebuilt does not affect the apex contents.
7655 prebuilt_platform_compat_config {
7656 name: "myjar-platform-compat-config",
7657 metadata: "compat-config/metadata.xml",
7658 prefer: true,
7659 }
atrost6e126252020-01-27 17:01:16 +00007660 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007661 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007662 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7663 "etc/compatconfig/myjar-platform-compat-config.xml",
7664 "javalib/myjar.jar",
7665 })
7666}
7667
Jooyung Han862c0d62022-12-21 10:15:37 +09007668func TestNoDupeApexFiles(t *testing.T) {
7669 android.GroupFixturePreparers(
7670 android.PrepareForTestWithAndroidBuildComponents,
7671 PrepareForTestWithApexBuildComponents,
7672 prepareForTestWithMyapex,
7673 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7674 ).
7675 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7676 RunTestWithBp(t, `
7677 apex {
7678 name: "myapex",
7679 key: "myapex.key",
7680 prebuilts: ["foo", "bar"],
7681 updatable: false,
7682 }
7683
7684 apex_key {
7685 name: "myapex.key",
7686 public_key: "testkey.avbpubkey",
7687 private_key: "testkey.pem",
7688 }
7689
7690 prebuilt_etc {
7691 name: "foo",
7692 src: "myprebuilt",
7693 filename_from_src: true,
7694 }
7695
7696 prebuilt_etc {
7697 name: "bar",
7698 src: "myprebuilt",
7699 filename_from_src: true,
7700 }
7701 `)
7702}
7703
Jiyong Park479321d2019-12-16 11:47:12 +09007704func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7705 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7706 apex {
7707 name: "myapex",
7708 key: "myapex.key",
7709 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007710 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007711 }
7712
7713 apex_key {
7714 name: "myapex.key",
7715 public_key: "testkey.avbpubkey",
7716 private_key: "testkey.pem",
7717 }
7718
7719 java_library {
7720 name: "myjar",
7721 srcs: ["foo/bar/MyClass.java"],
7722 sdk_version: "none",
7723 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007724 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007725 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007726 }
7727 `)
7728}
7729
Jiyong Park7afd1072019-12-30 16:56:33 +09007730func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007731 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007732 apex {
7733 name: "myapex",
7734 key: "myapex.key",
7735 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007736 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007737 }
7738
7739 apex_key {
7740 name: "myapex.key",
7741 public_key: "testkey.avbpubkey",
7742 private_key: "testkey.pem",
7743 }
7744
7745 cc_library {
7746 name: "mylib",
7747 srcs: ["mylib.cpp"],
7748 system_shared_libs: [],
7749 stl: "none",
7750 required: ["a", "b"],
7751 host_required: ["c", "d"],
7752 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007753 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007754 }
7755 `)
7756
7757 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007758 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007759 name := apexBundle.BaseModuleName()
7760 prefix := "TARGET_"
7761 var builder strings.Builder
7762 data.Custom(&builder, name, prefix, "", data)
7763 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007764 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007765 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7766 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007767}
7768
Jiyong Park7cd10e32020-01-14 09:22:18 +09007769func TestSymlinksFromApexToSystem(t *testing.T) {
7770 bp := `
7771 apex {
7772 name: "myapex",
7773 key: "myapex.key",
7774 native_shared_libs: ["mylib"],
7775 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007776 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007777 }
7778
Jiyong Park9d677202020-02-19 16:29:35 +09007779 apex {
7780 name: "myapex.updatable",
7781 key: "myapex.key",
7782 native_shared_libs: ["mylib"],
7783 java_libs: ["myjar"],
7784 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007785 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007786 }
7787
Jiyong Park7cd10e32020-01-14 09:22:18 +09007788 apex_key {
7789 name: "myapex.key",
7790 public_key: "testkey.avbpubkey",
7791 private_key: "testkey.pem",
7792 }
7793
7794 cc_library {
7795 name: "mylib",
7796 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007797 shared_libs: [
7798 "myotherlib",
7799 "myotherlib_ext",
7800 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007801 system_shared_libs: [],
7802 stl: "none",
7803 apex_available: [
7804 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007805 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007806 "//apex_available:platform",
7807 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007808 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007809 }
7810
7811 cc_library {
7812 name: "myotherlib",
7813 srcs: ["mylib.cpp"],
7814 system_shared_libs: [],
7815 stl: "none",
7816 apex_available: [
7817 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007818 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007819 "//apex_available:platform",
7820 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007821 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007822 }
7823
Jiyong Parkce243632023-02-17 18:22:25 +09007824 cc_library {
7825 name: "myotherlib_ext",
7826 srcs: ["mylib.cpp"],
7827 system_shared_libs: [],
7828 system_ext_specific: true,
7829 stl: "none",
7830 apex_available: [
7831 "myapex",
7832 "myapex.updatable",
7833 "//apex_available:platform",
7834 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007835 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007836 }
7837
Jiyong Park7cd10e32020-01-14 09:22:18 +09007838 java_library {
7839 name: "myjar",
7840 srcs: ["foo/bar/MyClass.java"],
7841 sdk_version: "none",
7842 system_modules: "none",
7843 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007844 apex_available: [
7845 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007846 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007847 "//apex_available:platform",
7848 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007849 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007850 }
7851
7852 java_library {
7853 name: "myotherjar",
7854 srcs: ["foo/bar/MyClass.java"],
7855 sdk_version: "none",
7856 system_modules: "none",
7857 apex_available: [
7858 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007859 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007860 "//apex_available:platform",
7861 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007862 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007863 }
7864 `
7865
7866 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7867 for _, f := range files {
7868 if f.path == file {
7869 if f.isLink {
7870 t.Errorf("%q is not a real file", file)
7871 }
7872 return
7873 }
7874 }
7875 t.Errorf("%q is not found", file)
7876 }
7877
Jiyong Parkce243632023-02-17 18:22:25 +09007878 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007879 for _, f := range files {
7880 if f.path == file {
7881 if !f.isLink {
7882 t.Errorf("%q is not a symlink", file)
7883 }
Jiyong Parkce243632023-02-17 18:22:25 +09007884 if f.src != target {
7885 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7886 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007887 return
7888 }
7889 }
7890 t.Errorf("%q is not found", file)
7891 }
7892
Jiyong Park9d677202020-02-19 16:29:35 +09007893 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7894 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007895 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007896 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007897 ensureRealfileExists(t, files, "javalib/myjar.jar")
7898 ensureRealfileExists(t, files, "lib64/mylib.so")
7899 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007900 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007901
Jiyong Park9d677202020-02-19 16:29:35 +09007902 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7903 ensureRealfileExists(t, files, "javalib/myjar.jar")
7904 ensureRealfileExists(t, files, "lib64/mylib.so")
7905 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007906 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007907
7908 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007909 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007910 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007911 ensureRealfileExists(t, files, "javalib/myjar.jar")
7912 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007913 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7914 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007915
7916 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7917 ensureRealfileExists(t, files, "javalib/myjar.jar")
7918 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007919 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7920 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007921}
7922
Yo Chiange8128052020-07-23 20:09:18 +08007923func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007924 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007925 apex {
7926 name: "myapex",
7927 key: "myapex.key",
7928 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007929 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007930 }
7931
7932 apex_key {
7933 name: "myapex.key",
7934 public_key: "testkey.avbpubkey",
7935 private_key: "testkey.pem",
7936 }
7937
7938 cc_library_shared {
7939 name: "mylib",
7940 srcs: ["mylib.cpp"],
7941 shared_libs: ["myotherlib"],
7942 system_shared_libs: [],
7943 stl: "none",
7944 apex_available: [
7945 "myapex",
7946 "//apex_available:platform",
7947 ],
7948 }
7949
7950 cc_prebuilt_library_shared {
7951 name: "myotherlib",
7952 srcs: ["prebuilt.so"],
7953 system_shared_libs: [],
7954 stl: "none",
7955 apex_available: [
7956 "myapex",
7957 "//apex_available:platform",
7958 ],
7959 }
7960 `)
7961
Prerana Patilb1896c82022-11-09 18:14:34 +00007962 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007963 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007964 var builder strings.Builder
7965 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7966 androidMk := builder.String()
7967 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007968 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007969 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7970 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7971 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007972 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08007973}
7974
Jooyung Han643adc42020-02-27 13:50:06 +09007975func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007976 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007977 apex {
7978 name: "myapex",
7979 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007980 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007981 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007982 }
7983
7984 apex_key {
7985 name: "myapex.key",
7986 public_key: "testkey.avbpubkey",
7987 private_key: "testkey.pem",
7988 }
7989
7990 cc_library {
7991 name: "mylib",
7992 srcs: ["mylib.cpp"],
7993 shared_libs: ["mylib2"],
7994 system_shared_libs: [],
7995 stl: "none",
7996 apex_available: [ "myapex" ],
7997 }
7998
7999 cc_library {
8000 name: "mylib2",
8001 srcs: ["mylib.cpp"],
8002 system_shared_libs: [],
8003 stl: "none",
8004 apex_available: [ "myapex" ],
8005 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008006
8007 rust_ffi_shared {
8008 name: "libfoo.rust",
8009 crate_name: "foo",
8010 srcs: ["foo.rs"],
8011 shared_libs: ["libfoo.shared_from_rust"],
8012 prefer_rlib: true,
8013 apex_available: ["myapex"],
8014 }
8015
8016 cc_library_shared {
8017 name: "libfoo.shared_from_rust",
8018 srcs: ["mylib.cpp"],
8019 system_shared_libs: [],
8020 stl: "none",
8021 stubs: {
8022 versions: ["10", "11", "12"],
8023 },
8024 }
8025
Jooyung Han643adc42020-02-27 13:50:06 +09008026 `)
8027
8028 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
8029 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09008030 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008031 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
8032 "lib64/mylib.so",
8033 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008034 "lib64/libfoo.rust.so",
8035 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8036 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008037 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008038
8039 // b/220397949
8040 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008041}
8042
Jooyung Han49f67012020-04-17 13:43:10 +09008043func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008044 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008045 apex {
8046 name: "myapex",
8047 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008048 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008049 }
8050 apex_key {
8051 name: "myapex.key",
8052 public_key: "testkey.avbpubkey",
8053 private_key: "testkey.pem",
8054 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008055 `,
8056 android.FixtureModifyConfig(func(config android.Config) {
8057 delete(config.Targets, android.Android)
8058 config.AndroidCommonTarget = android.Target{}
8059 }),
8060 )
Jooyung Han49f67012020-04-17 13:43:10 +09008061
8062 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8063 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8064 }
8065}
8066
Jiyong Parkbd159612020-02-28 15:22:21 +09008067func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008068 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008069 apex {
8070 name: "myapex",
8071 key: "myapex.key",
8072 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008073 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008074 }
8075
8076 apex_key {
8077 name: "myapex.key",
8078 public_key: "testkey.avbpubkey",
8079 private_key: "testkey.pem",
8080 }
8081
8082 android_app {
8083 name: "AppFoo",
8084 srcs: ["foo/bar/MyClass.java"],
8085 sdk_version: "none",
8086 system_modules: "none",
8087 apex_available: [ "myapex" ],
8088 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008089 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008090
Colin Crosscf371cc2020-11-13 11:48:42 -08008091 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09008092 content := bundleConfigRule.Args["content"]
8093
8094 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008095 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 +09008096}
8097
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008098func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008099 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008100 apex {
8101 name: "myapex",
8102 key: "myapex.key",
8103 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008104 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008105 }
8106
8107 apex_key {
8108 name: "myapex.key",
8109 public_key: "testkey.avbpubkey",
8110 private_key: "testkey.pem",
8111 }
8112
8113 android_app_set {
8114 name: "AppSet",
8115 set: "AppSet.apks",
8116 }`)
8117 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08008118 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008119 content := bundleConfigRule.Args["content"]
8120 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8121 s := mod.Rule("apexRule").Args["copy_commands"]
8122 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008123 if len(copyCmds) != 4 {
8124 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008125 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008126 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8127 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008128 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8129 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008130
8131 // Ensure that canned_fs_config has an entry for the app set zip file
8132 generateFsRule := mod.Rule("generateFsConfig")
8133 cmd := generateFsRule.RuleParams.Command
8134 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008135}
8136
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008137func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008138 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008139 apex_set {
8140 name: "myapex",
8141 filename: "foo_v2.apex",
8142 sanitized: {
8143 none: { set: "myapex.apks", },
8144 hwaddress: { set: "myapex.hwasan.apks", },
8145 },
Paul Duffin24704672021-04-06 16:09:30 +01008146 }
8147 `
8148 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008149
Paul Duffin24704672021-04-06 16:09:30 +01008150 // Check that the extractor produces the correct output file from the correct input file.
8151 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008152
Paul Duffin24704672021-04-06 16:09:30 +01008153 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8154 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008155
Paul Duffin24704672021-04-06 16:09:30 +01008156 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8157
8158 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008159 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8160 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008161
8162 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008163}
8164
Pranav Guptaeba03b02022-09-27 00:27:08 +00008165func TestApexSetApksModuleAssignment(t *testing.T) {
8166 ctx := testApex(t, `
8167 apex_set {
8168 name: "myapex",
8169 set: ":myapex_apks_file",
8170 }
8171
8172 filegroup {
8173 name: "myapex_apks_file",
8174 srcs: ["myapex.apks"],
8175 }
8176 `)
8177
8178 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8179
8180 // Check that the extractor produces the correct apks file from the input module
8181 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
8182 extractedApex := m.Output(extractorOutput)
8183
8184 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8185}
8186
Paul Duffin89f570a2021-06-16 01:42:33 +01008187func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008188 t.Helper()
8189
Paul Duffin55607122021-03-30 23:32:51 +01008190 fs := android.MockFS{
8191 "a.java": nil,
8192 "a.jar": nil,
8193 "apex_manifest.json": nil,
8194 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008195 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008196 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8197 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8198 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008199 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008200 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008201
Paul Duffin55607122021-03-30 23:32:51 +01008202 errorHandler := android.FixtureExpectsNoErrors
8203 if errmsg != "" {
8204 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008205 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008206
Paul Duffin55607122021-03-30 23:32:51 +01008207 result := android.GroupFixturePreparers(
8208 cc.PrepareForTestWithCcDefaultModules,
8209 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008210 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008211 java.PrepareForTestWithJavaSdkLibraryFiles,
8212 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008213 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008214 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008215 android.FixtureModifyMockFS(func(fs android.MockFS) {
8216 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8217 insert := ""
8218 for _, fragment := range fragments {
8219 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8220 }
8221 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8222 platform_bootclasspath {
8223 name: "platform-bootclasspath",
8224 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008225 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008226 %s
8227 ],
8228 }
8229 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008230 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008231 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008232 // Dexpreopt for boot jars requires the ART boot image profile.
8233 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8234 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008235 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008236 ).
8237 ExtendWithErrorHandler(errorHandler).
8238 RunTestWithBp(t, bp)
8239
8240 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008241}
8242
Paul Duffin5556c5f2022-06-09 17:32:21 +00008243func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008244 preparers := android.GroupFixturePreparers(
8245 java.PrepareForTestWithJavaDefaultModules,
8246 PrepareForTestWithApexBuildComponents,
8247 ).
8248 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
8249 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
8250
8251 bpBase := `
8252 apex_set {
8253 name: "com.android.myapex",
8254 installable: true,
8255 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8256 set: "myapex.apks",
8257 }
8258
8259 apex_set {
8260 name: "com.mycompany.android.myapex",
8261 apex_name: "com.android.myapex",
8262 installable: true,
8263 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8264 set: "company-myapex.apks",
8265 }
8266
8267 prebuilt_bootclasspath_fragment {
8268 name: "my-bootclasspath-fragment",
8269 apex_available: ["com.android.myapex"],
8270 %s
8271 }
8272 `
8273
8274 t.Run("java_import", func(t *testing.T) {
8275 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8276 java_import {
8277 name: "libfoo",
8278 jars: ["libfoo.jar"],
8279 apex_available: ["com.android.myapex"],
8280 }
8281 `)
8282 })
8283
8284 t.Run("java_sdk_library_import", func(t *testing.T) {
8285 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8286 java_sdk_library_import {
8287 name: "libfoo",
8288 public: {
8289 jars: ["libbar.jar"],
8290 },
8291 apex_available: ["com.android.myapex"],
8292 }
8293 `)
8294 })
8295
8296 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8297 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8298 image_name: "art",
8299 contents: ["libfoo"],
8300 `)+`
8301 java_sdk_library_import {
8302 name: "libfoo",
8303 public: {
8304 jars: ["libbar.jar"],
8305 },
8306 apex_available: ["com.android.myapex"],
8307 }
8308 `)
8309 })
8310}
8311
Paul Duffin5556c5f2022-06-09 17:32:21 +00008312func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8313 preparers := android.GroupFixturePreparers(
8314 java.PrepareForTestWithJavaDefaultModules,
8315 PrepareForTestWithApexBuildComponents,
8316 )
8317
8318 bpBase := `
8319 apex_set {
8320 name: "com.android.myapex",
8321 installable: true,
8322 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8323 set: "myapex.apks",
8324 }
8325
8326 apex_set {
8327 name: "com.android.myapex_compressed",
8328 apex_name: "com.android.myapex",
8329 installable: true,
8330 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8331 set: "myapex_compressed.apks",
8332 }
8333
8334 prebuilt_bootclasspath_fragment {
8335 name: "my-bootclasspath-fragment",
8336 apex_available: [
8337 "com.android.myapex",
8338 "com.android.myapex_compressed",
8339 ],
8340 hidden_api: {
8341 annotation_flags: "annotation-flags.csv",
8342 metadata: "metadata.csv",
8343 index: "index.csv",
8344 signature_patterns: "signature_patterns.csv",
8345 },
8346 %s
8347 }
8348 `
8349
8350 t.Run("java_import", func(t *testing.T) {
8351 result := preparers.RunTestWithBp(t,
8352 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8353 java_import {
8354 name: "libfoo",
8355 jars: ["libfoo.jar"],
8356 apex_available: [
8357 "com.android.myapex",
8358 "com.android.myapex_compressed",
8359 ],
8360 }
8361 `)
8362
8363 module := result.Module("libfoo", "android_common_com.android.myapex")
8364 usesLibraryDep := module.(java.UsesLibraryDependency)
8365 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8366 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8367 usesLibraryDep.DexJarBuildPath().Path())
8368 })
8369
8370 t.Run("java_sdk_library_import", func(t *testing.T) {
8371 result := preparers.RunTestWithBp(t,
8372 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8373 java_sdk_library_import {
8374 name: "libfoo",
8375 public: {
8376 jars: ["libbar.jar"],
8377 },
8378 apex_available: [
8379 "com.android.myapex",
8380 "com.android.myapex_compressed",
8381 ],
8382 compile_dex: true,
8383 }
8384 `)
8385
8386 module := result.Module("libfoo", "android_common_com.android.myapex")
8387 usesLibraryDep := module.(java.UsesLibraryDependency)
8388 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8389 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8390 usesLibraryDep.DexJarBuildPath().Path())
8391 })
8392
8393 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8394 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8395 image_name: "art",
8396 contents: ["libfoo"],
8397 `)+`
8398 java_sdk_library_import {
8399 name: "libfoo",
8400 public: {
8401 jars: ["libbar.jar"],
8402 },
8403 apex_available: [
8404 "com.android.myapex",
8405 "com.android.myapex_compressed",
8406 ],
8407 compile_dex: true,
8408 }
8409 `)
8410 })
8411}
8412
Jooyung Han548640b2020-04-27 12:10:30 +09008413func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8414 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8415 apex {
8416 name: "myapex",
8417 key: "myapex.key",
8418 updatable: true,
8419 }
8420
8421 apex_key {
8422 name: "myapex.key",
8423 public_key: "testkey.avbpubkey",
8424 private_key: "testkey.pem",
8425 }
8426 `)
8427}
8428
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008429func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8430 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8431 apex {
8432 name: "myapex",
8433 key: "myapex.key",
8434 }
8435
8436 apex_key {
8437 name: "myapex.key",
8438 public_key: "testkey.avbpubkey",
8439 private_key: "testkey.pem",
8440 }
8441 `)
8442}
8443
Jooyung Handfc864c2023-03-20 18:19:07 +09008444func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8445 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008446 apex {
8447 name: "myapex",
8448 key: "myapex.key",
8449 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008450 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008451 soc_specific: true,
8452 }
8453
8454 apex_key {
8455 name: "myapex.key",
8456 public_key: "testkey.avbpubkey",
8457 private_key: "testkey.pem",
8458 }
8459 `)
8460}
8461
Jooyung Han02873da2023-03-22 17:41:03 +09008462func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8463 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8464 apex {
8465 name: "myapex",
8466 key: "myapex.key",
8467 updatable: false,
8468 min_sdk_version: "29",
8469 use_vndk_as_stable: true,
8470 vendor: true,
8471 }
8472
8473 apex_key {
8474 name: "myapex.key",
8475 public_key: "testkey.avbpubkey",
8476 private_key: "testkey.pem",
8477 }
8478 `)
8479}
8480
Jooyung Handfc864c2023-03-20 18:19:07 +09008481func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8482 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8483 apex {
8484 name: "myapex",
8485 key: "myapex.key",
8486 updatable: false,
8487 use_vndk_as_stable: true,
8488 }
8489
8490 apex_key {
8491 name: "myapex.key",
8492 public_key: "testkey.avbpubkey",
8493 private_key: "testkey.pem",
8494 }
8495 `)
8496}
8497
satayevb98371c2021-06-15 16:49:50 +01008498func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8499 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8500 apex {
8501 name: "myapex",
8502 key: "myapex.key",
8503 systemserverclasspath_fragments: [
8504 "mysystemserverclasspathfragment",
8505 ],
8506 min_sdk_version: "29",
8507 updatable: true,
8508 }
8509
8510 apex_key {
8511 name: "myapex.key",
8512 public_key: "testkey.avbpubkey",
8513 private_key: "testkey.pem",
8514 }
8515
8516 java_library {
8517 name: "foo",
8518 srcs: ["b.java"],
8519 min_sdk_version: "29",
8520 installable: true,
8521 apex_available: [
8522 "myapex",
8523 ],
8524 }
8525
8526 systemserverclasspath_fragment {
8527 name: "mysystemserverclasspathfragment",
8528 generate_classpaths_proto: false,
8529 contents: [
8530 "foo",
8531 ],
8532 apex_available: [
8533 "myapex",
8534 ],
8535 }
satayevabcd5972021-08-06 17:49:46 +01008536 `,
8537 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8538 )
satayevb98371c2021-06-15 16:49:50 +01008539}
8540
Paul Duffin064b70c2020-11-02 17:32:38 +00008541func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008542 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008543 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008544 fragment := java.ApexVariantReference{
8545 Apex: proptools.StringPtr("myapex"),
8546 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8547 }
8548
Paul Duffin064b70c2020-11-02 17:32:38 +00008549 testDexpreoptWithApexes(t, `
8550 prebuilt_apex {
8551 name: "myapex" ,
8552 arch: {
8553 arm64: {
8554 src: "myapex-arm64.apex",
8555 },
8556 arm: {
8557 src: "myapex-arm.apex",
8558 },
8559 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008560 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8561 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008562
Paul Duffin89f570a2021-06-16 01:42:33 +01008563 prebuilt_bootclasspath_fragment {
8564 name: "my-bootclasspath-fragment",
8565 contents: ["libfoo"],
8566 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008567 hidden_api: {
8568 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8569 metadata: "my-bootclasspath-fragment/metadata.csv",
8570 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008571 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8572 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8573 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008574 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008575 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008576
Paul Duffin89f570a2021-06-16 01:42:33 +01008577 java_import {
8578 name: "libfoo",
8579 jars: ["libfoo.jar"],
8580 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008581 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008582 }
8583 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008584 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008585}
8586
Spandan Dasf14e2542021-11-12 00:01:37 +00008587func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008588 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008589 bp += `
8590 apex_key {
8591 name: "myapex.key",
8592 public_key: "testkey.avbpubkey",
8593 private_key: "testkey.pem",
8594 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008595 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008596 "lib1/src/A.java": nil,
8597 "lib2/src/B.java": nil,
8598 "system/sepolicy/apex/myapex-file_contexts": nil,
8599 }
8600
Paul Duffin45338f02021-03-30 23:07:52 +01008601 errorHandler := android.FixtureExpectsNoErrors
8602 if errmsg != "" {
8603 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008604 }
Colin Crossae8600b2020-10-29 17:09:13 -07008605
Paul Duffin45338f02021-03-30 23:07:52 +01008606 android.GroupFixturePreparers(
8607 android.PrepareForTestWithAndroidBuildComponents,
8608 java.PrepareForTestWithJavaBuildComponents,
8609 PrepareForTestWithApexBuildComponents,
8610 android.PrepareForTestWithNeverallowRules(rules),
8611 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008612 apexBootJars := make([]string, 0, len(bootJars))
8613 for _, apexBootJar := range bootJars {
8614 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008615 }
satayevd604b212021-07-21 14:23:52 +01008616 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008617 }),
8618 fs.AddToFixture(),
8619 ).
8620 ExtendWithErrorHandler(errorHandler).
8621 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008622}
8623
8624func TestApexPermittedPackagesRules(t *testing.T) {
8625 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008626 name string
8627 expectedError string
8628 bp string
8629 bootJars []string
8630 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008631 }{
8632
8633 {
8634 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8635 expectedError: "",
8636 bp: `
8637 java_library {
8638 name: "bcp_lib1",
8639 srcs: ["lib1/src/*.java"],
8640 permitted_packages: ["foo.bar"],
8641 apex_available: ["myapex"],
8642 sdk_version: "none",
8643 system_modules: "none",
8644 }
8645 java_library {
8646 name: "nonbcp_lib2",
8647 srcs: ["lib2/src/*.java"],
8648 apex_available: ["myapex"],
8649 permitted_packages: ["a.b"],
8650 sdk_version: "none",
8651 system_modules: "none",
8652 }
8653 apex {
8654 name: "myapex",
8655 key: "myapex.key",
8656 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008657 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008658 }`,
8659 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008660 bcpPermittedPackages: map[string][]string{
8661 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008662 "foo.bar",
8663 },
8664 },
8665 },
8666 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008667 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008668 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 +01008669 bp: `
8670 java_library {
8671 name: "bcp_lib1",
8672 srcs: ["lib1/src/*.java"],
8673 apex_available: ["myapex"],
8674 permitted_packages: ["foo.bar"],
8675 sdk_version: "none",
8676 system_modules: "none",
8677 }
8678 java_library {
8679 name: "bcp_lib2",
8680 srcs: ["lib2/src/*.java"],
8681 apex_available: ["myapex"],
8682 permitted_packages: ["foo.bar", "bar.baz"],
8683 sdk_version: "none",
8684 system_modules: "none",
8685 }
8686 apex {
8687 name: "myapex",
8688 key: "myapex.key",
8689 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008690 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008691 }
8692 `,
8693 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008694 bcpPermittedPackages: map[string][]string{
8695 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008696 "foo.bar",
8697 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008698 "bcp_lib2": []string{
8699 "foo.bar",
8700 },
8701 },
8702 },
8703 {
8704 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8705 expectedError: "",
8706 bp: `
8707 java_library {
8708 name: "bcp_lib_restricted",
8709 srcs: ["lib1/src/*.java"],
8710 apex_available: ["myapex"],
8711 permitted_packages: ["foo.bar"],
8712 sdk_version: "none",
8713 min_sdk_version: "29",
8714 system_modules: "none",
8715 }
8716 java_library {
8717 name: "bcp_lib_unrestricted",
8718 srcs: ["lib2/src/*.java"],
8719 apex_available: ["myapex"],
8720 permitted_packages: ["foo.bar", "bar.baz"],
8721 sdk_version: "none",
8722 min_sdk_version: "29",
8723 system_modules: "none",
8724 }
8725 apex {
8726 name: "myapex",
8727 key: "myapex.key",
8728 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8729 updatable: true,
8730 min_sdk_version: "29",
8731 }
8732 `,
8733 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8734 bcpPermittedPackages: map[string][]string{
8735 "bcp_lib1_non_updateable": []string{
8736 "foo.bar",
8737 },
8738 // 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 +01008739 },
8740 },
8741 }
8742 for _, tc := range testcases {
8743 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008744 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8745 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008746 })
8747 }
8748}
8749
Jiyong Park62304bb2020-04-13 16:19:48 +09008750func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008751 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008752 apex {
8753 name: "myapex",
8754 key: "myapex.key",
8755 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008756 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008757 }
8758
8759 apex_key {
8760 name: "myapex.key",
8761 public_key: "testkey.avbpubkey",
8762 private_key: "testkey.pem",
8763 }
8764
8765 cc_library {
8766 name: "mylib",
8767 srcs: ["mylib.cpp"],
8768 system_shared_libs: [],
8769 stl: "none",
8770 stubs: {
8771 versions: ["1"],
8772 },
8773 apex_available: ["myapex"],
8774 }
8775
8776 cc_library {
8777 name: "myprivlib",
8778 srcs: ["mylib.cpp"],
8779 system_shared_libs: [],
8780 stl: "none",
8781 apex_available: ["myapex"],
8782 }
8783
8784
8785 cc_test {
8786 name: "mytest",
8787 gtest: false,
8788 srcs: ["mylib.cpp"],
8789 system_shared_libs: [],
8790 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008791 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008792 test_for: ["myapex"]
8793 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008794
8795 cc_library {
8796 name: "mytestlib",
8797 srcs: ["mylib.cpp"],
8798 system_shared_libs: [],
8799 shared_libs: ["mylib", "myprivlib"],
8800 stl: "none",
8801 test_for: ["myapex"],
8802 }
8803
8804 cc_benchmark {
8805 name: "mybench",
8806 srcs: ["mylib.cpp"],
8807 system_shared_libs: [],
8808 shared_libs: ["mylib", "myprivlib"],
8809 stl: "none",
8810 test_for: ["myapex"],
8811 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008812 `)
8813
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008814 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008815 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008816 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8817 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8818 }
8819
8820 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008821 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008822 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8823 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8824 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8825}
Jiyong Park46a512f2020-12-04 18:02:13 +09008826
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008827func TestIndirectTestFor(t *testing.T) {
8828 ctx := testApex(t, `
8829 apex {
8830 name: "myapex",
8831 key: "myapex.key",
8832 native_shared_libs: ["mylib", "myprivlib"],
8833 updatable: false,
8834 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008835
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008836 apex_key {
8837 name: "myapex.key",
8838 public_key: "testkey.avbpubkey",
8839 private_key: "testkey.pem",
8840 }
8841
8842 cc_library {
8843 name: "mylib",
8844 srcs: ["mylib.cpp"],
8845 system_shared_libs: [],
8846 stl: "none",
8847 stubs: {
8848 versions: ["1"],
8849 },
8850 apex_available: ["myapex"],
8851 }
8852
8853 cc_library {
8854 name: "myprivlib",
8855 srcs: ["mylib.cpp"],
8856 system_shared_libs: [],
8857 stl: "none",
8858 shared_libs: ["mylib"],
8859 apex_available: ["myapex"],
8860 }
8861
8862 cc_library {
8863 name: "mytestlib",
8864 srcs: ["mylib.cpp"],
8865 system_shared_libs: [],
8866 shared_libs: ["myprivlib"],
8867 stl: "none",
8868 test_for: ["myapex"],
8869 }
8870 `)
8871
8872 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008873 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008874 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8875 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8876 }
8877
8878 // The platform variant of mytestlib links to the platform variant of the
8879 // internal myprivlib.
8880 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8881
8882 // The platform variant of myprivlib links to the platform variant of mylib
8883 // and bypasses its stubs.
8884 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 +09008885}
8886
Martin Stjernholmec009002021-03-27 15:18:31 +00008887func TestTestForForLibInOtherApex(t *testing.T) {
8888 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8889 _ = testApex(t, `
8890 apex {
8891 name: "com.android.art",
8892 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008893 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008894 updatable: false,
8895 }
8896
8897 apex {
8898 name: "com.android.art.debug",
8899 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008900 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008901 updatable: false,
8902 }
8903
8904 apex_key {
8905 name: "myapex.key",
8906 public_key: "testkey.avbpubkey",
8907 private_key: "testkey.pem",
8908 }
8909
8910 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008911 name: "libnativebridge",
8912 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008913 system_shared_libs: [],
8914 stl: "none",
8915 stubs: {
8916 versions: ["1"],
8917 },
8918 apex_available: ["com.android.art", "com.android.art.debug"],
8919 }
8920
8921 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008922 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008923 srcs: ["mylib.cpp"],
8924 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008925 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008926 stl: "none",
8927 apex_available: ["com.android.art.debug"],
8928 test_for: ["com.android.art"],
8929 }
8930 `,
8931 android.MockFS{
8932 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8933 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8934 }.AddToFixture())
8935}
8936
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008937// TODO(jungjw): Move this to proptools
8938func intPtr(i int) *int {
8939 return &i
8940}
8941
8942func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008943 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008944 apex_set {
8945 name: "myapex",
8946 set: "myapex.apks",
8947 filename: "foo_v2.apex",
8948 overrides: ["foo"],
8949 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008950 `,
8951 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8952 variables.Platform_sdk_version = intPtr(30)
8953 }),
8954 android.FixtureModifyConfig(func(config android.Config) {
8955 config.Targets[android.Android] = []android.Target{
8956 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8957 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8958 }
8959 }),
8960 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008961
Paul Duffin24704672021-04-06 16:09:30 +01008962 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008963
8964 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008965 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008966 actual := extractedApex.Args["abis"]
8967 expected := "ARMEABI_V7A,ARM64_V8A"
8968 if actual != expected {
8969 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8970 }
8971 actual = extractedApex.Args["sdk-version"]
8972 expected = "30"
8973 if actual != expected {
8974 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8975 }
8976
Paul Duffin6717d882021-06-15 19:09:41 +01008977 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008978 a := m.Module().(*ApexSet)
8979 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008980 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008981 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8982 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8983 }
8984}
8985
Anton Hansson805e0a52022-11-25 14:06:46 +00008986func TestApexSet_NativeBridge(t *testing.T) {
8987 ctx := testApex(t, `
8988 apex_set {
8989 name: "myapex",
8990 set: "myapex.apks",
8991 filename: "foo_v2.apex",
8992 overrides: ["foo"],
8993 }
8994 `,
8995 android.FixtureModifyConfig(func(config android.Config) {
8996 config.Targets[android.Android] = []android.Target{
8997 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8998 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8999 }
9000 }),
9001 )
9002
9003 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
9004
9005 // Check extract_apks tool parameters. No native bridge arch expected
9006 extractedApex := m.Output("extracted/myapex.apks")
9007 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9008}
9009
Jiyong Park7d95a512020-05-10 15:16:24 +09009010func TestNoStaticLinkingToStubsLib(t *testing.T) {
9011 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9012 apex {
9013 name: "myapex",
9014 key: "myapex.key",
9015 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009016 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009017 }
9018
9019 apex_key {
9020 name: "myapex.key",
9021 public_key: "testkey.avbpubkey",
9022 private_key: "testkey.pem",
9023 }
9024
9025 cc_library {
9026 name: "mylib",
9027 srcs: ["mylib.cpp"],
9028 static_libs: ["otherlib"],
9029 system_shared_libs: [],
9030 stl: "none",
9031 apex_available: [ "myapex" ],
9032 }
9033
9034 cc_library {
9035 name: "otherlib",
9036 srcs: ["mylib.cpp"],
9037 system_shared_libs: [],
9038 stl: "none",
9039 stubs: {
9040 versions: ["1", "2", "3"],
9041 },
9042 apex_available: [ "myapex" ],
9043 }
9044 `)
9045}
9046
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009047func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009048 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009049 apex {
9050 name: "myapex",
9051 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009052 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009053 custom_sign_tool: "sign_myapex",
9054 }
9055
9056 apex_key {
9057 name: "myapex.key",
9058 public_key: "testkey.avbpubkey",
9059 private_key: "testkey.pem",
9060 }
9061 `)
9062
9063 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9064 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009065 ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`)
Jooyung Han09c11ad2021-10-27 03:45:31 +09009066}
9067
9068func TestApexKeysTxtOverrides(t *testing.T) {
9069 ctx := testApex(t, `
9070 apex {
9071 name: "myapex",
9072 key: "myapex.key",
9073 updatable: false,
9074 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009075 }
9076
9077 apex_key {
9078 name: "myapex.key",
9079 public_key: "testkey.avbpubkey",
9080 private_key: "testkey.pem",
9081 }
9082
9083 prebuilt_apex {
9084 name: "myapex",
9085 prefer: true,
9086 arch: {
9087 arm64: {
9088 src: "myapex-arm64.apex",
9089 },
9090 arm: {
9091 src: "myapex-arm.apex",
9092 },
9093 },
9094 }
9095
9096 apex_set {
9097 name: "myapex_set",
9098 set: "myapex.apks",
9099 filename: "myapex_set.apex",
9100 overrides: ["myapex"],
9101 }
9102 `)
9103
9104 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9105 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
9106 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 +09009107 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 +09009108}
9109
Jooyung Han938b5932020-06-20 12:47:47 +09009110func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009111 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009112 apex {
9113 name: "myapex",
9114 key: "myapex.key",
9115 apps: ["app"],
9116 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009117 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009118 }
9119
9120 apex_key {
9121 name: "myapex.key",
9122 public_key: "testkey.avbpubkey",
9123 private_key: "testkey.pem",
9124 }
9125
9126 android_app {
9127 name: "app",
9128 srcs: ["foo/bar/MyClass.java"],
9129 package_name: "foo",
9130 sdk_version: "none",
9131 system_modules: "none",
9132 apex_available: [ "myapex" ],
9133 }
9134 `, withFiles(map[string][]byte{
9135 "sub/Android.bp": []byte(`
9136 override_apex {
9137 name: "override_myapex",
9138 base: "myapex",
9139 apps: ["override_app"],
9140 allowed_files: ":allowed",
9141 }
9142 // Overridable "path" property should be referenced indirectly
9143 filegroup {
9144 name: "allowed",
9145 srcs: ["allowed.txt"],
9146 }
9147 override_android_app {
9148 name: "override_app",
9149 base: "app",
9150 package_name: "bar",
9151 }
9152 `),
9153 }))
9154
9155 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
9156 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9157 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9158 }
9159
9160 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
9161 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9162 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9163 }
9164}
9165
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009166func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009167 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009168 apex {
9169 name: "myapex",
9170 key: "myapex.key",
9171 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009172 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009173 }
9174
9175 apex_key {
9176 name: "myapex.key",
9177 public_key: "testkey.avbpubkey",
9178 private_key: "testkey.pem",
9179 }
9180
9181 cc_library {
9182 name: "mylib",
9183 srcs: ["mylib.cpp"],
9184 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009185 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009186 },
9187 apex_available: ["myapex"],
9188 }
9189
9190 cc_prebuilt_library_shared {
9191 name: "mylib",
9192 prefer: false,
9193 srcs: ["prebuilt.so"],
9194 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009195 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009196 },
9197 apex_available: ["myapex"],
9198 }
9199 `)
9200}
9201
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009202func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009203 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009204 apex {
9205 name: "myapex",
9206 key: "myapex.key",
9207 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009208 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009209 }
9210 apex_key {
9211 name: "myapex.key",
9212 public_key: "testkey.avbpubkey",
9213 private_key: "testkey.pem",
9214 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009215 `,
9216 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9217 variables.CompressedApex = proptools.BoolPtr(true)
9218 }),
9219 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009220
9221 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
9222 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9223
9224 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
9225 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9226
9227 // Make sure output of bundle is .capex
9228 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9229 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9230
9231 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009232 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009233 var builder strings.Builder
9234 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9235 androidMk := builder.String()
9236 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9237}
9238
Martin Stjernholm2856c662020-12-02 15:03:42 +00009239func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009240 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009241 apex {
9242 name: "myapex",
9243 key: "myapex.key",
9244 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009245 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009246 }
9247
9248 apex_key {
9249 name: "myapex.key",
9250 public_key: "testkey.avbpubkey",
9251 private_key: "testkey.pem",
9252 }
9253
9254 cc_library {
9255 name: "mylib",
9256 srcs: ["mylib.cpp"],
9257 apex_available: ["myapex"],
9258 shared_libs: ["otherlib"],
9259 system_shared_libs: [],
9260 }
9261
9262 cc_library {
9263 name: "otherlib",
9264 srcs: ["mylib.cpp"],
9265 stubs: {
9266 versions: ["current"],
9267 },
9268 }
9269
9270 cc_prebuilt_library_shared {
9271 name: "otherlib",
9272 prefer: true,
9273 srcs: ["prebuilt.so"],
9274 stubs: {
9275 versions: ["current"],
9276 },
9277 }
9278 `)
9279
9280 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009281 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009282 var builder strings.Builder
9283 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9284 androidMk := builder.String()
9285
9286 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9287 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009288 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009289}
9290
Jiyong Parke3867542020-12-03 17:28:25 +09009291func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009292 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009293 apex {
9294 name: "myapex",
9295 key: "myapex.key",
9296 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009297 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009298 }
9299
9300 apex_key {
9301 name: "myapex.key",
9302 public_key: "testkey.avbpubkey",
9303 private_key: "testkey.pem",
9304 }
9305
9306 cc_library {
9307 name: "mylib",
9308 srcs: ["mylib.cpp"],
9309 system_shared_libs: [],
9310 stl: "none",
9311 apex_available: ["myapex"],
9312 shared_libs: ["mylib2"],
9313 target: {
9314 apex: {
9315 exclude_shared_libs: ["mylib2"],
9316 },
9317 },
9318 }
9319
9320 cc_library {
9321 name: "mylib2",
9322 srcs: ["mylib.cpp"],
9323 system_shared_libs: [],
9324 stl: "none",
9325 }
9326 `)
9327
9328 // Check if mylib is linked to mylib2 for the non-apex target
9329 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9330 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9331
9332 // Make sure that the link doesn't occur for the apex target
9333 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9334 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9335
9336 // It shouldn't appear in the copy cmd as well.
9337 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
9338 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9339}
9340
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009341func TestPrebuiltStubLibDep(t *testing.T) {
9342 bpBase := `
9343 apex {
9344 name: "myapex",
9345 key: "myapex.key",
9346 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009347 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009348 }
9349 apex_key {
9350 name: "myapex.key",
9351 public_key: "testkey.avbpubkey",
9352 private_key: "testkey.pem",
9353 }
9354 cc_library {
9355 name: "mylib",
9356 srcs: ["mylib.cpp"],
9357 apex_available: ["myapex"],
9358 shared_libs: ["stublib"],
9359 system_shared_libs: [],
9360 }
9361 apex {
9362 name: "otherapex",
9363 enabled: %s,
9364 key: "myapex.key",
9365 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009366 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009367 }
9368 `
9369
9370 stublibSourceBp := `
9371 cc_library {
9372 name: "stublib",
9373 srcs: ["mylib.cpp"],
9374 apex_available: ["otherapex"],
9375 system_shared_libs: [],
9376 stl: "none",
9377 stubs: {
9378 versions: ["1"],
9379 },
9380 }
9381 `
9382
9383 stublibPrebuiltBp := `
9384 cc_prebuilt_library_shared {
9385 name: "stublib",
9386 srcs: ["prebuilt.so"],
9387 apex_available: ["otherapex"],
9388 stubs: {
9389 versions: ["1"],
9390 },
9391 %s
9392 }
9393 `
9394
9395 tests := []struct {
9396 name string
9397 stublibBp string
9398 usePrebuilt bool
9399 modNames []string // Modules to collect AndroidMkEntries for
9400 otherApexEnabled []string
9401 }{
9402 {
9403 name: "only_source",
9404 stublibBp: stublibSourceBp,
9405 usePrebuilt: false,
9406 modNames: []string{"stublib"},
9407 otherApexEnabled: []string{"true", "false"},
9408 },
9409 {
9410 name: "source_preferred",
9411 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9412 usePrebuilt: false,
9413 modNames: []string{"stublib", "prebuilt_stublib"},
9414 otherApexEnabled: []string{"true", "false"},
9415 },
9416 {
9417 name: "prebuilt_preferred",
9418 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9419 usePrebuilt: true,
9420 modNames: []string{"stublib", "prebuilt_stublib"},
9421 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9422 },
9423 {
9424 name: "only_prebuilt",
9425 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9426 usePrebuilt: true,
9427 modNames: []string{"stublib"},
9428 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9429 },
9430 }
9431
9432 for _, test := range tests {
9433 t.Run(test.name, func(t *testing.T) {
9434 for _, otherApexEnabled := range test.otherApexEnabled {
9435 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009436 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009437
9438 type modAndMkEntries struct {
9439 mod *cc.Module
9440 mkEntries android.AndroidMkEntries
9441 }
9442 entries := []*modAndMkEntries{}
9443
9444 // Gather shared lib modules that are installable
9445 for _, modName := range test.modNames {
9446 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9447 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9448 continue
9449 }
9450 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009451 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009452 continue
9453 }
Colin Crossaa255532020-07-03 13:18:24 -07009454 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009455 if ent.Disabled {
9456 continue
9457 }
9458 entries = append(entries, &modAndMkEntries{
9459 mod: mod,
9460 mkEntries: ent,
9461 })
9462 }
9463 }
9464 }
9465
9466 var entry *modAndMkEntries = nil
9467 for _, ent := range entries {
9468 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9469 if entry != nil {
9470 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9471 } else {
9472 entry = ent
9473 }
9474 }
9475 }
9476
9477 if entry == nil {
9478 t.Errorf("AndroidMk entry for \"stublib\" missing")
9479 } else {
9480 isPrebuilt := entry.mod.Prebuilt() != nil
9481 if isPrebuilt != test.usePrebuilt {
9482 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9483 }
9484 if !entry.mod.IsStubs() {
9485 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9486 }
9487 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9488 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9489 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009490 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009491 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009492 if !android.InList(expected, cflags) {
9493 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9494 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009495 }
9496 })
9497 }
9498 })
9499 }
9500}
9501
Colin Crossc33e5212021-05-25 18:16:02 -07009502func TestApexJavaCoverage(t *testing.T) {
9503 bp := `
9504 apex {
9505 name: "myapex",
9506 key: "myapex.key",
9507 java_libs: ["mylib"],
9508 bootclasspath_fragments: ["mybootclasspathfragment"],
9509 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9510 updatable: false,
9511 }
9512
9513 apex_key {
9514 name: "myapex.key",
9515 public_key: "testkey.avbpubkey",
9516 private_key: "testkey.pem",
9517 }
9518
9519 java_library {
9520 name: "mylib",
9521 srcs: ["mylib.java"],
9522 apex_available: ["myapex"],
9523 compile_dex: true,
9524 }
9525
9526 bootclasspath_fragment {
9527 name: "mybootclasspathfragment",
9528 contents: ["mybootclasspathlib"],
9529 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009530 hidden_api: {
9531 split_packages: ["*"],
9532 },
Colin Crossc33e5212021-05-25 18:16:02 -07009533 }
9534
9535 java_library {
9536 name: "mybootclasspathlib",
9537 srcs: ["mybootclasspathlib.java"],
9538 apex_available: ["myapex"],
9539 compile_dex: true,
9540 }
9541
9542 systemserverclasspath_fragment {
9543 name: "mysystemserverclasspathfragment",
9544 contents: ["mysystemserverclasspathlib"],
9545 apex_available: ["myapex"],
9546 }
9547
9548 java_library {
9549 name: "mysystemserverclasspathlib",
9550 srcs: ["mysystemserverclasspathlib.java"],
9551 apex_available: ["myapex"],
9552 compile_dex: true,
9553 }
9554 `
9555
9556 result := android.GroupFixturePreparers(
9557 PrepareForTestWithApexBuildComponents,
9558 prepareForTestWithMyapex,
9559 java.PrepareForTestWithJavaDefaultModules,
9560 android.PrepareForTestWithAndroidBuildComponents,
9561 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009562 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9563 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009564 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009565 ).RunTest(t)
9566
9567 // Make sure jacoco ran on both mylib and mybootclasspathlib
9568 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9569 t.Errorf("Failed to find jacoco rule for mylib")
9570 }
9571 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9572 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9573 }
9574 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9575 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9576 }
9577}
9578
Jiyong Park192600a2021-08-03 07:52:17 +00009579func TestProhibitStaticExecutable(t *testing.T) {
9580 testApexError(t, `executable mybin is static`, `
9581 apex {
9582 name: "myapex",
9583 key: "myapex.key",
9584 binaries: ["mybin"],
9585 min_sdk_version: "29",
9586 }
9587
9588 apex_key {
9589 name: "myapex.key",
9590 public_key: "testkey.avbpubkey",
9591 private_key: "testkey.pem",
9592 }
9593
9594 cc_binary {
9595 name: "mybin",
9596 srcs: ["mylib.cpp"],
9597 relative_install_path: "foo/bar",
9598 static_executable: true,
9599 system_shared_libs: [],
9600 stl: "none",
9601 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009602 min_sdk_version: "29",
9603 }
9604 `)
9605
9606 testApexError(t, `executable mybin.rust is static`, `
9607 apex {
9608 name: "myapex",
9609 key: "myapex.key",
9610 binaries: ["mybin.rust"],
9611 min_sdk_version: "29",
9612 }
9613
9614 apex_key {
9615 name: "myapex.key",
9616 public_key: "testkey.avbpubkey",
9617 private_key: "testkey.pem",
9618 }
9619
9620 rust_binary {
9621 name: "mybin.rust",
9622 srcs: ["foo.rs"],
9623 static_executable: true,
9624 apex_available: ["myapex"],
9625 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009626 }
9627 `)
9628}
9629
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009630func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9631 ctx := testApex(t, `
9632 apex {
9633 name: "myapex",
9634 key: "myapex.key",
9635 updatable: false,
9636 java_libs: ["foo"],
9637 }
9638
9639 apex_key {
9640 name: "myapex.key",
9641 public_key: "testkey.avbpubkey",
9642 private_key: "testkey.pem",
9643 }
9644
9645 java_library {
9646 name: "foo",
9647 srcs: ["foo.java"],
9648 apex_available: ["myapex"],
9649 installable: true,
9650 }
9651 `,
9652 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9653 )
9654
9655 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9656 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9657 var builder strings.Builder
9658 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9659 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009660 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex\n")
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009661}
9662
9663func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9664 ctx := testApex(t, `
9665 prebuilt_apex {
9666 name: "myapex",
9667 arch: {
9668 arm64: {
9669 src: "myapex-arm64.apex",
9670 },
9671 arm: {
9672 src: "myapex-arm.apex",
9673 },
9674 },
9675 exported_java_libs: ["foo"],
9676 }
9677
9678 java_import {
9679 name: "foo",
9680 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009681 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009682 }
9683 `,
9684 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9685 )
9686
9687 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9688 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9689 mainModuleEntries := entriesList[0]
9690 android.AssertArrayString(t,
9691 "LOCAL_REQUIRED_MODULES",
9692 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9693 []string{
9694 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9695 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9696 })
9697}
9698
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009699func TestAndroidMk_RequiredModules(t *testing.T) {
9700 ctx := testApex(t, `
9701 apex {
9702 name: "myapex",
9703 key: "myapex.key",
9704 updatable: false,
9705 java_libs: ["foo"],
9706 required: ["otherapex"],
9707 }
9708
9709 apex {
9710 name: "otherapex",
9711 key: "myapex.key",
9712 updatable: false,
9713 java_libs: ["foo"],
9714 required: ["otherapex"],
9715 }
9716
9717 apex_key {
9718 name: "myapex.key",
9719 public_key: "testkey.avbpubkey",
9720 private_key: "testkey.pem",
9721 }
9722
9723 java_library {
9724 name: "foo",
9725 srcs: ["foo.java"],
9726 apex_available: ["myapex", "otherapex"],
9727 installable: true,
9728 }
9729 `)
9730
9731 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9732 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9733 var builder strings.Builder
9734 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9735 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009736 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009737}
9738
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009739func TestAndroidMk_RequiredDeps(t *testing.T) {
9740 ctx := testApex(t, `
9741 apex {
9742 name: "myapex",
9743 key: "myapex.key",
9744 updatable: false,
9745 }
9746
9747 apex_key {
9748 name: "myapex.key",
9749 public_key: "testkey.avbpubkey",
9750 private_key: "testkey.pem",
9751 }
9752 `)
9753
9754 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009755 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009756 data := android.AndroidMkDataForTest(t, ctx, bundle)
9757 var builder strings.Builder
9758 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9759 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009760 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009761}
9762
Jooyung Hana6d36672022-02-24 13:58:07 +09009763func TestApexOutputFileProducer(t *testing.T) {
9764 for _, tc := range []struct {
9765 name string
9766 ref string
9767 expected_data []string
9768 }{
9769 {
9770 name: "test_using_output",
9771 ref: ":myapex",
9772 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9773 },
9774 {
9775 name: "test_using_apex",
9776 ref: ":myapex{.apex}",
9777 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9778 },
9779 } {
9780 t.Run(tc.name, func(t *testing.T) {
9781 ctx := testApex(t, `
9782 apex {
9783 name: "myapex",
9784 key: "myapex.key",
9785 compressible: true,
9786 updatable: false,
9787 }
9788
9789 apex_key {
9790 name: "myapex.key",
9791 public_key: "testkey.avbpubkey",
9792 private_key: "testkey.pem",
9793 }
9794
9795 java_test {
9796 name: "`+tc.name+`",
9797 srcs: ["a.java"],
9798 data: ["`+tc.ref+`"],
9799 }
9800 `,
9801 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9802 variables.CompressedApex = proptools.BoolPtr(true)
9803 }))
9804 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9805 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9806 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9807 })
9808 }
9809}
9810
satayev758968a2021-12-06 11:42:40 +00009811func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9812 preparer := android.GroupFixturePreparers(
9813 PrepareForTestWithApexBuildComponents,
9814 prepareForTestWithMyapex,
9815 java.PrepareForTestWithJavaSdkLibraryFiles,
9816 java.PrepareForTestWithJavaDefaultModules,
9817 android.PrepareForTestWithAndroidBuildComponents,
9818 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9819 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9820 )
9821
9822 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9823 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9824 preparer.RunTestWithBp(t, `
9825 apex {
9826 name: "myapex",
9827 key: "myapex.key",
9828 bootclasspath_fragments: ["mybootclasspathfragment"],
9829 min_sdk_version: "30",
9830 updatable: false,
9831 }
9832
9833 apex_key {
9834 name: "myapex.key",
9835 public_key: "testkey.avbpubkey",
9836 private_key: "testkey.pem",
9837 }
9838
9839 bootclasspath_fragment {
9840 name: "mybootclasspathfragment",
9841 contents: ["mybootclasspathlib"],
9842 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009843 hidden_api: {
9844 split_packages: ["*"],
9845 },
satayev758968a2021-12-06 11:42:40 +00009846 }
9847
9848 java_sdk_library {
9849 name: "mybootclasspathlib",
9850 srcs: ["mybootclasspathlib.java"],
9851 apex_available: ["myapex"],
9852 compile_dex: true,
9853 unsafe_ignore_missing_latest_api: true,
9854 min_sdk_version: "31",
9855 static_libs: ["util"],
9856 }
9857
9858 java_library {
9859 name: "util",
9860 srcs: ["a.java"],
9861 apex_available: ["myapex"],
9862 min_sdk_version: "31",
9863 static_libs: ["another_util"],
9864 }
9865
9866 java_library {
9867 name: "another_util",
9868 srcs: ["a.java"],
9869 min_sdk_version: "31",
9870 apex_available: ["myapex"],
9871 }
9872 `)
9873 })
9874
9875 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9876 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9877 preparer.RunTestWithBp(t, `
9878 apex {
9879 name: "myapex",
9880 key: "myapex.key",
9881 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9882 min_sdk_version: "30",
9883 updatable: false,
9884 }
9885
9886 apex_key {
9887 name: "myapex.key",
9888 public_key: "testkey.avbpubkey",
9889 private_key: "testkey.pem",
9890 }
9891
9892 systemserverclasspath_fragment {
9893 name: "mysystemserverclasspathfragment",
9894 contents: ["mysystemserverclasspathlib"],
9895 apex_available: ["myapex"],
9896 }
9897
9898 java_sdk_library {
9899 name: "mysystemserverclasspathlib",
9900 srcs: ["mysystemserverclasspathlib.java"],
9901 apex_available: ["myapex"],
9902 compile_dex: true,
9903 min_sdk_version: "32",
9904 unsafe_ignore_missing_latest_api: true,
9905 static_libs: ["util"],
9906 }
9907
9908 java_library {
9909 name: "util",
9910 srcs: ["a.java"],
9911 apex_available: ["myapex"],
9912 min_sdk_version: "31",
9913 static_libs: ["another_util"],
9914 }
9915
9916 java_library {
9917 name: "another_util",
9918 srcs: ["a.java"],
9919 min_sdk_version: "31",
9920 apex_available: ["myapex"],
9921 }
9922 `)
9923 })
9924
9925 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9926 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9927 RunTestWithBp(t, `
9928 apex {
9929 name: "myapex",
9930 key: "myapex.key",
9931 bootclasspath_fragments: ["mybootclasspathfragment"],
9932 min_sdk_version: "30",
9933 updatable: false,
9934 }
9935
9936 apex_key {
9937 name: "myapex.key",
9938 public_key: "testkey.avbpubkey",
9939 private_key: "testkey.pem",
9940 }
9941
9942 bootclasspath_fragment {
9943 name: "mybootclasspathfragment",
9944 contents: ["mybootclasspathlib"],
9945 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009946 hidden_api: {
9947 split_packages: ["*"],
9948 },
satayev758968a2021-12-06 11:42:40 +00009949 }
9950
9951 java_sdk_library {
9952 name: "mybootclasspathlib",
9953 srcs: ["mybootclasspathlib.java"],
9954 apex_available: ["myapex"],
9955 compile_dex: true,
9956 unsafe_ignore_missing_latest_api: true,
9957 }
9958 `)
9959 })
9960
9961 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9962 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9963 RunTestWithBp(t, `
9964 apex {
9965 name: "myapex",
9966 key: "myapex.key",
9967 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9968 min_sdk_version: "30",
9969 updatable: false,
9970 }
9971
9972 apex_key {
9973 name: "myapex.key",
9974 public_key: "testkey.avbpubkey",
9975 private_key: "testkey.pem",
9976 }
9977
9978 systemserverclasspath_fragment {
9979 name: "mysystemserverclasspathfragment",
9980 contents: ["mysystemserverclasspathlib"],
9981 apex_available: ["myapex"],
9982 }
9983
9984 java_sdk_library {
9985 name: "mysystemserverclasspathlib",
9986 srcs: ["mysystemserverclasspathlib.java"],
9987 apex_available: ["myapex"],
9988 compile_dex: true,
9989 unsafe_ignore_missing_latest_api: true,
9990 }
9991 `)
9992 })
9993}
9994
Jiakai Zhang6decef92022-01-12 17:56:19 +00009995// Verifies that the APEX depends on all the Make modules in the list.
9996func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9997 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9998 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009999 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010000 }
10001}
10002
10003// Verifies that the APEX does not depend on any of the Make modules in the list.
10004func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10005 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10006 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010007 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010008 }
10009}
10010
Cole Faust1021ccd2023-02-26 21:15:25 -080010011// TODO(b/193460475): Re-enable this test
10012//func TestApexStrictUpdtabilityLint(t *testing.T) {
10013// bpTemplate := `
10014// apex {
10015// name: "myapex",
10016// key: "myapex.key",
10017// java_libs: ["myjavalib"],
10018// updatable: %v,
10019// min_sdk_version: "29",
10020// }
10021// apex_key {
10022// name: "myapex.key",
10023// }
10024// java_library {
10025// name: "myjavalib",
10026// srcs: ["MyClass.java"],
10027// apex_available: [ "myapex" ],
10028// lint: {
10029// strict_updatability_linting: %v,
10030// },
10031// sdk_version: "current",
10032// min_sdk_version: "29",
10033// }
10034// `
10035// fs := android.MockFS{
10036// "lint-baseline.xml": nil,
10037// }
10038//
10039// testCases := []struct {
10040// testCaseName string
10041// apexUpdatable bool
10042// javaStrictUpdtabilityLint bool
10043// lintFileExists bool
10044// disallowedFlagExpected bool
10045// }{
10046// {
10047// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10048// apexUpdatable: true,
10049// javaStrictUpdtabilityLint: true,
10050// lintFileExists: false,
10051// disallowedFlagExpected: false,
10052// },
10053// {
10054// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10055// apexUpdatable: false,
10056// javaStrictUpdtabilityLint: false,
10057// lintFileExists: true,
10058// disallowedFlagExpected: false,
10059// },
10060// {
10061// testCaseName: "non-updatable apex respects strict updatability of javalib",
10062// apexUpdatable: false,
10063// javaStrictUpdtabilityLint: true,
10064// lintFileExists: true,
10065// disallowedFlagExpected: true,
10066// },
10067// {
10068// testCaseName: "updatable apex sets strict updatability of javalib to true",
10069// apexUpdatable: true,
10070// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10071// lintFileExists: true,
10072// disallowedFlagExpected: true,
10073// },
10074// }
10075//
10076// for _, testCase := range testCases {
10077// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10078// fixtures := []android.FixturePreparer{}
10079// if testCase.lintFileExists {
10080// fixtures = append(fixtures, fs.AddToFixture())
10081// }
10082//
10083// result := testApex(t, bp, fixtures...)
10084// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10085// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10086// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10087//
10088// if disallowedFlagActual != testCase.disallowedFlagExpected {
10089// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10090// }
10091// }
10092//}
10093//
10094//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10095// bp := `
10096// apex {
10097// name: "myapex",
10098// key: "myapex.key",
10099// java_libs: ["myjavalib"],
10100// updatable: true,
10101// min_sdk_version: "29",
10102// }
10103// apex_key {
10104// name: "myapex.key",
10105// }
10106// java_library {
10107// name: "myjavalib",
10108// srcs: ["MyClass.java"],
10109// apex_available: [ "myapex" ],
10110// sdk_version: "current",
10111// min_sdk_version: "29",
10112// }
10113// `
10114//
10115// testCases := []struct {
10116// testCaseName string
10117// moduleDirectory string
10118// disallowedFlagExpected bool
10119// }{
10120// {
10121// testCaseName: "lintable module defined outside libcore",
10122// moduleDirectory: "",
10123// disallowedFlagExpected: true,
10124// },
10125// {
10126// testCaseName: "lintable module defined in libcore root directory",
10127// moduleDirectory: "libcore/",
10128// disallowedFlagExpected: false,
10129// },
10130// {
10131// testCaseName: "lintable module defined in libcore child directory",
10132// moduleDirectory: "libcore/childdir/",
10133// disallowedFlagExpected: true,
10134// },
10135// }
10136//
10137// for _, testCase := range testCases {
10138// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10139// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10140// result := testApex(t, "", lintFileCreator, bpFileCreator)
10141// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10142// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10143// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10144// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10145//
10146// if disallowedFlagActual != testCase.disallowedFlagExpected {
10147// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10148// }
10149// }
10150//}
10151//
10152//// checks transtive deps of an apex coming from bootclasspath_fragment
10153//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10154// bp := `
10155// apex {
10156// name: "myapex",
10157// key: "myapex.key",
10158// bootclasspath_fragments: ["mybootclasspathfragment"],
10159// updatable: true,
10160// min_sdk_version: "29",
10161// }
10162// apex_key {
10163// name: "myapex.key",
10164// }
10165// bootclasspath_fragment {
10166// name: "mybootclasspathfragment",
10167// contents: ["myjavalib"],
10168// apex_available: ["myapex"],
10169// hidden_api: {
10170// split_packages: ["*"],
10171// },
10172// }
10173// java_library {
10174// name: "myjavalib",
10175// srcs: ["MyClass.java"],
10176// apex_available: [ "myapex" ],
10177// sdk_version: "current",
10178// min_sdk_version: "29",
10179// compile_dex: true,
10180// }
10181// `
10182// fs := android.MockFS{
10183// "lint-baseline.xml": nil,
10184// }
10185//
10186// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10187// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10188// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10189// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10190// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10191// }
10192//}
Spandan Das66773252022-01-15 00:23:18 +000010193
Spandan Das42e89502022-05-06 22:12:55 +000010194// updatable apexes should propagate updatable=true to its apps
10195func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10196 bp := `
10197 apex {
10198 name: "myapex",
10199 key: "myapex.key",
10200 updatable: %v,
10201 apps: [
10202 "myapp",
10203 ],
10204 min_sdk_version: "30",
10205 }
10206 apex_key {
10207 name: "myapex.key",
10208 }
10209 android_app {
10210 name: "myapp",
10211 updatable: %v,
10212 apex_available: [
10213 "myapex",
10214 ],
10215 sdk_version: "current",
10216 min_sdk_version: "30",
10217 }
10218 `
10219 testCases := []struct {
10220 name string
10221 apex_is_updatable_bp bool
10222 app_is_updatable_bp bool
10223 app_is_updatable_expected bool
10224 }{
10225 {
10226 name: "Non-updatable apex respects updatable property of non-updatable app",
10227 apex_is_updatable_bp: false,
10228 app_is_updatable_bp: false,
10229 app_is_updatable_expected: false,
10230 },
10231 {
10232 name: "Non-updatable apex respects updatable property of updatable app",
10233 apex_is_updatable_bp: false,
10234 app_is_updatable_bp: true,
10235 app_is_updatable_expected: true,
10236 },
10237 {
10238 name: "Updatable apex respects updatable property of updatable app",
10239 apex_is_updatable_bp: true,
10240 app_is_updatable_bp: true,
10241 app_is_updatable_expected: true,
10242 },
10243 {
10244 name: "Updatable apex sets updatable=true on non-updatable app",
10245 apex_is_updatable_bp: true,
10246 app_is_updatable_bp: false,
10247 app_is_updatable_expected: true,
10248 },
10249 }
10250 for _, testCase := range testCases {
10251 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10252 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10253 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10254 }
10255}
10256
Kiyoung Kim487689e2022-07-26 09:48:22 +090010257func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10258 bp := `
10259 apex {
10260 name: "myapex",
10261 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010262 native_shared_libs: ["libbaz"],
10263 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010264 min_sdk_version: "29",
10265 }
10266 apex_key {
10267 name: "myapex.key",
10268 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010269 cc_binary {
10270 name: "binfoo",
10271 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010272 apex_available: ["myapex"],
10273 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010274 recovery_available: false,
10275 }
10276 cc_library {
10277 name: "libbar",
10278 srcs: ["libbar.cc"],
10279 stubs: {
10280 symbol_file: "libbar.map.txt",
10281 versions: [
10282 "29",
10283 ],
10284 },
10285 }
10286 cc_library {
10287 name: "libbaz",
10288 srcs: ["libbaz.cc"],
10289 apex_available: ["myapex"],
10290 min_sdk_version: "29",
10291 stubs: {
10292 symbol_file: "libbaz.map.txt",
10293 versions: [
10294 "29",
10295 ],
10296 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010297 }
10298 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010299 name: "libbar",
10300 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010301 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010302 variants: ["apex.29"],
10303 }
10304 cc_api_variant {
10305 name: "libbar",
10306 variant: "apex",
10307 version: "29",
10308 src: "libbar_apex_29.so",
10309 }
10310 cc_api_library {
10311 name: "libbaz",
10312 src: "libbaz_stub.so",
10313 min_sdk_version: "29",
10314 variants: ["apex.29"],
10315 }
10316 cc_api_variant {
10317 name: "libbaz",
10318 variant: "apex",
10319 version: "29",
10320 src: "libbaz_apex_29.so",
10321 }
10322 cc_api_library {
10323 name: "libqux",
10324 src: "libqux_stub.so",
10325 min_sdk_version: "29",
10326 variants: ["apex.29"],
10327 }
10328 cc_api_variant {
10329 name: "libqux",
10330 variant: "apex",
10331 version: "29",
10332 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010333 }
10334 api_imports {
10335 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010336 apex_shared_libs: [
10337 "libbar",
10338 "libbaz",
10339 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010340 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010341 }
10342 `
10343 result := testApex(t, bp)
10344
10345 hasDep := func(m android.Module, wantDep android.Module) bool {
10346 t.Helper()
10347 var found bool
10348 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10349 if dep == wantDep {
10350 found = true
10351 }
10352 })
10353 return found
10354 }
10355
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010356 // Library defines stubs and cc_api_library should be used with cc_api_library
10357 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10358 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10359 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010360
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010361 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10362 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010363
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010364 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10365 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10366 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10367 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10368
10369 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10370 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10371 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10372 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10373 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10374
10375 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10376 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10377 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10378
10379 // cc_api_library defined without original library should be linked with cc_api_library
10380 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10381 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10382 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10383}
10384
10385func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10386 bp := `
10387 apex {
10388 name: "myapex",
10389 key: "myapex.key",
10390 native_shared_libs: ["libbar"],
10391 min_sdk_version: "29",
10392 }
10393 apex_key {
10394 name: "myapex.key",
10395 }
10396 cc_binary {
10397 name: "binfoo",
10398 shared_libs: ["libbar"],
10399 recovery_available: false,
10400 }
10401 cc_library {
10402 name: "libbar",
10403 srcs: ["libbar.cc"],
10404 apex_available: ["myapex"],
10405 min_sdk_version: "29",
10406 stubs: {
10407 symbol_file: "libbar.map.txt",
10408 versions: [
10409 "29",
10410 ],
10411 },
10412 }
10413 cc_api_library {
10414 name: "libbar",
10415 src: "libbar_stub.so",
10416 variants: ["apex.29"],
10417 }
10418 cc_api_variant {
10419 name: "libbar",
10420 variant: "apex",
10421 version: "29",
10422 src: "libbar_apex_29.so",
10423 }
10424 api_imports {
10425 name: "api_imports",
10426 apex_shared_libs: [
10427 "libbar",
10428 ],
10429 }
10430 `
10431
10432 result := testApex(t, bp)
10433
10434 hasDep := func(m android.Module, wantDep android.Module) bool {
10435 t.Helper()
10436 var found bool
10437 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10438 if dep == wantDep {
10439 found = true
10440 }
10441 })
10442 return found
10443 }
10444
10445 // Library defines stubs and cc_api_library should be used with cc_api_library
10446 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10447 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10448 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10449
10450 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10451 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10452
10453 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10454 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10455 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10456 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010457}
Dennis Shend4f5d932023-01-31 20:27:21 +000010458
10459func TestTrimmedApex(t *testing.T) {
10460 bp := `
10461 apex {
10462 name: "myapex",
10463 key: "myapex.key",
10464 native_shared_libs: ["libfoo","libbaz"],
10465 min_sdk_version: "29",
10466 trim_against: "mydcla",
10467 }
10468 apex {
10469 name: "mydcla",
10470 key: "myapex.key",
10471 native_shared_libs: ["libfoo","libbar"],
10472 min_sdk_version: "29",
10473 file_contexts: ":myapex-file_contexts",
10474 dynamic_common_lib_apex: true,
10475 }
10476 apex_key {
10477 name: "myapex.key",
10478 }
10479 cc_library {
10480 name: "libfoo",
10481 shared_libs: ["libc"],
10482 apex_available: ["myapex","mydcla"],
10483 min_sdk_version: "29",
10484 }
10485 cc_library {
10486 name: "libbar",
10487 shared_libs: ["libc"],
10488 apex_available: ["myapex","mydcla"],
10489 min_sdk_version: "29",
10490 }
10491 cc_library {
10492 name: "libbaz",
10493 shared_libs: ["libc"],
10494 apex_available: ["myapex","mydcla"],
10495 min_sdk_version: "29",
10496 }
10497 cc_api_library {
10498 name: "libc",
10499 src: "libc.so",
10500 min_sdk_version: "29",
10501 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010502 vendor_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010503 }
10504 api_imports {
10505 name: "api_imports",
10506 shared_libs: [
10507 "libc",
10508 ],
10509 header_libs: [],
10510 }
10511 `
10512 ctx := testApex(t, bp)
10513 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10514 apexRule := module.MaybeRule("apexRule")
10515 if apexRule.Rule == nil {
10516 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10517 }
10518
10519 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
10520 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
10521 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10522 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10523 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10524 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10525}
Jingwen Chendea7a642023-03-28 11:30:50 +000010526
10527func TestCannedFsConfig(t *testing.T) {
10528 ctx := testApex(t, `
10529 apex {
10530 name: "myapex",
10531 key: "myapex.key",
10532 updatable: false,
10533 }
10534
10535 apex_key {
10536 name: "myapex.key",
10537 public_key: "testkey.avbpubkey",
10538 private_key: "testkey.pem",
10539 }`)
10540 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10541 generateFsRule := mod.Rule("generateFsConfig")
10542 cmd := generateFsRule.RuleParams.Command
10543
10544 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10545}
10546
10547func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10548 ctx := testApex(t, `
10549 apex {
10550 name: "myapex",
10551 key: "myapex.key",
10552 canned_fs_config: "my_config",
10553 updatable: false,
10554 }
10555
10556 apex_key {
10557 name: "myapex.key",
10558 public_key: "testkey.avbpubkey",
10559 private_key: "testkey.pem",
10560 }`)
10561 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10562 generateFsRule := mod.Rule("generateFsConfig")
10563 cmd := generateFsRule.RuleParams.Command
10564
10565 // Ensure that canned_fs_config has "cat my_config" at the end
10566 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10567}
Spandan Das20fce2d2023-04-12 17:21:39 +000010568
10569func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10570 testCases := []struct {
10571 desc string
10572 hasStubs bool
10573 apexAvailable string
10574 expectedError string
10575 }{
10576 {
10577 desc: "non-stub library can have multiple apex_available",
10578 hasStubs: false,
10579 apexAvailable: `["myapex", "otherapex"]`,
10580 },
10581 {
10582 desc: "stub library should not be available to anyapex",
10583 hasStubs: true,
10584 apexAvailable: `["//apex_available:anyapex"]`,
10585 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10586 },
10587 {
10588 desc: "stub library should not be available to multiple apexes",
10589 hasStubs: true,
10590 apexAvailable: `["myapex", "otherapex"]`,
10591 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10592 },
10593 {
10594 desc: "stub library can be available to a core apex and a test apex",
10595 hasStubs: true,
10596 apexAvailable: `["myapex", "test_myapex"]`,
10597 },
10598 }
10599 bpTemplate := `
10600 cc_library {
10601 name: "libfoo",
10602 %v
10603 apex_available: %v,
10604 }
10605 apex {
10606 name: "myapex",
10607 key: "apex.key",
10608 updatable: false,
10609 native_shared_libs: ["libfoo"],
10610 }
10611 apex {
10612 name: "otherapex",
10613 key: "apex.key",
10614 updatable: false,
10615 }
10616 apex_test {
10617 name: "test_myapex",
10618 key: "apex.key",
10619 updatable: false,
10620 native_shared_libs: ["libfoo"],
10621 }
10622 apex_key {
10623 name: "apex.key",
10624 }
10625 `
10626 for _, tc := range testCases {
10627 stubs := ""
10628 if tc.hasStubs {
10629 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10630 }
10631 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10632 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10633 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10634 })
10635 if tc.expectedError == "" {
10636 testApex(t, bp, mockFsFixturePreparer)
10637 } else {
10638 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10639 }
10640 }
10641}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010642
10643func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10644 context := android.GroupFixturePreparers(
10645 android.PrepareForIntegrationTestWithAndroid,
10646 cc.PrepareForIntegrationTestWithCc,
10647 PrepareForTestWithApexBuildComponents,
10648 prepareForTestWithMyapex,
10649 filesystem.PrepareForTestWithFilesystemBuildComponents,
10650 )
10651 result := context.RunTestWithBp(t, `
10652 android_system_image {
10653 name: "myfilesystem",
10654 deps: [
10655 "libfoo",
10656 ],
10657 linker_config_src: "linker.config.json",
10658 }
10659
10660 cc_library {
10661 name: "libfoo",
10662 shared_libs: [
10663 "libbar",
10664 ],
10665 stl: "none",
10666 }
10667
10668 cc_library {
10669 name: "libbar",
10670 stl: "none",
10671 apex_available: ["myapex"],
10672 }
10673
10674 apex {
10675 name: "myapex",
10676 native_shared_libs: ["libbar"],
10677 key: "myapex.key",
10678 updatable: false,
10679 }
10680
10681 apex_key {
10682 name: "myapex.key",
10683 public_key: "testkey.avbpubkey",
10684 private_key: "testkey.pem",
10685 }
10686 `)
10687
10688 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10689 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10690 inputs.Strings(),
10691 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10692}