blob: 8368db154cf562cd4cb64501f80db23db707e328 [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
Alex Light5098a612018-11-29 17:12:15 -0800822func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800823 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800824 apex {
825 name: "myapex",
826 key: "myapex.key",
827 payload_type: "zip",
828 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000829 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800830 }
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"],
842 system_shared_libs: [],
843 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000844 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800845 }
846
847 cc_library {
848 name: "mylib2",
849 srcs: ["mylib.cpp"],
850 system_shared_libs: [],
851 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000852 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800853 }
854 `)
855
Sundong Ahnabb64432019-10-22 13:58:29 +0900856 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800857 copyCmds := zipApexRule.Args["copy_commands"]
858
859 // Ensure that main rule creates an output
860 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
861
862 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700863 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800864
865 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700866 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800867
868 // Ensure that both direct and indirect deps are copied into apex
869 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
870 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900871}
872
873func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800874 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900875 apex {
876 name: "myapex",
877 key: "myapex.key",
878 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900879 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000880 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900881 }
882
883 apex_key {
884 name: "myapex.key",
885 public_key: "testkey.avbpubkey",
886 private_key: "testkey.pem",
887 }
888
889 cc_library {
890 name: "mylib",
891 srcs: ["mylib.cpp"],
892 shared_libs: ["mylib2", "mylib3"],
893 system_shared_libs: [],
894 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000895 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900896 }
897
898 cc_library {
899 name: "mylib2",
900 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900901 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900902 system_shared_libs: [],
903 stl: "none",
904 stubs: {
905 versions: ["1", "2", "3"],
906 },
907 }
908
909 cc_library {
910 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900911 srcs: ["mylib.cpp"],
912 shared_libs: ["mylib4"],
913 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900914 stl: "none",
915 stubs: {
916 versions: ["10", "11", "12"],
917 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000918 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900920
921 cc_library {
922 name: "mylib4",
923 srcs: ["mylib.cpp"],
924 system_shared_libs: [],
925 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000926 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900927 }
Jiyong Park105dc322021-06-11 17:22:09 +0900928
929 rust_binary {
930 name: "foo.rust",
931 srcs: ["foo.rs"],
932 shared_libs: ["libfoo.shared_from_rust"],
933 prefer_rlib: true,
934 apex_available: ["myapex"],
935 }
936
937 cc_library_shared {
938 name: "libfoo.shared_from_rust",
939 srcs: ["mylib.cpp"],
940 system_shared_libs: [],
941 stl: "none",
942 stubs: {
943 versions: ["10", "11", "12"],
944 },
945 }
946
Jiyong Park25fc6a92018-11-18 18:02:45 +0900947 `)
948
Sundong Ahnabb64432019-10-22 13:58:29 +0900949 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900950 copyCmds := apexRule.Args["copy_commands"]
951
952 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800953 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900954
955 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800956 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900957
958 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800959 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900960
Colin Crossaede88c2020-08-11 12:17:01 -0700961 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900962
963 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900964 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900965 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900966 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900967
968 // 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 -0700969 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900970 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700971 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900972
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700973 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
974 // is replaced by sharing of "cFlags" in cc/builder.go.
975 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
976 // module variable representing "cflags". So it was not detected by ensureNotContains.
977 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
978 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
979 // including the original cflags's "-include mylib.h".
980 //
Jiyong Park64379952018-12-13 18:37:29 +0900981 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700982 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
983 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900984
Jiyong Park85cc35a2022-07-17 11:30:47 +0900985 // Ensure that genstub for platform-provided lib is invoked with --systemapi
986 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
987 // Ensure that genstub for apex-provided lib is invoked with --apex
988 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900989
Jooyung Hana57af4a2020-01-23 05:36:59 +0000990 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900991 "lib64/mylib.so",
992 "lib64/mylib3.so",
993 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900994 "bin/foo.rust",
995 "lib64/libc++.so", // by the implicit dependency from foo.rust
996 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900997 })
Jiyong Park105dc322021-06-11 17:22:09 +0900998
999 // Ensure that stub dependency from a rust module is not included
1000 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1001 // The rust module is linked to the stub cc library
Peter Collingbournee7c71c32023-03-31 20:21:19 -07001002 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001003 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1004 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001005
1006 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1007 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001008}
1009
Jiyong Park1bc84122021-06-22 20:23:05 +09001010func TestApexCanUsePrivateApis(t *testing.T) {
1011 ctx := testApex(t, `
1012 apex {
1013 name: "myapex",
1014 key: "myapex.key",
1015 native_shared_libs: ["mylib"],
1016 binaries: ["foo.rust"],
1017 updatable: false,
1018 platform_apis: true,
1019 }
1020
1021 apex_key {
1022 name: "myapex.key",
1023 public_key: "testkey.avbpubkey",
1024 private_key: "testkey.pem",
1025 }
1026
1027 cc_library {
1028 name: "mylib",
1029 srcs: ["mylib.cpp"],
1030 shared_libs: ["mylib2"],
1031 system_shared_libs: [],
1032 stl: "none",
1033 apex_available: [ "myapex" ],
1034 }
1035
1036 cc_library {
1037 name: "mylib2",
1038 srcs: ["mylib.cpp"],
1039 cflags: ["-include mylib.h"],
1040 system_shared_libs: [],
1041 stl: "none",
1042 stubs: {
1043 versions: ["1", "2", "3"],
1044 },
1045 }
1046
1047 rust_binary {
1048 name: "foo.rust",
1049 srcs: ["foo.rs"],
1050 shared_libs: ["libfoo.shared_from_rust"],
1051 prefer_rlib: true,
1052 apex_available: ["myapex"],
1053 }
1054
1055 cc_library_shared {
1056 name: "libfoo.shared_from_rust",
1057 srcs: ["mylib.cpp"],
1058 system_shared_libs: [],
1059 stl: "none",
1060 stubs: {
1061 versions: ["10", "11", "12"],
1062 },
1063 }
1064 `)
1065
1066 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1067 copyCmds := apexRule.Args["copy_commands"]
1068
1069 // Ensure that indirect stubs dep is not included
1070 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1071 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1072
1073 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1074 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001075 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001076 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1077 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Peter Collingbournee7c71c32023-03-31 20:21:19 -07001078 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001079 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1080 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1081}
1082
Colin Cross7812fd32020-09-25 12:35:10 -07001083func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1084 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001085 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001086 apex {
1087 name: "myapex",
1088 key: "myapex.key",
1089 native_shared_libs: ["mylib", "mylib3"],
1090 min_sdk_version: "29",
1091 }
1092
1093 apex_key {
1094 name: "myapex.key",
1095 public_key: "testkey.avbpubkey",
1096 private_key: "testkey.pem",
1097 }
1098
1099 cc_library {
1100 name: "mylib",
1101 srcs: ["mylib.cpp"],
1102 shared_libs: ["mylib2", "mylib3"],
1103 system_shared_libs: [],
1104 stl: "none",
1105 apex_available: [ "myapex" ],
1106 min_sdk_version: "28",
1107 }
1108
1109 cc_library {
1110 name: "mylib2",
1111 srcs: ["mylib.cpp"],
1112 cflags: ["-include mylib.h"],
1113 system_shared_libs: [],
1114 stl: "none",
1115 stubs: {
1116 versions: ["28", "29", "30", "current"],
1117 },
1118 min_sdk_version: "28",
1119 }
1120
1121 cc_library {
1122 name: "mylib3",
1123 srcs: ["mylib.cpp"],
1124 shared_libs: ["mylib4"],
1125 system_shared_libs: [],
1126 stl: "none",
1127 stubs: {
1128 versions: ["28", "29", "30", "current"],
1129 },
1130 apex_available: [ "myapex" ],
1131 min_sdk_version: "28",
1132 }
1133
1134 cc_library {
1135 name: "mylib4",
1136 srcs: ["mylib.cpp"],
1137 system_shared_libs: [],
1138 stl: "none",
1139 apex_available: [ "myapex" ],
1140 min_sdk_version: "28",
1141 }
1142 `)
1143
1144 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1145 copyCmds := apexRule.Args["copy_commands"]
1146
1147 // Ensure that direct non-stubs dep is always included
1148 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1149
1150 // Ensure that indirect stubs dep is not included
1151 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1152
1153 // Ensure that direct stubs dep is included
1154 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1155
1156 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1157
Jiyong Park55549df2021-02-26 23:57:23 +09001158 // Ensure that mylib is linking with the latest version of stub for mylib2
1159 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001160 // ... and not linking to the non-stub (impl) variant of mylib2
1161 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1162
1163 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1164 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1165 // .. and not linking to the stubs variant of mylib3
1166 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1167
1168 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001169 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001170 ensureNotContains(t, mylib2Cflags, "-include ")
1171
Jiyong Park85cc35a2022-07-17 11:30:47 +09001172 // Ensure that genstub is invoked with --systemapi
1173 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001174
1175 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1176 "lib64/mylib.so",
1177 "lib64/mylib3.so",
1178 "lib64/mylib4.so",
1179 })
1180}
1181
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001182func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1183 t.Parallel()
1184 // myapex (Z)
1185 // mylib -----------------.
1186 // |
1187 // otherapex (29) |
1188 // libstub's versions: 29 Z current
1189 // |
1190 // <platform> |
1191 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001192 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001193 apex {
1194 name: "myapex",
1195 key: "myapex.key",
1196 native_shared_libs: ["mylib"],
1197 min_sdk_version: "Z", // non-final
1198 }
1199
1200 cc_library {
1201 name: "mylib",
1202 srcs: ["mylib.cpp"],
1203 shared_libs: ["libstub"],
1204 apex_available: ["myapex"],
1205 min_sdk_version: "Z",
1206 }
1207
1208 apex_key {
1209 name: "myapex.key",
1210 public_key: "testkey.avbpubkey",
1211 private_key: "testkey.pem",
1212 }
1213
1214 apex {
1215 name: "otherapex",
1216 key: "myapex.key",
1217 native_shared_libs: ["libstub"],
1218 min_sdk_version: "29",
1219 }
1220
1221 cc_library {
1222 name: "libstub",
1223 srcs: ["mylib.cpp"],
1224 stubs: {
1225 versions: ["29", "Z", "current"],
1226 },
1227 apex_available: ["otherapex"],
1228 min_sdk_version: "29",
1229 }
1230
1231 // platform module depending on libstub from otherapex should use the latest stub("current")
1232 cc_library {
1233 name: "libplatform",
1234 srcs: ["mylib.cpp"],
1235 shared_libs: ["libstub"],
1236 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001237 `,
1238 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1239 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1240 variables.Platform_sdk_final = proptools.BoolPtr(false)
1241 variables.Platform_version_active_codenames = []string{"Z"}
1242 }),
1243 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001244
Jiyong Park55549df2021-02-26 23:57:23 +09001245 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001246 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001247 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001248 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001249 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001250
1251 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1252 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1253 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1254 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1255 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1256}
1257
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001258func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001259 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001260 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001261 name: "myapex2",
1262 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001263 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001264 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001265 }
1266
1267 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001268 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001269 public_key: "testkey.avbpubkey",
1270 private_key: "testkey.pem",
1271 }
1272
1273 cc_library {
1274 name: "mylib",
1275 srcs: ["mylib.cpp"],
1276 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001277 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001278 system_shared_libs: [],
1279 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001280 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001281 }
1282
1283 cc_library {
1284 name: "libfoo",
1285 srcs: ["mylib.cpp"],
1286 shared_libs: ["libbar"],
1287 system_shared_libs: [],
1288 stl: "none",
1289 stubs: {
1290 versions: ["10", "20", "30"],
1291 },
1292 }
1293
1294 cc_library {
1295 name: "libbar",
1296 srcs: ["mylib.cpp"],
1297 system_shared_libs: [],
1298 stl: "none",
1299 }
1300
Jiyong Park678c8812020-02-07 17:25:49 +09001301 cc_library_static {
1302 name: "libbaz",
1303 srcs: ["mylib.cpp"],
1304 system_shared_libs: [],
1305 stl: "none",
1306 apex_available: [ "myapex2" ],
1307 }
1308
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001309 `)
1310
Jiyong Park83dc74b2020-01-14 18:38:44 +09001311 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001312 copyCmds := apexRule.Args["copy_commands"]
1313
1314 // Ensure that direct non-stubs dep is always included
1315 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1316
1317 // Ensure that indirect stubs dep is not included
1318 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1319
1320 // Ensure that dependency of stubs is not included
1321 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1322
Colin Crossaede88c2020-08-11 12:17:01 -07001323 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001324
1325 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001326 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001327 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001328 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001329
Jiyong Park3ff16992019-12-27 14:11:47 +09001330 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001331
1332 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1333 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001334
Artur Satayeva8bd1132020-04-27 18:07:06 +01001335 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001336 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001337
Artur Satayeva8bd1132020-04-27 18:07:06 +01001338 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001339 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001340}
1341
Jooyung Hand3639552019-08-09 12:57:43 +09001342func TestApexWithRuntimeLibsDependency(t *testing.T) {
1343 /*
1344 myapex
1345 |
1346 v (runtime_libs)
1347 mylib ------+------> libfoo [provides stub]
1348 |
1349 `------> libbar
1350 */
Colin Cross1c460562021-02-16 17:55:47 -08001351 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001352 apex {
1353 name: "myapex",
1354 key: "myapex.key",
1355 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001356 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001357 }
1358
1359 apex_key {
1360 name: "myapex.key",
1361 public_key: "testkey.avbpubkey",
1362 private_key: "testkey.pem",
1363 }
1364
1365 cc_library {
1366 name: "mylib",
1367 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001368 static_libs: ["libstatic"],
1369 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001370 runtime_libs: ["libfoo", "libbar"],
1371 system_shared_libs: [],
1372 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001373 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001374 }
1375
1376 cc_library {
1377 name: "libfoo",
1378 srcs: ["mylib.cpp"],
1379 system_shared_libs: [],
1380 stl: "none",
1381 stubs: {
1382 versions: ["10", "20", "30"],
1383 },
1384 }
1385
1386 cc_library {
1387 name: "libbar",
1388 srcs: ["mylib.cpp"],
1389 system_shared_libs: [],
1390 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001391 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001392 }
1393
Liz Kammer5f108fa2023-05-11 14:33:17 -04001394 cc_library {
1395 name: "libstatic",
1396 srcs: ["mylib.cpp"],
1397 system_shared_libs: [],
1398 stl: "none",
1399 apex_available: [ "myapex" ],
1400 runtime_libs: ["libstatic_to_runtime"],
1401 }
1402
1403 cc_library {
1404 name: "libshared",
1405 srcs: ["mylib.cpp"],
1406 system_shared_libs: [],
1407 stl: "none",
1408 apex_available: [ "myapex" ],
1409 runtime_libs: ["libshared_to_runtime"],
1410 }
1411
1412 cc_library {
1413 name: "libstatic_to_runtime",
1414 srcs: ["mylib.cpp"],
1415 system_shared_libs: [],
1416 stl: "none",
1417 apex_available: [ "myapex" ],
1418 }
1419
1420 cc_library {
1421 name: "libshared_to_runtime",
1422 srcs: ["mylib.cpp"],
1423 system_shared_libs: [],
1424 stl: "none",
1425 apex_available: [ "myapex" ],
1426 }
Jooyung Hand3639552019-08-09 12:57:43 +09001427 `)
1428
Sundong Ahnabb64432019-10-22 13:58:29 +09001429 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001430 copyCmds := apexRule.Args["copy_commands"]
1431
1432 // Ensure that direct non-stubs dep is always included
1433 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1434
1435 // Ensure that indirect stubs dep is not included
1436 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1437
1438 // Ensure that runtime_libs dep in included
1439 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001440 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1441 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1442
1443 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001444
Sundong Ahnabb64432019-10-22 13:58:29 +09001445 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001446 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1447 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001448}
1449
Paul Duffina02cae32021-03-09 01:44:06 +00001450var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1451 cc.PrepareForTestWithCcBuildComponents,
1452 PrepareForTestWithApexBuildComponents,
1453 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001454 apex {
1455 name: "com.android.runtime",
1456 key: "com.android.runtime.key",
1457 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001458 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001459 }
1460
1461 apex_key {
1462 name: "com.android.runtime.key",
1463 public_key: "testkey.avbpubkey",
1464 private_key: "testkey.pem",
1465 }
Paul Duffina02cae32021-03-09 01:44:06 +00001466 `),
1467 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1468)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001469
Paul Duffina02cae32021-03-09 01:44:06 +00001470func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001471 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001472 cc_library {
1473 name: "libc",
1474 no_libcrt: true,
1475 nocrt: true,
1476 stl: "none",
1477 system_shared_libs: [],
1478 stubs: { versions: ["1"] },
1479 apex_available: ["com.android.runtime"],
1480
1481 sanitize: {
1482 hwaddress: true,
1483 }
1484 }
1485
1486 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001487 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001488 no_libcrt: true,
1489 nocrt: true,
1490 stl: "none",
1491 system_shared_libs: [],
1492 srcs: [""],
1493 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001494 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001495
1496 sanitize: {
1497 never: true,
1498 },
Spandan Das4de7b492023-05-05 21:13:01 +00001499 apex_available: [
1500 "//apex_available:anyapex",
1501 "//apex_available:platform",
1502 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001503 } `)
1504 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001505
1506 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1507 "lib64/bionic/libc.so",
1508 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1509 })
1510
Colin Cross4c4c1be2022-02-10 11:41:18 -08001511 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001512
1513 installed := hwasan.Description("install libclang_rt.hwasan")
1514 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1515
1516 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1517 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1518 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1519}
1520
1521func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001522 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001523 prepareForTestOfRuntimeApexWithHwasan,
1524 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1525 variables.SanitizeDevice = []string{"hwaddress"}
1526 }),
1527 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001528 cc_library {
1529 name: "libc",
1530 no_libcrt: true,
1531 nocrt: true,
1532 stl: "none",
1533 system_shared_libs: [],
1534 stubs: { versions: ["1"] },
1535 apex_available: ["com.android.runtime"],
1536 }
1537
1538 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001539 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001540 no_libcrt: true,
1541 nocrt: true,
1542 stl: "none",
1543 system_shared_libs: [],
1544 srcs: [""],
1545 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001546 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001547
1548 sanitize: {
1549 never: true,
1550 },
Spandan Das4de7b492023-05-05 21:13:01 +00001551 apex_available: [
1552 "//apex_available:anyapex",
1553 "//apex_available:platform",
1554 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001555 }
Paul Duffina02cae32021-03-09 01:44:06 +00001556 `)
1557 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001558
1559 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1560 "lib64/bionic/libc.so",
1561 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1562 })
1563
Colin Cross4c4c1be2022-02-10 11:41:18 -08001564 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001565
1566 installed := hwasan.Description("install libclang_rt.hwasan")
1567 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1568
1569 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1570 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1571 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1572}
1573
Jooyung Han61b66e92020-03-21 14:21:46 +00001574func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1575 testcases := []struct {
1576 name string
1577 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001578 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001579 shouldLink string
1580 shouldNotLink []string
1581 }{
1582 {
Jiyong Park55549df2021-02-26 23:57:23 +09001583 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001584 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001585 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001586 shouldLink: "current",
1587 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001588 },
1589 {
Jiyong Park55549df2021-02-26 23:57:23 +09001590 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001591 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001592 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001593 shouldLink: "current",
1594 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001595 },
1596 }
1597 for _, tc := range testcases {
1598 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001599 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001600 apex {
1601 name: "myapex",
1602 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001603 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001604 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001605 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001606 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001607
Jooyung Han61b66e92020-03-21 14:21:46 +00001608 apex_key {
1609 name: "myapex.key",
1610 public_key: "testkey.avbpubkey",
1611 private_key: "testkey.pem",
1612 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001613
Jooyung Han61b66e92020-03-21 14:21:46 +00001614 cc_library {
1615 name: "mylib",
1616 srcs: ["mylib.cpp"],
1617 vendor_available: true,
1618 shared_libs: ["libbar"],
1619 system_shared_libs: [],
1620 stl: "none",
1621 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001622 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001623 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001624
Jooyung Han61b66e92020-03-21 14:21:46 +00001625 cc_library {
1626 name: "libbar",
1627 srcs: ["mylib.cpp"],
1628 system_shared_libs: [],
1629 stl: "none",
1630 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001631 llndk: {
1632 symbol_file: "libbar.map.txt",
1633 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001634 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001635 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001636 withUnbundledBuild,
1637 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001638
Jooyung Han61b66e92020-03-21 14:21:46 +00001639 // Ensure that LLNDK dep is not included
1640 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1641 "lib64/mylib.so",
1642 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001643
Jooyung Han61b66e92020-03-21 14:21:46 +00001644 // Ensure that LLNDK dep is required
1645 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1646 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1647 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001648
Steven Moreland2c4000c2021-04-27 02:08:49 +00001649 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1650 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001651 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001652 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001653 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001654
Steven Moreland2c4000c2021-04-27 02:08:49 +00001655 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001656 ver := tc.shouldLink
1657 if tc.shouldLink == "current" {
1658 ver = strconv.Itoa(android.FutureApiLevelInt)
1659 }
1660 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001661 })
1662 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001663}
1664
Jiyong Park25fc6a92018-11-18 18:02:45 +09001665func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001666 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001667 apex {
1668 name: "myapex",
1669 key: "myapex.key",
1670 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001671 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001672 }
1673
1674 apex_key {
1675 name: "myapex.key",
1676 public_key: "testkey.avbpubkey",
1677 private_key: "testkey.pem",
1678 }
1679
1680 cc_library {
1681 name: "mylib",
1682 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001683 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001684 shared_libs: ["libdl#27"],
1685 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001686 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001687 }
1688
1689 cc_library_shared {
1690 name: "mylib_shared",
1691 srcs: ["mylib.cpp"],
1692 shared_libs: ["libdl#27"],
1693 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001694 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001695 }
1696
1697 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001698 name: "libBootstrap",
1699 srcs: ["mylib.cpp"],
1700 stl: "none",
1701 bootstrap: true,
1702 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001703 `)
1704
Sundong Ahnabb64432019-10-22 13:58:29 +09001705 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001706 copyCmds := apexRule.Args["copy_commands"]
1707
1708 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001709 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001710 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1711 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001712
1713 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001714 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001715
Colin Crossaede88c2020-08-11 12:17:01 -07001716 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1717 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1718 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001719
1720 // For dependency to libc
1721 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001722 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001723 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001724 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001725 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001726 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1727 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001728
1729 // For dependency to libm
1730 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001731 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001732 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001733 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001734 // ... and is not compiling with the stub
1735 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1736 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1737
1738 // For dependency to libdl
1739 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001740 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001741 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001742 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1743 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001744 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001745 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001746 // ... Cflags from stub is correctly exported to mylib
1747 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1748 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001749
1750 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001751 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1752 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1753 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1754 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001755}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001756
Jooyung Han749dc692020-04-15 11:03:39 +09001757func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001758 // there are three links between liba --> libz.
1759 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001760 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001761 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001762 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001763 apex {
1764 name: "myapex",
1765 key: "myapex.key",
1766 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001767 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001768 }
1769
1770 apex {
1771 name: "otherapex",
1772 key: "myapex.key",
1773 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001774 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001775 }
1776
1777 apex_key {
1778 name: "myapex.key",
1779 public_key: "testkey.avbpubkey",
1780 private_key: "testkey.pem",
1781 }
1782
1783 cc_library {
1784 name: "libx",
1785 shared_libs: ["liba"],
1786 system_shared_libs: [],
1787 stl: "none",
1788 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001789 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001790 }
1791
1792 cc_library {
1793 name: "liby",
1794 shared_libs: ["liba"],
1795 system_shared_libs: [],
1796 stl: "none",
1797 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001798 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001799 }
1800
1801 cc_library {
1802 name: "liba",
1803 shared_libs: ["libz"],
1804 system_shared_libs: [],
1805 stl: "none",
1806 apex_available: [
1807 "//apex_available:anyapex",
1808 "//apex_available:platform",
1809 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001810 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001811 }
1812
1813 cc_library {
1814 name: "libz",
1815 system_shared_libs: [],
1816 stl: "none",
1817 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001818 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001819 },
1820 }
Jooyung Han749dc692020-04-15 11:03:39 +09001821 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001822
1823 expectLink := func(from, from_variant, to, to_variant string) {
1824 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1825 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1826 }
1827 expectNoLink := func(from, from_variant, to, to_variant string) {
1828 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1829 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1830 }
1831 // platform liba is linked to non-stub version
1832 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001833 // liba in myapex is linked to current
1834 expectLink("liba", "shared_apex29", "libz", "shared_current")
1835 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001836 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001837 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001838 // liba in otherapex is linked to current
1839 expectLink("liba", "shared_apex30", "libz", "shared_current")
1840 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001841 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1842 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001843}
1844
Jooyung Hanaed150d2020-04-02 01:41:41 +09001845func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001846 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001847 apex {
1848 name: "myapex",
1849 key: "myapex.key",
1850 native_shared_libs: ["libx"],
1851 min_sdk_version: "R",
1852 }
1853
1854 apex_key {
1855 name: "myapex.key",
1856 public_key: "testkey.avbpubkey",
1857 private_key: "testkey.pem",
1858 }
1859
1860 cc_library {
1861 name: "libx",
1862 shared_libs: ["libz"],
1863 system_shared_libs: [],
1864 stl: "none",
1865 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001866 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001867 }
1868
1869 cc_library {
1870 name: "libz",
1871 system_shared_libs: [],
1872 stl: "none",
1873 stubs: {
1874 versions: ["29", "R"],
1875 },
1876 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001877 `,
1878 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1879 variables.Platform_version_active_codenames = []string{"R"}
1880 }),
1881 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001882
1883 expectLink := func(from, from_variant, to, to_variant string) {
1884 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1885 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1886 }
1887 expectNoLink := func(from, from_variant, to, to_variant string) {
1888 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1889 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1890 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001891 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1892 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001893 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1894 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001895}
1896
Jooyung Han4c4da062021-06-23 10:23:16 +09001897func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1898 testApex(t, `
1899 apex {
1900 name: "myapex",
1901 key: "myapex.key",
1902 java_libs: ["libx"],
1903 min_sdk_version: "S",
1904 }
1905
1906 apex_key {
1907 name: "myapex.key",
1908 public_key: "testkey.avbpubkey",
1909 private_key: "testkey.pem",
1910 }
1911
1912 java_library {
1913 name: "libx",
1914 srcs: ["a.java"],
1915 apex_available: [ "myapex" ],
1916 sdk_version: "current",
1917 min_sdk_version: "S", // should be okay
1918 }
1919 `,
1920 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1921 variables.Platform_version_active_codenames = []string{"S"}
1922 variables.Platform_sdk_codename = proptools.StringPtr("S")
1923 }),
1924 )
1925}
1926
Jooyung Han749dc692020-04-15 11:03:39 +09001927func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001928 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001929 apex {
1930 name: "myapex",
1931 key: "myapex.key",
1932 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001933 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001934 }
1935
1936 apex_key {
1937 name: "myapex.key",
1938 public_key: "testkey.avbpubkey",
1939 private_key: "testkey.pem",
1940 }
1941
1942 cc_library {
1943 name: "libx",
1944 shared_libs: ["libz"],
1945 system_shared_libs: [],
1946 stl: "none",
1947 apex_available: [ "myapex" ],
1948 }
1949
1950 cc_library {
1951 name: "libz",
1952 system_shared_libs: [],
1953 stl: "none",
1954 stubs: {
1955 versions: ["1", "2"],
1956 },
1957 }
1958 `)
1959
1960 expectLink := func(from, from_variant, to, to_variant string) {
1961 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1962 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1963 }
1964 expectNoLink := func(from, from_variant, to, to_variant string) {
1965 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1966 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1967 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001968 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001969 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001970 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001971 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001972}
1973
Jooyung Handfc864c2023-03-20 18:19:07 +09001974func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001975 ctx := testApex(t, `
1976 apex {
1977 name: "myapex",
1978 key: "myapex.key",
1979 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001980 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001981 vendor: true,
1982 min_sdk_version: "29",
1983 }
1984
1985 apex_key {
1986 name: "myapex.key",
1987 public_key: "testkey.avbpubkey",
1988 private_key: "testkey.pem",
1989 }
1990
1991 cc_library {
1992 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001993 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001994 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001995 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001996 shared_libs: ["libbar"],
1997 }
1998
1999 cc_library {
2000 name: "libbar",
2001 stubs: { versions: ["29", "30"] },
2002 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002003 }
2004 `)
2005
2006 vendorVariant := "android_vendor.29_arm64_armv8-a"
2007
Jooyung Handfc864c2023-03-20 18:19:07 +09002008 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
2009
2010 // Ensure that mylib links with "current" LLNDK
2011 libFlags := names(mylib.Rule("ld").Args["libFlags"])
2012 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
2013
2014 // Ensure that mylib is targeting 29
2015 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2016 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2017
2018 // Ensure that the correct variant of crtbegin_so is used.
2019 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2020 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002021
2022 // Ensure that the crtbegin_so used by the APEX is targeting 29
2023 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2024 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2025}
2026
Jooyung Han4495f842023-04-25 16:39:59 +09002027func TestTrackAllowedDeps(t *testing.T) {
2028 ctx := testApex(t, `
2029 apex {
2030 name: "myapex",
2031 key: "myapex.key",
2032 updatable: true,
2033 native_shared_libs: [
2034 "mylib",
2035 "yourlib",
2036 ],
2037 min_sdk_version: "29",
2038 }
2039
2040 apex {
2041 name: "myapex2",
2042 key: "myapex.key",
2043 updatable: false,
2044 native_shared_libs: ["yourlib"],
2045 }
2046
2047 apex_key {
2048 name: "myapex.key",
2049 public_key: "testkey.avbpubkey",
2050 private_key: "testkey.pem",
2051 }
2052
2053 cc_library {
2054 name: "mylib",
2055 srcs: ["mylib.cpp"],
2056 shared_libs: ["libbar"],
2057 min_sdk_version: "29",
2058 apex_available: ["myapex"],
2059 }
2060
2061 cc_library {
2062 name: "libbar",
2063 stubs: { versions: ["29", "30"] },
2064 }
2065
2066 cc_library {
2067 name: "yourlib",
2068 srcs: ["mylib.cpp"],
2069 min_sdk_version: "29",
2070 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2071 }
2072 `, withFiles(android.MockFS{
2073 "packages/modules/common/build/allowed_deps.txt": nil,
2074 }))
2075
2076 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2077 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2078 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2079 "out/soong/.intermediates/myapex/android_common_myapex_image/depsinfo/flatlist.txt")
2080 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2081 "out/soong/.intermediates/myapex2/android_common_myapex2_image/depsinfo/flatlist.txt")
2082
2083 myapex := ctx.ModuleForTests("myapex", "android_common_myapex_image")
2084 flatlist := strings.Split(myapex.Output("depsinfo/flatlist.txt").BuildParams.Args["content"], "\\n")
2085 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2086 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2087 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2088 flatlist, "mylib:(minSdkVersion:29)")
2089 android.AssertStringListContains(t, "track platform-available lib",
2090 flatlist, "yourlib(minSdkVersion:29)")
2091}
2092
2093func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2094 ctx := testApex(t, `
2095 apex {
2096 name: "myapex",
2097 key: "myapex.key",
2098 updatable: true,
2099 min_sdk_version: "29",
2100 }
2101
2102 apex_key {
2103 name: "myapex.key",
2104 public_key: "testkey.avbpubkey",
2105 private_key: "testkey.pem",
2106 }
2107 `)
2108 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2109 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2110 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2111 }
2112}
2113
Jooyung Han03b51852020-02-26 22:45:42 +09002114func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002115 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002116 apex {
2117 name: "myapex",
2118 key: "myapex.key",
2119 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002120 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002121 }
2122
2123 apex_key {
2124 name: "myapex.key",
2125 public_key: "testkey.avbpubkey",
2126 private_key: "testkey.pem",
2127 }
2128
2129 cc_library {
2130 name: "libx",
2131 system_shared_libs: [],
2132 stl: "none",
2133 apex_available: [ "myapex" ],
2134 stubs: {
2135 versions: ["1", "2"],
2136 },
2137 }
2138
2139 cc_library {
2140 name: "libz",
2141 shared_libs: ["libx"],
2142 system_shared_libs: [],
2143 stl: "none",
2144 }
2145 `)
2146
2147 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002148 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002149 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2150 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2151 }
2152 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002153 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002154 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2155 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2156 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002157 expectLink("libz", "shared", "libx", "shared_current")
2158 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002159 expectNoLink("libz", "shared", "libz", "shared_1")
2160 expectNoLink("libz", "shared", "libz", "shared")
2161}
2162
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002163var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2164 func(variables android.FixtureProductVariables) {
2165 variables.SanitizeDevice = []string{"hwaddress"}
2166 },
2167)
2168
Jooyung Han75568392020-03-20 04:29:24 +09002169func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002170 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002171 apex {
2172 name: "myapex",
2173 key: "myapex.key",
2174 native_shared_libs: ["libx"],
2175 min_sdk_version: "29",
2176 }
2177
2178 apex_key {
2179 name: "myapex.key",
2180 public_key: "testkey.avbpubkey",
2181 private_key: "testkey.pem",
2182 }
2183
2184 cc_library {
2185 name: "libx",
2186 shared_libs: ["libbar"],
2187 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002188 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002189 }
2190
2191 cc_library {
2192 name: "libbar",
2193 stubs: {
2194 versions: ["29", "30"],
2195 },
2196 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002197 `,
2198 prepareForTestWithSantitizeHwaddress,
2199 )
Jooyung Han03b51852020-02-26 22:45:42 +09002200 expectLink := func(from, from_variant, to, to_variant string) {
2201 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2202 libFlags := ld.Args["libFlags"]
2203 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2204 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002205 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002206}
2207
Jooyung Han75568392020-03-20 04:29:24 +09002208func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002209 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002210 apex {
2211 name: "myapex",
2212 key: "myapex.key",
2213 native_shared_libs: ["libx"],
2214 min_sdk_version: "29",
2215 }
2216
2217 apex_key {
2218 name: "myapex.key",
2219 public_key: "testkey.avbpubkey",
2220 private_key: "testkey.pem",
2221 }
2222
2223 cc_library {
2224 name: "libx",
2225 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002226 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002227 }
Jooyung Han75568392020-03-20 04:29:24 +09002228 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002229
2230 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002231 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002232 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002233 // note that platform variant is not.
2234 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002235 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002236}
2237
Jooyung Han749dc692020-04-15 11:03:39 +09002238func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2239 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002240 apex {
2241 name: "myapex",
2242 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002243 native_shared_libs: ["mylib"],
2244 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002245 }
2246
2247 apex_key {
2248 name: "myapex.key",
2249 public_key: "testkey.avbpubkey",
2250 private_key: "testkey.pem",
2251 }
Jooyung Han749dc692020-04-15 11:03:39 +09002252
2253 cc_library {
2254 name: "mylib",
2255 srcs: ["mylib.cpp"],
2256 system_shared_libs: [],
2257 stl: "none",
2258 apex_available: [
2259 "myapex",
2260 ],
2261 min_sdk_version: "30",
2262 }
2263 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002264
2265 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2266 apex {
2267 name: "myapex",
2268 key: "myapex.key",
2269 native_shared_libs: ["libfoo.ffi"],
2270 min_sdk_version: "29",
2271 }
2272
2273 apex_key {
2274 name: "myapex.key",
2275 public_key: "testkey.avbpubkey",
2276 private_key: "testkey.pem",
2277 }
2278
2279 rust_ffi_shared {
2280 name: "libfoo.ffi",
2281 srcs: ["foo.rs"],
2282 crate_name: "foo",
2283 apex_available: [
2284 "myapex",
2285 ],
2286 min_sdk_version: "30",
2287 }
2288 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002289
2290 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2291 apex {
2292 name: "myapex",
2293 key: "myapex.key",
2294 java_libs: ["libfoo"],
2295 min_sdk_version: "29",
2296 }
2297
2298 apex_key {
2299 name: "myapex.key",
2300 public_key: "testkey.avbpubkey",
2301 private_key: "testkey.pem",
2302 }
2303
2304 java_import {
2305 name: "libfoo",
2306 jars: ["libfoo.jar"],
2307 apex_available: [
2308 "myapex",
2309 ],
2310 min_sdk_version: "30",
2311 }
2312 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002313
2314 // Skip check for modules compiling against core API surface
2315 testApex(t, `
2316 apex {
2317 name: "myapex",
2318 key: "myapex.key",
2319 java_libs: ["libfoo"],
2320 min_sdk_version: "29",
2321 }
2322
2323 apex_key {
2324 name: "myapex.key",
2325 public_key: "testkey.avbpubkey",
2326 private_key: "testkey.pem",
2327 }
2328
2329 java_library {
2330 name: "libfoo",
2331 srcs: ["Foo.java"],
2332 apex_available: [
2333 "myapex",
2334 ],
2335 // Compile against core API surface
2336 sdk_version: "core_current",
2337 min_sdk_version: "30",
2338 }
2339 `)
2340
Jooyung Han749dc692020-04-15 11:03:39 +09002341}
2342
2343func TestApexMinSdkVersion_Okay(t *testing.T) {
2344 testApex(t, `
2345 apex {
2346 name: "myapex",
2347 key: "myapex.key",
2348 native_shared_libs: ["libfoo"],
2349 java_libs: ["libbar"],
2350 min_sdk_version: "29",
2351 }
2352
2353 apex_key {
2354 name: "myapex.key",
2355 public_key: "testkey.avbpubkey",
2356 private_key: "testkey.pem",
2357 }
2358
2359 cc_library {
2360 name: "libfoo",
2361 srcs: ["mylib.cpp"],
2362 shared_libs: ["libfoo_dep"],
2363 apex_available: ["myapex"],
2364 min_sdk_version: "29",
2365 }
2366
2367 cc_library {
2368 name: "libfoo_dep",
2369 srcs: ["mylib.cpp"],
2370 apex_available: ["myapex"],
2371 min_sdk_version: "29",
2372 }
2373
2374 java_library {
2375 name: "libbar",
2376 sdk_version: "current",
2377 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002378 static_libs: [
2379 "libbar_dep",
2380 "libbar_import_dep",
2381 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002382 apex_available: ["myapex"],
2383 min_sdk_version: "29",
2384 }
2385
2386 java_library {
2387 name: "libbar_dep",
2388 sdk_version: "current",
2389 srcs: ["a.java"],
2390 apex_available: ["myapex"],
2391 min_sdk_version: "29",
2392 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002393
2394 java_import {
2395 name: "libbar_import_dep",
2396 jars: ["libbar.jar"],
2397 apex_available: ["myapex"],
2398 min_sdk_version: "29",
2399 }
Jooyung Han03b51852020-02-26 22:45:42 +09002400 `)
2401}
2402
Colin Cross8ca61c12022-10-06 21:00:14 -07002403func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2404 // Tests that an apex dependency with min_sdk_version higher than the
2405 // min_sdk_version of the apex is allowed as long as the dependency's
2406 // min_sdk_version is less than or equal to the api level that the
2407 // architecture was introduced in. In this case, arm64 didn't exist
2408 // until api level 21, so the arm64 code will never need to run on
2409 // an api level 20 device, even if other architectures of the apex
2410 // will.
2411 testApex(t, `
2412 apex {
2413 name: "myapex",
2414 key: "myapex.key",
2415 native_shared_libs: ["libfoo"],
2416 min_sdk_version: "20",
2417 }
2418
2419 apex_key {
2420 name: "myapex.key",
2421 public_key: "testkey.avbpubkey",
2422 private_key: "testkey.pem",
2423 }
2424
2425 cc_library {
2426 name: "libfoo",
2427 srcs: ["mylib.cpp"],
2428 apex_available: ["myapex"],
2429 min_sdk_version: "21",
2430 stl: "none",
2431 }
2432 `)
2433}
2434
Artur Satayev8cf899a2020-04-15 17:29:42 +01002435func TestJavaStableSdkVersion(t *testing.T) {
2436 testCases := []struct {
2437 name string
2438 expectedError string
2439 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002440 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002441 }{
2442 {
2443 name: "Non-updatable apex with non-stable dep",
2444 bp: `
2445 apex {
2446 name: "myapex",
2447 java_libs: ["myjar"],
2448 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002449 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002450 }
2451 apex_key {
2452 name: "myapex.key",
2453 public_key: "testkey.avbpubkey",
2454 private_key: "testkey.pem",
2455 }
2456 java_library {
2457 name: "myjar",
2458 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002459 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002460 apex_available: ["myapex"],
2461 }
2462 `,
2463 },
2464 {
2465 name: "Updatable apex with stable dep",
2466 bp: `
2467 apex {
2468 name: "myapex",
2469 java_libs: ["myjar"],
2470 key: "myapex.key",
2471 updatable: true,
2472 min_sdk_version: "29",
2473 }
2474 apex_key {
2475 name: "myapex.key",
2476 public_key: "testkey.avbpubkey",
2477 private_key: "testkey.pem",
2478 }
2479 java_library {
2480 name: "myjar",
2481 srcs: ["foo/bar/MyClass.java"],
2482 sdk_version: "current",
2483 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002484 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002485 }
2486 `,
2487 },
2488 {
2489 name: "Updatable apex with non-stable dep",
2490 expectedError: "cannot depend on \"myjar\"",
2491 bp: `
2492 apex {
2493 name: "myapex",
2494 java_libs: ["myjar"],
2495 key: "myapex.key",
2496 updatable: true,
2497 }
2498 apex_key {
2499 name: "myapex.key",
2500 public_key: "testkey.avbpubkey",
2501 private_key: "testkey.pem",
2502 }
2503 java_library {
2504 name: "myjar",
2505 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002506 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002507 apex_available: ["myapex"],
2508 }
2509 `,
2510 },
2511 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002512 name: "Updatable apex with non-stable legacy core platform dep",
2513 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2514 bp: `
2515 apex {
2516 name: "myapex",
2517 java_libs: ["myjar-uses-legacy"],
2518 key: "myapex.key",
2519 updatable: true,
2520 }
2521 apex_key {
2522 name: "myapex.key",
2523 public_key: "testkey.avbpubkey",
2524 private_key: "testkey.pem",
2525 }
2526 java_library {
2527 name: "myjar-uses-legacy",
2528 srcs: ["foo/bar/MyClass.java"],
2529 sdk_version: "core_platform",
2530 apex_available: ["myapex"],
2531 }
2532 `,
2533 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2534 },
2535 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002536 name: "Updatable apex with non-stable transitive dep",
2537 // This is not actually detecting that the transitive dependency is unstable, rather it is
2538 // detecting that the transitive dependency is building against a wider API surface than the
2539 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002540 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002541 bp: `
2542 apex {
2543 name: "myapex",
2544 java_libs: ["myjar"],
2545 key: "myapex.key",
2546 updatable: true,
2547 }
2548 apex_key {
2549 name: "myapex.key",
2550 public_key: "testkey.avbpubkey",
2551 private_key: "testkey.pem",
2552 }
2553 java_library {
2554 name: "myjar",
2555 srcs: ["foo/bar/MyClass.java"],
2556 sdk_version: "current",
2557 apex_available: ["myapex"],
2558 static_libs: ["transitive-jar"],
2559 }
2560 java_library {
2561 name: "transitive-jar",
2562 srcs: ["foo/bar/MyClass.java"],
2563 sdk_version: "core_platform",
2564 apex_available: ["myapex"],
2565 }
2566 `,
2567 },
2568 }
2569
2570 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002571 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2572 continue
2573 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002574 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002575 errorHandler := android.FixtureExpectsNoErrors
2576 if test.expectedError != "" {
2577 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002578 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002579 android.GroupFixturePreparers(
2580 java.PrepareForTestWithJavaDefaultModules,
2581 PrepareForTestWithApexBuildComponents,
2582 prepareForTestWithMyapex,
2583 android.OptionalFixturePreparer(test.preparer),
2584 ).
2585 ExtendWithErrorHandler(errorHandler).
2586 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002587 })
2588 }
2589}
2590
Jooyung Han749dc692020-04-15 11:03:39 +09002591func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2592 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2593 apex {
2594 name: "myapex",
2595 key: "myapex.key",
2596 native_shared_libs: ["mylib"],
2597 min_sdk_version: "29",
2598 }
2599
2600 apex_key {
2601 name: "myapex.key",
2602 public_key: "testkey.avbpubkey",
2603 private_key: "testkey.pem",
2604 }
2605
2606 cc_library {
2607 name: "mylib",
2608 srcs: ["mylib.cpp"],
2609 shared_libs: ["mylib2"],
2610 system_shared_libs: [],
2611 stl: "none",
2612 apex_available: [
2613 "myapex",
2614 ],
2615 min_sdk_version: "29",
2616 }
2617
2618 // indirect part of the apex
2619 cc_library {
2620 name: "mylib2",
2621 srcs: ["mylib.cpp"],
2622 system_shared_libs: [],
2623 stl: "none",
2624 apex_available: [
2625 "myapex",
2626 ],
2627 min_sdk_version: "30",
2628 }
2629 `)
2630}
2631
2632func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2633 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2634 apex {
2635 name: "myapex",
2636 key: "myapex.key",
2637 apps: ["AppFoo"],
2638 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002639 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002640 }
2641
2642 apex_key {
2643 name: "myapex.key",
2644 public_key: "testkey.avbpubkey",
2645 private_key: "testkey.pem",
2646 }
2647
2648 android_app {
2649 name: "AppFoo",
2650 srcs: ["foo/bar/MyClass.java"],
2651 sdk_version: "current",
2652 min_sdk_version: "29",
2653 system_modules: "none",
2654 stl: "none",
2655 static_libs: ["bar"],
2656 apex_available: [ "myapex" ],
2657 }
2658
2659 java_library {
2660 name: "bar",
2661 sdk_version: "current",
2662 srcs: ["a.java"],
2663 apex_available: [ "myapex" ],
2664 }
2665 `)
2666}
2667
2668func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002669 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002670 apex {
2671 name: "myapex",
2672 key: "myapex.key",
2673 native_shared_libs: ["mylib"],
2674 min_sdk_version: "29",
2675 }
2676
2677 apex_key {
2678 name: "myapex.key",
2679 public_key: "testkey.avbpubkey",
2680 private_key: "testkey.pem",
2681 }
2682
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002683 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002684 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2685 cc_library {
2686 name: "mylib",
2687 srcs: ["mylib.cpp"],
2688 shared_libs: ["mylib2"],
2689 system_shared_libs: [],
2690 stl: "none",
2691 apex_available: ["myapex", "otherapex"],
2692 min_sdk_version: "29",
2693 }
2694
2695 cc_library {
2696 name: "mylib2",
2697 srcs: ["mylib.cpp"],
2698 system_shared_libs: [],
2699 stl: "none",
2700 apex_available: ["otherapex"],
2701 stubs: { versions: ["29", "30"] },
2702 min_sdk_version: "30",
2703 }
2704
2705 apex {
2706 name: "otherapex",
2707 key: "myapex.key",
2708 native_shared_libs: ["mylib", "mylib2"],
2709 min_sdk_version: "30",
2710 }
2711 `)
2712 expectLink := func(from, from_variant, to, to_variant string) {
2713 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2714 libFlags := ld.Args["libFlags"]
2715 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2716 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002717 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002718 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002719}
2720
Jooyung Haned124c32021-01-26 11:43:46 +09002721func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002722 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2723 func(variables android.FixtureProductVariables) {
2724 variables.Platform_sdk_codename = proptools.StringPtr("S")
2725 variables.Platform_version_active_codenames = []string{"S"}
2726 },
2727 )
Jooyung Haned124c32021-01-26 11:43:46 +09002728 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2729 apex {
2730 name: "myapex",
2731 key: "myapex.key",
2732 native_shared_libs: ["libfoo"],
2733 min_sdk_version: "S",
2734 }
2735 apex_key {
2736 name: "myapex.key",
2737 public_key: "testkey.avbpubkey",
2738 private_key: "testkey.pem",
2739 }
2740 cc_library {
2741 name: "libfoo",
2742 shared_libs: ["libbar"],
2743 apex_available: ["myapex"],
2744 min_sdk_version: "29",
2745 }
2746 cc_library {
2747 name: "libbar",
2748 apex_available: ["myapex"],
2749 }
2750 `, withSAsActiveCodeNames)
2751}
2752
2753func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002754 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2755 variables.Platform_sdk_codename = proptools.StringPtr("S")
2756 variables.Platform_version_active_codenames = []string{"S", "T"}
2757 })
Colin Cross1c460562021-02-16 17:55:47 -08002758 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002759 apex {
2760 name: "myapex",
2761 key: "myapex.key",
2762 native_shared_libs: ["libfoo"],
2763 min_sdk_version: "S",
2764 }
2765 apex_key {
2766 name: "myapex.key",
2767 public_key: "testkey.avbpubkey",
2768 private_key: "testkey.pem",
2769 }
2770 cc_library {
2771 name: "libfoo",
2772 shared_libs: ["libbar"],
2773 apex_available: ["myapex"],
2774 min_sdk_version: "S",
2775 }
2776 cc_library {
2777 name: "libbar",
2778 stubs: {
2779 symbol_file: "libbar.map.txt",
2780 versions: ["30", "S", "T"],
2781 },
2782 }
2783 `, withSAsActiveCodeNames)
2784
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002785 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002786 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2787 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002788 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002789}
2790
Jiyong Park7c2ee712018-12-07 00:42:25 +09002791func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002792 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002793 apex {
2794 name: "myapex",
2795 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002796 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002797 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002798 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002799 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002800 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002801 }
2802
2803 apex_key {
2804 name: "myapex.key",
2805 public_key: "testkey.avbpubkey",
2806 private_key: "testkey.pem",
2807 }
2808
2809 prebuilt_etc {
2810 name: "myetc",
2811 src: "myprebuilt",
2812 sub_dir: "foo/bar",
2813 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002814
2815 cc_library {
2816 name: "mylib",
2817 srcs: ["mylib.cpp"],
2818 relative_install_path: "foo/bar",
2819 system_shared_libs: [],
2820 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002821 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002822 }
2823
2824 cc_binary {
2825 name: "mybin",
2826 srcs: ["mylib.cpp"],
2827 relative_install_path: "foo/bar",
2828 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002829 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002830 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002831 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002832
2833 rust_binary {
2834 name: "mybin.rust",
2835 srcs: ["foo.rs"],
2836 relative_install_path: "rust_subdir",
2837 apex_available: [ "myapex" ],
2838 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002839 `)
2840
Sundong Ahnabb64432019-10-22 13:58:29 +09002841 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002842 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002843
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002844 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002845 ensureContains(t, cmd, "/etc ")
2846 ensureContains(t, cmd, "/etc/foo ")
2847 ensureContains(t, cmd, "/etc/foo/bar ")
2848 ensureContains(t, cmd, "/lib64 ")
2849 ensureContains(t, cmd, "/lib64/foo ")
2850 ensureContains(t, cmd, "/lib64/foo/bar ")
2851 ensureContains(t, cmd, "/lib ")
2852 ensureContains(t, cmd, "/lib/foo ")
2853 ensureContains(t, cmd, "/lib/foo/bar ")
2854 ensureContains(t, cmd, "/bin ")
2855 ensureContains(t, cmd, "/bin/foo ")
2856 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002857 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002858}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002859
Jooyung Han35155c42020-02-06 17:33:20 +09002860func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002861 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002862 apex {
2863 name: "myapex",
2864 key: "myapex.key",
2865 multilib: {
2866 both: {
2867 native_shared_libs: ["mylib"],
2868 binaries: ["mybin"],
2869 },
2870 },
2871 compile_multilib: "both",
2872 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002873 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002874 }
2875
2876 apex_key {
2877 name: "myapex.key",
2878 public_key: "testkey.avbpubkey",
2879 private_key: "testkey.pem",
2880 }
2881
2882 cc_library {
2883 name: "mylib",
2884 relative_install_path: "foo/bar",
2885 system_shared_libs: [],
2886 stl: "none",
2887 apex_available: [ "myapex" ],
2888 native_bridge_supported: true,
2889 }
2890
2891 cc_binary {
2892 name: "mybin",
2893 relative_install_path: "foo/bar",
2894 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002895 stl: "none",
2896 apex_available: [ "myapex" ],
2897 native_bridge_supported: true,
2898 compile_multilib: "both", // default is "first" for binary
2899 multilib: {
2900 lib64: {
2901 suffix: "64",
2902 },
2903 },
2904 }
2905 `, withNativeBridgeEnabled)
2906 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2907 "bin/foo/bar/mybin",
2908 "bin/foo/bar/mybin64",
2909 "bin/arm/foo/bar/mybin",
2910 "bin/arm64/foo/bar/mybin64",
2911 "lib/foo/bar/mylib.so",
2912 "lib/arm/foo/bar/mylib.so",
2913 "lib64/foo/bar/mylib.so",
2914 "lib64/arm64/foo/bar/mylib.so",
2915 })
2916}
2917
Jooyung Han85d61762020-06-24 23:50:26 +09002918func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002919 result := android.GroupFixturePreparers(
2920 prepareForApexTest,
2921 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2922 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002923 apex {
2924 name: "myapex",
2925 key: "myapex.key",
2926 binaries: ["mybin"],
2927 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002928 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002929 }
2930 apex_key {
2931 name: "myapex.key",
2932 public_key: "testkey.avbpubkey",
2933 private_key: "testkey.pem",
2934 }
2935 cc_binary {
2936 name: "mybin",
2937 vendor: true,
2938 shared_libs: ["libfoo"],
2939 }
2940 cc_library {
2941 name: "libfoo",
2942 proprietary: true,
2943 }
2944 `)
2945
Colin Crossc68db4b2021-11-11 18:59:15 -08002946 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002947 "bin/mybin",
2948 "lib64/libfoo.so",
2949 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2950 "lib64/libc++.so",
2951 })
2952
Colin Crossc68db4b2021-11-11 18:59:15 -08002953 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2954 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002955 name := apexBundle.BaseModuleName()
2956 prefix := "TARGET_"
2957 var builder strings.Builder
2958 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002959 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002960 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002961 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002962
Colin Crossc68db4b2021-11-11 18:59:15 -08002963 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002964 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2965 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002966}
2967
Jooyung Hanc5a96762022-02-04 11:54:50 +09002968func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2969 testApexError(t, `Trying to include a VNDK library`, `
2970 apex {
2971 name: "myapex",
2972 key: "myapex.key",
2973 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2974 vendor: true,
2975 use_vndk_as_stable: true,
2976 updatable: false,
2977 }
2978 apex_key {
2979 name: "myapex.key",
2980 public_key: "testkey.avbpubkey",
2981 private_key: "testkey.pem",
2982 }`)
2983}
2984
Jooyung Handf78e212020-07-22 15:54:47 +09002985func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002986 // myapex myapex2
2987 // | |
2988 // mybin ------. mybin2
2989 // \ \ / |
2990 // (stable) .---\--------` |
2991 // \ / \ |
2992 // \ / \ /
2993 // libvndk libvendor
2994 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002995 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002996 apex {
2997 name: "myapex",
2998 key: "myapex.key",
2999 binaries: ["mybin"],
3000 vendor: true,
3001 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003002 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09003003 }
3004 apex_key {
3005 name: "myapex.key",
3006 public_key: "testkey.avbpubkey",
3007 private_key: "testkey.pem",
3008 }
3009 cc_binary {
3010 name: "mybin",
3011 vendor: true,
3012 shared_libs: ["libvndk", "libvendor"],
3013 }
3014 cc_library {
3015 name: "libvndk",
3016 vndk: {
3017 enabled: true,
3018 },
3019 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003020 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09003021 }
3022 cc_library {
3023 name: "libvendor",
3024 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09003025 stl: "none",
3026 }
3027 apex {
3028 name: "myapex2",
3029 key: "myapex.key",
3030 binaries: ["mybin2"],
3031 vendor: true,
3032 use_vndk_as_stable: false,
3033 updatable: false,
3034 }
3035 cc_binary {
3036 name: "mybin2",
3037 vendor: true,
3038 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09003039 }
Kiyoung Kim8269cee2023-07-26 12:39:19 +09003040 `,
3041 android.FixtureModifyConfig(func(config android.Config) {
3042 config.TestProductVariables.KeepVndk = proptools.BoolPtr(true)
3043 }),
3044 )
Jooyung Handf78e212020-07-22 15:54:47 +09003045
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003046 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09003047
Jooyung Han91f92032022-02-04 12:36:33 +09003048 for _, tc := range []struct {
3049 name string
3050 apexName string
3051 moduleName string
3052 moduleVariant string
3053 libs []string
3054 contents []string
3055 requireVndkNamespace bool
3056 }{
3057 {
3058 name: "use_vndk_as_stable",
3059 apexName: "myapex",
3060 moduleName: "mybin",
3061 moduleVariant: vendorVariant + "_apex10000",
3062 libs: []string{
3063 // should link with vendor variants of VNDK libs(libvndk/libc++)
3064 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3065 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3066 // unstable Vendor libs as APEX variant
3067 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3068 },
3069 contents: []string{
3070 "bin/mybin",
3071 "lib64/libvendor.so",
3072 // VNDK libs (libvndk/libc++) are not included
3073 },
3074 requireVndkNamespace: true,
3075 },
3076 {
3077 name: "!use_vndk_as_stable",
3078 apexName: "myapex2",
3079 moduleName: "mybin2",
3080 moduleVariant: vendorVariant + "_myapex2",
3081 libs: []string{
3082 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3083 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3084 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3085 // unstable vendor libs have "merged" APEX variants
3086 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3087 },
3088 contents: []string{
3089 "bin/mybin2",
3090 "lib64/libvendor.so",
3091 // VNDK libs are included as well
3092 "lib64/libvndk.so",
3093 "lib64/libc++.so",
3094 },
3095 requireVndkNamespace: false,
3096 },
3097 } {
3098 t.Run(tc.name, func(t *testing.T) {
3099 // Check linked libs
3100 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3101 libs := names(ldRule.Args["libFlags"])
3102 for _, lib := range tc.libs {
3103 ensureListContains(t, libs, lib)
3104 }
3105 // Check apex contents
3106 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003107
Jooyung Han91f92032022-02-04 12:36:33 +09003108 // Check "requireNativeLibs"
3109 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
3110 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3111 if tc.requireVndkNamespace {
3112 ensureListContains(t, requireNativeLibs, ":vndk")
3113 } else {
3114 ensureListNotContains(t, requireNativeLibs, ":vndk")
3115 }
3116 })
3117 }
Jooyung Handf78e212020-07-22 15:54:47 +09003118}
3119
Justin Yun13decfb2021-03-08 19:25:55 +09003120func TestProductVariant(t *testing.T) {
3121 ctx := testApex(t, `
3122 apex {
3123 name: "myapex",
3124 key: "myapex.key",
3125 updatable: false,
3126 product_specific: true,
3127 binaries: ["foo"],
3128 }
3129
3130 apex_key {
3131 name: "myapex.key",
3132 public_key: "testkey.avbpubkey",
3133 private_key: "testkey.pem",
3134 }
3135
3136 cc_binary {
3137 name: "foo",
3138 product_available: true,
3139 apex_available: ["myapex"],
3140 srcs: ["foo.cpp"],
3141 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003142 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3143 variables.ProductVndkVersion = proptools.StringPtr("current")
3144 }),
3145 )
Justin Yun13decfb2021-03-08 19:25:55 +09003146
3147 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003148 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003149 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3150 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3151 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3152 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3153}
3154
Jooyung Han8e5685d2020-09-21 11:02:57 +09003155func TestApex_withPrebuiltFirmware(t *testing.T) {
3156 testCases := []struct {
3157 name string
3158 additionalProp string
3159 }{
3160 {"system apex with prebuilt_firmware", ""},
3161 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3162 }
3163 for _, tc := range testCases {
3164 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003165 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003166 apex {
3167 name: "myapex",
3168 key: "myapex.key",
3169 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003170 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003171 `+tc.additionalProp+`
3172 }
3173 apex_key {
3174 name: "myapex.key",
3175 public_key: "testkey.avbpubkey",
3176 private_key: "testkey.pem",
3177 }
3178 prebuilt_firmware {
3179 name: "myfirmware",
3180 src: "myfirmware.bin",
3181 filename_from_src: true,
3182 `+tc.additionalProp+`
3183 }
3184 `)
3185 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3186 "etc/firmware/myfirmware.bin",
3187 })
3188 })
3189 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003190}
3191
Jooyung Hanefb184e2020-06-25 17:14:25 +09003192func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003193 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003194 apex {
3195 name: "myapex",
3196 key: "myapex.key",
3197 vendor: true,
3198 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003199 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003200 }
3201
3202 apex_key {
3203 name: "myapex.key",
3204 public_key: "testkey.avbpubkey",
3205 private_key: "testkey.pem",
3206 }
3207
3208 cc_library {
3209 name: "mylib",
3210 vendor_available: true,
3211 }
3212 `)
3213
3214 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003215 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003216 name := apexBundle.BaseModuleName()
3217 prefix := "TARGET_"
3218 var builder strings.Builder
3219 data.Custom(&builder, name, prefix, "", data)
3220 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003221 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 +09003222}
3223
Jooyung Han2ed99d02020-06-24 23:26:26 +09003224func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003225 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003226 apex {
3227 name: "myapex",
3228 key: "myapex.key",
3229 vintf_fragments: ["fragment.xml"],
3230 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003231 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003232 }
3233 apex_key {
3234 name: "myapex.key",
3235 public_key: "testkey.avbpubkey",
3236 private_key: "testkey.pem",
3237 }
3238 cc_binary {
3239 name: "mybin",
3240 }
3241 `)
3242
3243 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003244 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003245 name := apexBundle.BaseModuleName()
3246 prefix := "TARGET_"
3247 var builder strings.Builder
3248 data.Custom(&builder, name, prefix, "", data)
3249 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003250 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003251 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003252}
3253
Jiyong Park16e91a02018-12-20 18:18:08 +09003254func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003255 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003256 apex {
3257 name: "myapex",
3258 key: "myapex.key",
3259 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003260 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003261 }
3262
3263 apex_key {
3264 name: "myapex.key",
3265 public_key: "testkey.avbpubkey",
3266 private_key: "testkey.pem",
3267 }
3268
3269 cc_library {
3270 name: "mylib",
3271 srcs: ["mylib.cpp"],
3272 system_shared_libs: [],
3273 stl: "none",
3274 stubs: {
3275 versions: ["1", "2", "3"],
3276 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003277 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003278 }
3279
3280 cc_binary {
3281 name: "not_in_apex",
3282 srcs: ["mylib.cpp"],
3283 static_libs: ["mylib"],
3284 static_executable: true,
3285 system_shared_libs: [],
3286 stl: "none",
3287 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003288 `)
3289
Colin Cross7113d202019-11-20 16:39:12 -08003290 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003291
3292 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003293 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003294}
Jiyong Park9335a262018-12-24 11:31:58 +09003295
3296func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003297 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003298 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003299 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003300 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003301 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003302 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003303 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003304 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003305 }
3306
3307 cc_library {
3308 name: "mylib",
3309 srcs: ["mylib.cpp"],
3310 system_shared_libs: [],
3311 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003312 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003313 }
3314
3315 apex_key {
3316 name: "myapex.key",
3317 public_key: "testkey.avbpubkey",
3318 private_key: "testkey.pem",
3319 }
3320
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003321 android_app_certificate {
3322 name: "myapex.certificate",
3323 certificate: "testkey",
3324 }
3325
3326 android_app_certificate {
3327 name: "myapex.certificate.override",
3328 certificate: "testkey.override",
3329 }
3330
Jiyong Park9335a262018-12-24 11:31:58 +09003331 `)
3332
3333 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003334 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003335
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003336 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3337 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003338 "vendor/foo/devkeys/testkey.avbpubkey")
3339 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003340 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3341 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003342 "vendor/foo/devkeys/testkey.pem")
3343 }
3344
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003345 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003346 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003347 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003348 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003349 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003350 }
3351}
Jiyong Park58e364a2019-01-19 19:24:06 +09003352
Jooyung Hanf121a652019-12-17 14:30:11 +09003353func TestCertificate(t *testing.T) {
3354 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003355 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003356 apex {
3357 name: "myapex",
3358 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003359 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003360 }
3361 apex_key {
3362 name: "myapex.key",
3363 public_key: "testkey.avbpubkey",
3364 private_key: "testkey.pem",
3365 }`)
3366 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3367 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3368 if actual := rule.Args["certificates"]; actual != expected {
3369 t.Errorf("certificates should be %q, not %q", expected, actual)
3370 }
3371 })
3372 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003373 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003374 apex {
3375 name: "myapex_keytest",
3376 key: "myapex.key",
3377 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003378 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003379 }
3380 apex_key {
3381 name: "myapex.key",
3382 public_key: "testkey.avbpubkey",
3383 private_key: "testkey.pem",
3384 }
3385 android_app_certificate {
3386 name: "myapex.certificate.override",
3387 certificate: "testkey.override",
3388 }`)
3389 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3390 expected := "testkey.override.x509.pem testkey.override.pk8"
3391 if actual := rule.Args["certificates"]; actual != expected {
3392 t.Errorf("certificates should be %q, not %q", expected, actual)
3393 }
3394 })
3395 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003396 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003397 apex {
3398 name: "myapex",
3399 key: "myapex.key",
3400 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003401 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003402 }
3403 apex_key {
3404 name: "myapex.key",
3405 public_key: "testkey.avbpubkey",
3406 private_key: "testkey.pem",
3407 }
3408 android_app_certificate {
3409 name: "myapex.certificate",
3410 certificate: "testkey",
3411 }`)
3412 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3413 expected := "testkey.x509.pem testkey.pk8"
3414 if actual := rule.Args["certificates"]; actual != expected {
3415 t.Errorf("certificates should be %q, not %q", expected, actual)
3416 }
3417 })
3418 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003419 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003420 apex {
3421 name: "myapex_keytest",
3422 key: "myapex.key",
3423 file_contexts: ":myapex-file_contexts",
3424 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003425 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003426 }
3427 apex_key {
3428 name: "myapex.key",
3429 public_key: "testkey.avbpubkey",
3430 private_key: "testkey.pem",
3431 }
3432 android_app_certificate {
3433 name: "myapex.certificate.override",
3434 certificate: "testkey.override",
3435 }`)
3436 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3437 expected := "testkey.override.x509.pem testkey.override.pk8"
3438 if actual := rule.Args["certificates"]; actual != expected {
3439 t.Errorf("certificates should be %q, not %q", expected, actual)
3440 }
3441 })
3442 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003443 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003444 apex {
3445 name: "myapex",
3446 key: "myapex.key",
3447 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003448 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003449 }
3450 apex_key {
3451 name: "myapex.key",
3452 public_key: "testkey.avbpubkey",
3453 private_key: "testkey.pem",
3454 }`)
3455 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3456 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3457 if actual := rule.Args["certificates"]; actual != expected {
3458 t.Errorf("certificates should be %q, not %q", expected, actual)
3459 }
3460 })
3461 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003462 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003463 apex {
3464 name: "myapex_keytest",
3465 key: "myapex.key",
3466 file_contexts: ":myapex-file_contexts",
3467 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003468 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003469 }
3470 apex_key {
3471 name: "myapex.key",
3472 public_key: "testkey.avbpubkey",
3473 private_key: "testkey.pem",
3474 }
3475 android_app_certificate {
3476 name: "myapex.certificate.override",
3477 certificate: "testkey.override",
3478 }`)
3479 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3480 expected := "testkey.override.x509.pem testkey.override.pk8"
3481 if actual := rule.Args["certificates"]; actual != expected {
3482 t.Errorf("certificates should be %q, not %q", expected, actual)
3483 }
3484 })
3485}
3486
Jiyong Park58e364a2019-01-19 19:24:06 +09003487func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003488 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003489 apex {
3490 name: "myapex",
3491 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003492 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003493 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003494 }
3495
3496 apex {
3497 name: "otherapex",
3498 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003499 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003500 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003501 }
3502
3503 apex_key {
3504 name: "myapex.key",
3505 public_key: "testkey.avbpubkey",
3506 private_key: "testkey.pem",
3507 }
3508
3509 cc_library {
3510 name: "mylib",
3511 srcs: ["mylib.cpp"],
3512 system_shared_libs: [],
3513 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003514 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003515 "myapex",
3516 "otherapex",
3517 ],
Jooyung Han24282772020-03-21 23:20:55 +09003518 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003519 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003520 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003521 cc_library {
3522 name: "mylib2",
3523 srcs: ["mylib.cpp"],
3524 system_shared_libs: [],
3525 stl: "none",
3526 apex_available: [
3527 "myapex",
3528 "otherapex",
3529 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003530 static_libs: ["mylib3"],
3531 recovery_available: true,
3532 min_sdk_version: "29",
3533 }
3534 cc_library {
3535 name: "mylib3",
3536 srcs: ["mylib.cpp"],
3537 system_shared_libs: [],
3538 stl: "none",
3539 apex_available: [
3540 "myapex",
3541 "otherapex",
3542 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003543 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003544 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003545 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003546 `)
3547
Jooyung Hanc87a0592020-03-02 17:44:33 +09003548 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003549 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003550 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003551
Vinh Tranf9754732023-01-19 22:41:46 -05003552 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003553 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003554 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003555
Vinh Tranf9754732023-01-19 22:41:46 -05003556 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003557 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003558 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003559
Colin Crossaede88c2020-08-11 12:17:01 -07003560 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3561 // each variant defines additional macros to distinguish which apex variant it is built for
3562
3563 // non-APEX variant does not have __ANDROID_APEX__ defined
3564 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3565 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3566
Vinh Tranf9754732023-01-19 22:41:46 -05003567 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003568 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3569 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003570
Jooyung Hanc87a0592020-03-02 17:44:33 +09003571 // non-APEX variant does not have __ANDROID_APEX__ defined
3572 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3573 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3574
Vinh Tranf9754732023-01-19 22:41:46 -05003575 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003576 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003577 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003578}
Jiyong Park7e636d02019-01-28 16:16:54 +09003579
3580func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003581 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003582 apex {
3583 name: "myapex",
3584 key: "myapex.key",
3585 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003586 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003587 }
3588
3589 apex_key {
3590 name: "myapex.key",
3591 public_key: "testkey.avbpubkey",
3592 private_key: "testkey.pem",
3593 }
3594
3595 cc_library_headers {
3596 name: "mylib_headers",
3597 export_include_dirs: ["my_include"],
3598 system_shared_libs: [],
3599 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003600 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003601 }
3602
3603 cc_library {
3604 name: "mylib",
3605 srcs: ["mylib.cpp"],
3606 system_shared_libs: [],
3607 stl: "none",
3608 header_libs: ["mylib_headers"],
3609 export_header_lib_headers: ["mylib_headers"],
3610 stubs: {
3611 versions: ["1", "2", "3"],
3612 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003613 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003614 }
3615
3616 cc_library {
3617 name: "otherlib",
3618 srcs: ["mylib.cpp"],
3619 system_shared_libs: [],
3620 stl: "none",
3621 shared_libs: ["mylib"],
3622 }
3623 `)
3624
Colin Cross7113d202019-11-20 16:39:12 -08003625 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003626
3627 // Ensure that the include path of the header lib is exported to 'otherlib'
3628 ensureContains(t, cFlags, "-Imy_include")
3629}
Alex Light9670d332019-01-29 18:07:33 -08003630
Jiyong Park7cd10e32020-01-14 09:22:18 +09003631type fileInApex struct {
3632 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003633 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003634 isLink bool
3635}
3636
Jooyung Han1724d582022-12-21 10:17:44 +09003637func (f fileInApex) String() string {
3638 return f.src + ":" + f.path
3639}
3640
3641func (f fileInApex) match(expectation string) bool {
3642 parts := strings.Split(expectation, ":")
3643 if len(parts) == 1 {
3644 match, _ := path.Match(parts[0], f.path)
3645 return match
3646 }
3647 if len(parts) == 2 {
3648 matchSrc, _ := path.Match(parts[0], f.src)
3649 matchDst, _ := path.Match(parts[1], f.path)
3650 return matchSrc && matchDst
3651 }
3652 panic("invalid expected file specification: " + expectation)
3653}
3654
Jooyung Hana57af4a2020-01-23 05:36:59 +00003655func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003656 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003657 module := ctx.ModuleForTests(moduleName, variant)
3658 apexRule := module.MaybeRule("apexRule")
3659 apexDir := "/image.apex/"
3660 if apexRule.Rule == nil {
3661 apexRule = module.Rule("zipApexRule")
3662 apexDir = "/image.zipapex/"
3663 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003664 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003665 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003666 for _, cmd := range strings.Split(copyCmds, "&&") {
3667 cmd = strings.TrimSpace(cmd)
3668 if cmd == "" {
3669 continue
3670 }
3671 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003672 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003673 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003674 switch terms[0] {
3675 case "mkdir":
3676 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003677 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003678 t.Fatal("copyCmds contains invalid cp command", cmd)
3679 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003680 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003681 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003682 isLink = false
3683 case "ln":
3684 if len(terms) != 3 && len(terms) != 4 {
3685 // ln LINK TARGET or ln -s LINK TARGET
3686 t.Fatal("copyCmds contains invalid ln command", cmd)
3687 }
3688 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003689 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003690 isLink = true
3691 default:
3692 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3693 }
3694 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003695 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003696 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003697 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003698 }
Jooyung Han1724d582022-12-21 10:17:44 +09003699 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003700 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003701 }
3702 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003703 return ret
3704}
3705
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003706func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003707 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003708 var failed bool
3709 var surplus []string
3710 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003711 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003712 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003713 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003714 if file.match(expected) {
3715 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003716 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003717 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003718 }
3719 }
Jooyung Han1724d582022-12-21 10:17:44 +09003720 if !matchFound {
3721 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003722 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003723 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003724
Jooyung Han31c470b2019-10-18 16:26:59 +09003725 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003726 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003727 t.Log("surplus files", surplus)
3728 failed = true
3729 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003730
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003731 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003732 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003733 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003734 if !filesMatched[expected] {
3735 missing = append(missing, expected)
3736 }
3737 }
3738 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003739 t.Log("missing files", missing)
3740 failed = true
3741 }
3742 if failed {
3743 t.Fail()
3744 }
3745}
3746
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003747func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3748 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3749}
3750
3751func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3752 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3753 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3754 if deapexer.Output != nil {
3755 outputs = append(outputs, deapexer.Output.String())
3756 }
3757 for _, output := range deapexer.ImplicitOutputs {
3758 outputs = append(outputs, output.String())
3759 }
3760 actualFiles := make([]fileInApex, 0, len(outputs))
3761 for _, output := range outputs {
3762 dir := "/deapexer/"
3763 pos := strings.LastIndex(output, dir)
3764 if pos == -1 {
3765 t.Fatal("Unknown deapexer output ", output)
3766 }
3767 path := output[pos+len(dir):]
3768 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3769 }
3770 assertFileListEquals(t, files, actualFiles)
3771}
3772
Jooyung Han344d5432019-08-23 11:17:39 +09003773func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003774 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003775 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003776 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003777 "etc/llndk.libraries.29.txt",
3778 "etc/vndkcore.libraries.29.txt",
3779 "etc/vndksp.libraries.29.txt",
3780 "etc/vndkprivate.libraries.29.txt",
3781 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003782 }
3783 testCases := []struct {
3784 vndkVersion string
3785 expectedFiles []string
3786 }{
3787 {
3788 vndkVersion: "current",
3789 expectedFiles: append(commonFiles,
3790 "lib/libvndk.so",
3791 "lib/libvndksp.so",
3792 "lib64/libvndk.so",
3793 "lib64/libvndksp.so"),
3794 },
3795 {
3796 vndkVersion: "",
3797 expectedFiles: append(commonFiles,
3798 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3799 "lib/libvndksp.so",
3800 "lib64/libvndksp.so"),
3801 },
3802 }
3803 for _, tc := range testCases {
3804 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3805 ctx := testApex(t, `
3806 apex_vndk {
3807 name: "com.android.vndk.current",
3808 key: "com.android.vndk.current.key",
3809 updatable: false,
3810 }
3811
3812 apex_key {
3813 name: "com.android.vndk.current.key",
3814 public_key: "testkey.avbpubkey",
3815 private_key: "testkey.pem",
3816 }
3817
3818 cc_library {
3819 name: "libvndk",
3820 srcs: ["mylib.cpp"],
3821 vendor_available: true,
3822 product_available: true,
3823 vndk: {
3824 enabled: true,
3825 },
3826 system_shared_libs: [],
3827 stl: "none",
3828 apex_available: [ "com.android.vndk.current" ],
3829 }
3830
3831 cc_library {
3832 name: "libvndksp",
3833 srcs: ["mylib.cpp"],
3834 vendor_available: true,
3835 product_available: true,
3836 vndk: {
3837 enabled: true,
3838 support_system_process: true,
3839 },
3840 system_shared_libs: [],
3841 stl: "none",
3842 apex_available: [ "com.android.vndk.current" ],
3843 }
3844
3845 // VNDK-Ext should not cause any problems
3846
3847 cc_library {
3848 name: "libvndk.ext",
3849 srcs: ["mylib2.cpp"],
3850 vendor: true,
3851 vndk: {
3852 enabled: true,
3853 extends: "libvndk",
3854 },
3855 system_shared_libs: [],
3856 stl: "none",
3857 }
3858
3859 cc_library {
3860 name: "libvndksp.ext",
3861 srcs: ["mylib2.cpp"],
3862 vendor: true,
3863 vndk: {
3864 enabled: true,
3865 support_system_process: true,
3866 extends: "libvndksp",
3867 },
3868 system_shared_libs: [],
3869 stl: "none",
3870 }
3871 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3872 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3873 }))
3874 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3875 })
3876 }
Jooyung Han344d5432019-08-23 11:17:39 +09003877}
3878
3879func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003880 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003881 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003882 name: "com.android.vndk.current",
3883 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003884 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003885 }
3886
3887 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003888 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003889 public_key: "testkey.avbpubkey",
3890 private_key: "testkey.pem",
3891 }
3892
3893 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003894 name: "libvndk",
3895 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003896 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003897 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003898 vndk: {
3899 enabled: true,
3900 },
3901 system_shared_libs: [],
3902 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003903 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003904 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003905
3906 cc_prebuilt_library_shared {
3907 name: "libvndk.arm",
3908 srcs: ["libvndk.arm.so"],
3909 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003910 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003911 vndk: {
3912 enabled: true,
3913 },
3914 enabled: false,
3915 arch: {
3916 arm: {
3917 enabled: true,
3918 },
3919 },
3920 system_shared_libs: [],
3921 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003922 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003923 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003924 `+vndkLibrariesTxtFiles("current"),
3925 withFiles(map[string][]byte{
3926 "libvndk.so": nil,
3927 "libvndk.arm.so": nil,
3928 }))
Colin Cross2807f002021-03-02 10:15:29 -08003929 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003930 "lib/libvndk.so",
3931 "lib/libvndk.arm.so",
3932 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003933 "lib/libc++.so",
3934 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003935 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003936 })
Jooyung Han344d5432019-08-23 11:17:39 +09003937}
3938
Jooyung Han39edb6c2019-11-06 16:53:07 +09003939func vndkLibrariesTxtFiles(vers ...string) (result string) {
3940 for _, v := range vers {
3941 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003942 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003943 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003944 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003945 name: "` + txt + `.libraries.txt",
3946 }
3947 `
3948 }
3949 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003950 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003951 result += `
3952 prebuilt_etc {
3953 name: "` + txt + `.libraries.` + v + `.txt",
3954 src: "dummy.txt",
3955 }
3956 `
3957 }
3958 }
3959 }
3960 return
3961}
3962
Jooyung Han344d5432019-08-23 11:17:39 +09003963func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003964 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003965 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003966 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003967 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003968 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003969 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003970 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003971 }
3972
3973 apex_key {
3974 name: "myapex.key",
3975 public_key: "testkey.avbpubkey",
3976 private_key: "testkey.pem",
3977 }
3978
Jooyung Han31c470b2019-10-18 16:26:59 +09003979 vndk_prebuilt_shared {
3980 name: "libvndk27",
3981 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003982 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003983 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003984 vndk: {
3985 enabled: true,
3986 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003987 target_arch: "arm64",
3988 arch: {
3989 arm: {
3990 srcs: ["libvndk27_arm.so"],
3991 },
3992 arm64: {
3993 srcs: ["libvndk27_arm64.so"],
3994 },
3995 },
Colin Cross2807f002021-03-02 10:15:29 -08003996 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003997 }
3998
3999 vndk_prebuilt_shared {
4000 name: "libvndk27",
4001 version: "27",
4002 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004003 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004004 vndk: {
4005 enabled: true,
4006 },
Jooyung Han31c470b2019-10-18 16:26:59 +09004007 target_arch: "x86_64",
4008 arch: {
4009 x86: {
4010 srcs: ["libvndk27_x86.so"],
4011 },
4012 x86_64: {
4013 srcs: ["libvndk27_x86_64.so"],
4014 },
4015 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09004016 }
4017 `+vndkLibrariesTxtFiles("27"),
4018 withFiles(map[string][]byte{
4019 "libvndk27_arm.so": nil,
4020 "libvndk27_arm64.so": nil,
4021 "libvndk27_x86.so": nil,
4022 "libvndk27_x86_64.so": nil,
4023 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004024
Colin Cross2807f002021-03-02 10:15:29 -08004025 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004026 "lib/libvndk27_arm.so",
4027 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004028 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004029 })
Jooyung Han344d5432019-08-23 11:17:39 +09004030}
4031
Jooyung Han90eee022019-10-01 20:02:42 +09004032func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004033 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004034 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004035 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09004036 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004037 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004038 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004039 }
4040 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004041 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004042 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004043 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004044 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004045 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004046 }
4047 apex_key {
4048 name: "myapex.key",
4049 public_key: "testkey.avbpubkey",
4050 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004051 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004052
4053 assertApexName := func(expected, moduleName string) {
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004054 module := ctx.ModuleForTests(moduleName, "android_common_image")
4055 apexManifestRule := module.Rule("apexManifestRule")
4056 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004057 }
4058
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004059 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004060 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004061}
4062
Jooyung Han344d5432019-08-23 11:17:39 +09004063func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004064 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004065 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004066 name: "com.android.vndk.current",
4067 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004068 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004069 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004070 }
4071
4072 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004073 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004074 public_key: "testkey.avbpubkey",
4075 private_key: "testkey.pem",
4076 }
4077
4078 cc_library {
4079 name: "libvndk",
4080 srcs: ["mylib.cpp"],
4081 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004082 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004083 native_bridge_supported: true,
4084 host_supported: true,
4085 vndk: {
4086 enabled: true,
4087 },
4088 system_shared_libs: [],
4089 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004090 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004091 }
Colin Cross2807f002021-03-02 10:15:29 -08004092 `+vndkLibrariesTxtFiles("current"),
4093 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004094
Colin Cross2807f002021-03-02 10:15:29 -08004095 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004096 "lib/libvndk.so",
4097 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004098 "lib/libc++.so",
4099 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004100 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004101 })
Jooyung Han344d5432019-08-23 11:17:39 +09004102}
4103
4104func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004105 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004106 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004107 name: "com.android.vndk.current",
4108 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004109 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004110 native_bridge_supported: true,
4111 }
4112
4113 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004114 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004115 public_key: "testkey.avbpubkey",
4116 private_key: "testkey.pem",
4117 }
4118
4119 cc_library {
4120 name: "libvndk",
4121 srcs: ["mylib.cpp"],
4122 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004123 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004124 native_bridge_supported: true,
4125 host_supported: true,
4126 vndk: {
4127 enabled: true,
4128 },
4129 system_shared_libs: [],
4130 stl: "none",
4131 }
4132 `)
4133}
4134
Jooyung Han31c470b2019-10-18 16:26:59 +09004135func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004136 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004137 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004138 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004139 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004140 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004141 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004142 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004143 }
4144
4145 apex_key {
4146 name: "myapex.key",
4147 public_key: "testkey.avbpubkey",
4148 private_key: "testkey.pem",
4149 }
4150
4151 vndk_prebuilt_shared {
4152 name: "libvndk27",
4153 version: "27",
4154 target_arch: "arm",
4155 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004156 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004157 vndk: {
4158 enabled: true,
4159 },
4160 arch: {
4161 arm: {
4162 srcs: ["libvndk27.so"],
4163 }
4164 },
4165 }
4166
4167 vndk_prebuilt_shared {
4168 name: "libvndk27",
4169 version: "27",
4170 target_arch: "arm",
4171 binder32bit: true,
4172 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004173 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004174 vndk: {
4175 enabled: true,
4176 },
4177 arch: {
4178 arm: {
4179 srcs: ["libvndk27binder32.so"],
4180 }
4181 },
Colin Cross2807f002021-03-02 10:15:29 -08004182 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004183 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004184 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004185 withFiles(map[string][]byte{
4186 "libvndk27.so": nil,
4187 "libvndk27binder32.so": nil,
4188 }),
4189 withBinder32bit,
4190 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004191 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004192 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4193 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004194 },
4195 }),
4196 )
4197
Colin Cross2807f002021-03-02 10:15:29 -08004198 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004199 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004200 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004201 })
4202}
4203
Jooyung Han45a96772020-06-15 14:59:42 +09004204func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004205 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004206 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004207 name: "com.android.vndk.current",
4208 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004209 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004210 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004211 }
4212
4213 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004214 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004215 public_key: "testkey.avbpubkey",
4216 private_key: "testkey.pem",
4217 }
4218
4219 cc_library {
4220 name: "libz",
4221 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004222 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004223 vndk: {
4224 enabled: true,
4225 },
4226 stubs: {
4227 symbol_file: "libz.map.txt",
4228 versions: ["30"],
4229 }
4230 }
4231 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4232 "libz.map.txt": nil,
4233 }))
4234
Colin Cross2807f002021-03-02 10:15:29 -08004235 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004236 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4237 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09004238 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
4239 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4240 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4241 "*/*",
4242 })
Jooyung Han45a96772020-06-15 14:59:42 +09004243}
4244
Jooyung Hane3f02812023-05-08 13:54:50 +09004245func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4246 ctx := testApex(t, "",
4247 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4248 variables.DeviceVndkVersion = proptools.StringPtr("27")
4249 }),
4250 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4251 cc.RegisterVendorSnapshotModules(ctx)
4252 }),
4253 withFiles(map[string][]byte{
4254 "vendor/foo/Android.bp": []byte(`
4255 apex {
4256 name: "myapex",
4257 binaries: ["foo"],
4258 key: "myapex.key",
4259 min_sdk_version: "27",
4260 vendor: true,
4261 }
4262
4263 cc_binary {
4264 name: "foo",
4265 vendor: true,
4266 srcs: ["abc.cpp"],
4267 shared_libs: [
4268 "libllndk",
4269 "libvndk",
4270 ],
4271 nocrt: true,
4272 system_shared_libs: [],
4273 min_sdk_version: "27",
4274 }
4275
4276 apex_key {
4277 name: "myapex.key",
4278 public_key: "testkey.avbpubkey",
4279 private_key: "testkey.pem",
4280 }
4281 `),
4282 // Simulate VNDK prebuilts with vendor_snapshot
4283 "prebuilts/vndk/Android.bp": []byte(`
4284 vndk_prebuilt_shared {
4285 name: "libllndk",
4286 version: "27",
4287 vendor_available: true,
4288 product_available: true,
4289 target_arch: "arm64",
4290 arch: {
4291 arm64: {
4292 srcs: ["libllndk.so"],
4293 },
4294 },
4295 }
4296
4297 vndk_prebuilt_shared {
4298 name: "libvndk",
4299 version: "27",
4300 vendor_available: true,
4301 product_available: true,
4302 target_arch: "arm64",
4303 arch: {
4304 arm64: {
4305 srcs: ["libvndk.so"],
4306 },
4307 },
4308 vndk: {
4309 enabled: true,
4310 },
4311 min_sdk_version: "27",
4312 }
4313
4314 vndk_prebuilt_shared {
4315 name: "libc++",
4316 version: "27",
4317 target_arch: "arm64",
4318 vendor_available: true,
4319 product_available: true,
4320 vndk: {
4321 enabled: true,
4322 support_system_process: true,
4323 },
4324 arch: {
4325 arm64: {
4326 srcs: ["libc++.so"],
4327 },
4328 },
4329 min_sdk_version: "apex_inherit",
4330 }
4331
4332 vendor_snapshot {
4333 name: "vendor_snapshot",
4334 version: "27",
4335 arch: {
4336 arm64: {
4337 vndk_libs: [
4338 "libc++",
4339 "libllndk",
4340 "libvndk",
4341 ],
4342 static_libs: [
4343 "libc++demangle",
4344 "libclang_rt.builtins",
4345 "libunwind",
4346 ],
4347 },
4348 }
4349 }
4350
4351 vendor_snapshot_static {
4352 name: "libclang_rt.builtins",
4353 version: "27",
4354 target_arch: "arm64",
4355 vendor: true,
4356 arch: {
4357 arm64: {
4358 src: "libclang_rt.builtins-aarch64-android.a",
4359 },
4360 },
4361 }
4362
4363 vendor_snapshot_static {
4364 name: "libc++demangle",
4365 version: "27",
4366 target_arch: "arm64",
4367 compile_multilib: "64",
4368 vendor: true,
4369 arch: {
4370 arm64: {
4371 src: "libc++demangle.a",
4372 },
4373 },
4374 min_sdk_version: "apex_inherit",
4375 }
4376
4377 vendor_snapshot_static {
4378 name: "libunwind",
4379 version: "27",
4380 target_arch: "arm64",
4381 compile_multilib: "64",
4382 vendor: true,
4383 arch: {
4384 arm64: {
4385 src: "libunwind.a",
4386 },
4387 },
4388 min_sdk_version: "apex_inherit",
4389 }
4390 `),
4391 }))
4392
4393 // Should embed the prebuilt VNDK libraries in the apex
4394 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4395 "bin/foo",
4396 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4397 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4398 })
4399
4400 // Should link foo with prebuilt libraries (shared/static)
4401 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4402 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4403 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4404 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4405 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4406
4407 // Should declare the LLNDK library as a "required" external dependency
4408 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4409 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4410 ensureListContains(t, requireNativeLibs, "libllndk.so")
4411}
4412
Jooyung Hane1633032019-08-01 17:41:43 +09004413func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004414 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004415 apex {
4416 name: "myapex_nodep",
4417 key: "myapex.key",
4418 native_shared_libs: ["lib_nodep"],
4419 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004420 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004421 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004422 }
4423
4424 apex {
4425 name: "myapex_dep",
4426 key: "myapex.key",
4427 native_shared_libs: ["lib_dep"],
4428 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004429 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004430 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004431 }
4432
4433 apex {
4434 name: "myapex_provider",
4435 key: "myapex.key",
4436 native_shared_libs: ["libfoo"],
4437 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004438 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004439 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004440 }
4441
4442 apex {
4443 name: "myapex_selfcontained",
4444 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004445 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004446 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004447 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004448 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004449 }
4450
4451 apex_key {
4452 name: "myapex.key",
4453 public_key: "testkey.avbpubkey",
4454 private_key: "testkey.pem",
4455 }
4456
4457 cc_library {
4458 name: "lib_nodep",
4459 srcs: ["mylib.cpp"],
4460 system_shared_libs: [],
4461 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004462 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004463 }
4464
4465 cc_library {
4466 name: "lib_dep",
4467 srcs: ["mylib.cpp"],
4468 shared_libs: ["libfoo"],
4469 system_shared_libs: [],
4470 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004471 apex_available: [
4472 "myapex_dep",
4473 "myapex_provider",
4474 "myapex_selfcontained",
4475 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004476 }
4477
4478 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004479 name: "lib_dep_on_bar",
4480 srcs: ["mylib.cpp"],
4481 shared_libs: ["libbar"],
4482 system_shared_libs: [],
4483 stl: "none",
4484 apex_available: [
4485 "myapex_selfcontained",
4486 ],
4487 }
4488
4489
4490 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004491 name: "libfoo",
4492 srcs: ["mytest.cpp"],
4493 stubs: {
4494 versions: ["1"],
4495 },
4496 system_shared_libs: [],
4497 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004498 apex_available: [
4499 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004500 ],
4501 }
4502
4503 cc_library {
4504 name: "libbar",
4505 srcs: ["mytest.cpp"],
4506 stubs: {
4507 versions: ["1"],
4508 },
4509 system_shared_libs: [],
4510 stl: "none",
4511 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004512 "myapex_selfcontained",
4513 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004514 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004515
Jooyung Hane1633032019-08-01 17:41:43 +09004516 `)
4517
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004518 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004519 var provideNativeLibs, requireNativeLibs []string
4520
Sundong Ahnabb64432019-10-22 13:58:29 +09004521 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004522 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4523 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004524 ensureListEmpty(t, provideNativeLibs)
4525 ensureListEmpty(t, requireNativeLibs)
4526
Sundong Ahnabb64432019-10-22 13:58:29 +09004527 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004528 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4529 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004530 ensureListEmpty(t, provideNativeLibs)
4531 ensureListContains(t, requireNativeLibs, "libfoo.so")
4532
Sundong Ahnabb64432019-10-22 13:58:29 +09004533 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004534 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4535 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004536 ensureListContains(t, provideNativeLibs, "libfoo.so")
4537 ensureListEmpty(t, requireNativeLibs)
4538
Sundong Ahnabb64432019-10-22 13:58:29 +09004539 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004540 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4541 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004542 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004543 ensureListEmpty(t, requireNativeLibs)
4544}
4545
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004546func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4547 ctx := testApex(t, `
4548 apex {
4549 name: "myapex",
4550 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004551 native_shared_libs: ["mylib"],
4552 updatable: false,
4553 }
4554
4555 apex_key {
4556 name: "myapex.key",
4557 public_key: "testkey.avbpubkey",
4558 private_key: "testkey.pem",
4559 }
4560
4561 cc_library {
4562 name: "mylib",
4563 srcs: ["mylib.cpp"],
4564 system_shared_libs: [],
4565 stl: "none",
4566 apex_available: [
4567 "//apex_available:platform",
4568 "myapex",
4569 ],
4570 }
4571 `, android.FixtureMergeEnv(map[string]string{
4572 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4573 }))
4574
Jooyung Han63dff462023-02-09 00:11:27 +00004575 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004576 apexManifestRule := module.Rule("apexManifestRule")
4577 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4578}
4579
Vinh Tran8f5310f2022-10-07 18:16:47 -04004580func TestCompileMultilibProp(t *testing.T) {
4581 testCases := []struct {
4582 compileMultiLibProp string
4583 containedLibs []string
4584 notContainedLibs []string
4585 }{
4586 {
4587 containedLibs: []string{
4588 "image.apex/lib64/mylib.so",
4589 "image.apex/lib/mylib.so",
4590 },
4591 compileMultiLibProp: `compile_multilib: "both",`,
4592 },
4593 {
4594 containedLibs: []string{"image.apex/lib64/mylib.so"},
4595 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4596 compileMultiLibProp: `compile_multilib: "first",`,
4597 },
4598 {
4599 containedLibs: []string{"image.apex/lib64/mylib.so"},
4600 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4601 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4602 },
4603 {
4604 containedLibs: []string{"image.apex/lib64/mylib.so"},
4605 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4606 compileMultiLibProp: `compile_multilib: "64",`,
4607 },
4608 {
4609 containedLibs: []string{"image.apex/lib/mylib.so"},
4610 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4611 compileMultiLibProp: `compile_multilib: "32",`,
4612 },
4613 }
4614 for _, testCase := range testCases {
4615 ctx := testApex(t, fmt.Sprintf(`
4616 apex {
4617 name: "myapex",
4618 key: "myapex.key",
4619 %s
4620 native_shared_libs: ["mylib"],
4621 updatable: false,
4622 }
4623 apex_key {
4624 name: "myapex.key",
4625 public_key: "testkey.avbpubkey",
4626 private_key: "testkey.pem",
4627 }
4628 cc_library {
4629 name: "mylib",
4630 srcs: ["mylib.cpp"],
4631 apex_available: [
4632 "//apex_available:platform",
4633 "myapex",
4634 ],
4635 }
4636 `, testCase.compileMultiLibProp),
4637 )
4638 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4639 apexRule := module.Rule("apexRule")
4640 copyCmds := apexRule.Args["copy_commands"]
4641 for _, containedLib := range testCase.containedLibs {
4642 ensureContains(t, copyCmds, containedLib)
4643 }
4644 for _, notContainedLib := range testCase.notContainedLibs {
4645 ensureNotContains(t, copyCmds, notContainedLib)
4646 }
4647 }
4648}
4649
Alex Light0851b882019-02-07 13:20:53 -08004650func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004651 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004652 apex {
4653 name: "myapex",
4654 key: "myapex.key",
4655 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004656 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004657 }
4658
4659 apex_key {
4660 name: "myapex.key",
4661 public_key: "testkey.avbpubkey",
4662 private_key: "testkey.pem",
4663 }
4664
4665 cc_library {
4666 name: "mylib_common",
4667 srcs: ["mylib.cpp"],
4668 system_shared_libs: [],
4669 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004670 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 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"), "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.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"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004696
Colin Cross56a83212020-09-15 18:30:11 -07004697 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004698 t.Log("Found mylib_common not in any apex!")
4699 t.Fail()
4700 }
4701}
4702
4703func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004704 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004705 apex_test {
4706 name: "myapex",
4707 key: "myapex.key",
4708 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004709 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004710 }
4711
4712 apex_key {
4713 name: "myapex.key",
4714 public_key: "testkey.avbpubkey",
4715 private_key: "testkey.pem",
4716 }
4717
4718 cc_library {
4719 name: "mylib_common_test",
4720 srcs: ["mylib.cpp"],
4721 system_shared_libs: [],
4722 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004723 // TODO: remove //apex_available:platform
4724 apex_available: [
4725 "//apex_available:platform",
4726 "myapex",
4727 ],
Alex Light0851b882019-02-07 13:20:53 -08004728 }
4729 `)
4730
Sundong Ahnabb64432019-10-22 13:58:29 +09004731 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004732 apexRule := module.Rule("apexRule")
4733 copyCmds := apexRule.Args["copy_commands"]
4734
4735 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4736 t.Log("Apex was not a test apex!")
4737 t.Fail()
4738 }
4739 // Ensure that main rule creates an output
4740 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4741
4742 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004743 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004744
4745 // Ensure that both direct and indirect deps are copied into apex
4746 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4747
Colin Cross7113d202019-11-20 16:39:12 -08004748 // Ensure that the platform variant ends with _shared
4749 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004750}
4751
Alex Light9670d332019-01-29 18:07:33 -08004752func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004753 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004754 apex {
4755 name: "myapex",
4756 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004757 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004758 multilib: {
4759 first: {
4760 native_shared_libs: ["mylib_common"],
4761 }
4762 },
4763 target: {
4764 android: {
4765 multilib: {
4766 first: {
4767 native_shared_libs: ["mylib"],
4768 }
4769 }
4770 },
4771 host: {
4772 multilib: {
4773 first: {
4774 native_shared_libs: ["mylib2"],
4775 }
4776 }
4777 }
4778 }
4779 }
4780
4781 apex_key {
4782 name: "myapex.key",
4783 public_key: "testkey.avbpubkey",
4784 private_key: "testkey.pem",
4785 }
4786
4787 cc_library {
4788 name: "mylib",
4789 srcs: ["mylib.cpp"],
4790 system_shared_libs: [],
4791 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004792 // TODO: remove //apex_available:platform
4793 apex_available: [
4794 "//apex_available:platform",
4795 "myapex",
4796 ],
Alex Light9670d332019-01-29 18:07:33 -08004797 }
4798
4799 cc_library {
4800 name: "mylib_common",
4801 srcs: ["mylib.cpp"],
4802 system_shared_libs: [],
4803 stl: "none",
4804 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004805 // TODO: remove //apex_available:platform
4806 apex_available: [
4807 "//apex_available:platform",
4808 "myapex",
4809 ],
Alex Light9670d332019-01-29 18:07:33 -08004810 }
4811
4812 cc_library {
4813 name: "mylib2",
4814 srcs: ["mylib.cpp"],
4815 system_shared_libs: [],
4816 stl: "none",
4817 compile_multilib: "first",
4818 }
4819 `)
4820
Sundong Ahnabb64432019-10-22 13:58:29 +09004821 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004822 copyCmds := apexRule.Args["copy_commands"]
4823
4824 // Ensure that main rule creates an output
4825 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4826
4827 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004828 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4829 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4830 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004831
4832 // Ensure that both direct and indirect deps are copied into apex
4833 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4834 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4835 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4836
Colin Cross7113d202019-11-20 16:39:12 -08004837 // Ensure that the platform variant ends with _shared
4838 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4839 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4840 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004841}
Jiyong Park04480cf2019-02-06 00:16:29 +09004842
Jiyong Park59140302020-12-14 18:44:04 +09004843func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004844 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004845 apex {
4846 name: "myapex",
4847 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004848 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004849 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004850 arch: {
4851 arm64: {
4852 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004853 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004854 },
4855 x86_64: {
4856 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004857 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004858 },
4859 }
4860 }
4861
4862 apex_key {
4863 name: "myapex.key",
4864 public_key: "testkey.avbpubkey",
4865 private_key: "testkey.pem",
4866 }
4867
4868 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004869 name: "mylib.generic",
4870 srcs: ["mylib.cpp"],
4871 system_shared_libs: [],
4872 stl: "none",
4873 // TODO: remove //apex_available:platform
4874 apex_available: [
4875 "//apex_available:platform",
4876 "myapex",
4877 ],
4878 }
4879
4880 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004881 name: "mylib.arm64",
4882 srcs: ["mylib.cpp"],
4883 system_shared_libs: [],
4884 stl: "none",
4885 // TODO: remove //apex_available:platform
4886 apex_available: [
4887 "//apex_available:platform",
4888 "myapex",
4889 ],
4890 }
4891
4892 cc_library {
4893 name: "mylib.x64",
4894 srcs: ["mylib.cpp"],
4895 system_shared_libs: [],
4896 stl: "none",
4897 // TODO: remove //apex_available:platform
4898 apex_available: [
4899 "//apex_available:platform",
4900 "myapex",
4901 ],
4902 }
4903 `)
4904
4905 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4906 copyCmds := apexRule.Args["copy_commands"]
4907
4908 // Ensure that apex variant is created for the direct dep
4909 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004910 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004911 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4912
4913 // Ensure that both direct and indirect deps are copied into apex
4914 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4915 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4916}
4917
Jiyong Park04480cf2019-02-06 00:16:29 +09004918func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004919 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004920 apex {
4921 name: "myapex",
4922 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004923 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004924 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004925 }
4926
4927 apex_key {
4928 name: "myapex.key",
4929 public_key: "testkey.avbpubkey",
4930 private_key: "testkey.pem",
4931 }
4932
4933 sh_binary {
4934 name: "myscript",
4935 src: "mylib.cpp",
4936 filename: "myscript.sh",
4937 sub_dir: "script",
4938 }
4939 `)
4940
Sundong Ahnabb64432019-10-22 13:58:29 +09004941 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004942 copyCmds := apexRule.Args["copy_commands"]
4943
4944 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4945}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004946
Jooyung Han91df2082019-11-20 01:49:42 +09004947func TestApexInVariousPartition(t *testing.T) {
4948 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004949 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004950 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004951 {"", "system"},
4952 {"product_specific: true", "product"},
4953 {"soc_specific: true", "vendor"},
4954 {"proprietary: true", "vendor"},
4955 {"vendor: true", "vendor"},
4956 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004957 }
4958 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004959 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004960 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004961 apex {
4962 name: "myapex",
4963 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004964 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004965 `+tc.propName+`
4966 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004967
Jooyung Han91df2082019-11-20 01:49:42 +09004968 apex_key {
4969 name: "myapex.key",
4970 public_key: "testkey.avbpubkey",
4971 private_key: "testkey.pem",
4972 }
4973 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004974
Jooyung Han91df2082019-11-20 01:49:42 +09004975 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004976 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004977 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004978 if actual != expected {
4979 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4980 }
Jooyung Han91df2082019-11-20 01:49:42 +09004981 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004982 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004983}
Jiyong Park67882562019-03-21 01:11:21 +09004984
Jooyung Han580eb4f2020-06-24 19:33:06 +09004985func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
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",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004990 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004991 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004992
Jooyung Han580eb4f2020-06-24 19:33:06 +09004993 apex_key {
4994 name: "myapex.key",
4995 public_key: "testkey.avbpubkey",
4996 private_key: "testkey.pem",
4997 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004998 `)
4999 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005000 rule := module.Output("file_contexts")
5001 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
5002}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005003
Jooyung Han580eb4f2020-06-24 19:33:06 +09005004func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005005 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005006 apex {
5007 name: "myapex",
5008 key: "myapex.key",
5009 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005010 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005011 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005012
Jooyung Han580eb4f2020-06-24 19:33:06 +09005013 apex_key {
5014 name: "myapex.key",
5015 public_key: "testkey.avbpubkey",
5016 private_key: "testkey.pem",
5017 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005018 `, withFiles(map[string][]byte{
5019 "my_own_file_contexts": nil,
5020 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005021}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005022
Jooyung Han580eb4f2020-06-24 19:33:06 +09005023func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005024 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005025 apex {
5026 name: "myapex",
5027 key: "myapex.key",
5028 product_specific: true,
5029 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005030 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005031 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005032
Jooyung Han580eb4f2020-06-24 19:33:06 +09005033 apex_key {
5034 name: "myapex.key",
5035 public_key: "testkey.avbpubkey",
5036 private_key: "testkey.pem",
5037 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005038 `)
5039
Colin Cross1c460562021-02-16 17:55:47 -08005040 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005041 apex {
5042 name: "myapex",
5043 key: "myapex.key",
5044 product_specific: true,
5045 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005046 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005047 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005048
Jooyung Han580eb4f2020-06-24 19:33:06 +09005049 apex_key {
5050 name: "myapex.key",
5051 public_key: "testkey.avbpubkey",
5052 private_key: "testkey.pem",
5053 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005054 `, withFiles(map[string][]byte{
5055 "product_specific_file_contexts": nil,
5056 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005057 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5058 rule := module.Output("file_contexts")
5059 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5060}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005061
Jooyung Han580eb4f2020-06-24 19:33:06 +09005062func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005063 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005064 apex {
5065 name: "myapex",
5066 key: "myapex.key",
5067 product_specific: true,
5068 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005069 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005070 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005071
Jooyung Han580eb4f2020-06-24 19:33:06 +09005072 apex_key {
5073 name: "myapex.key",
5074 public_key: "testkey.avbpubkey",
5075 private_key: "testkey.pem",
5076 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005077
Jooyung Han580eb4f2020-06-24 19:33:06 +09005078 filegroup {
5079 name: "my-file-contexts",
5080 srcs: ["product_specific_file_contexts"],
5081 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005082 `, withFiles(map[string][]byte{
5083 "product_specific_file_contexts": nil,
5084 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005085 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5086 rule := module.Output("file_contexts")
5087 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005088}
5089
Jiyong Park67882562019-03-21 01:11:21 +09005090func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005091 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005092 apex_key {
5093 name: "myapex.key",
5094 public_key: ":my.avbpubkey",
5095 private_key: ":my.pem",
5096 product_specific: true,
5097 }
5098
5099 filegroup {
5100 name: "my.avbpubkey",
5101 srcs: ["testkey2.avbpubkey"],
5102 }
5103
5104 filegroup {
5105 name: "my.pem",
5106 srcs: ["testkey2.pem"],
5107 }
5108 `)
5109
5110 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5111 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005112 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005113 if actual_pubkey != expected_pubkey {
5114 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5115 }
5116 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005117 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005118 if actual_privkey != expected_privkey {
5119 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5120 }
5121}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005122
5123func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005124 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005125 prebuilt_apex {
5126 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005127 arch: {
5128 arm64: {
5129 src: "myapex-arm64.apex",
5130 },
5131 arm: {
5132 src: "myapex-arm.apex",
5133 },
5134 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005135 }
5136 `)
5137
Wei Li340ee8e2022-03-18 17:33:24 -07005138 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5139 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005140
Jiyong Parkc95714e2019-03-29 14:23:10 +09005141 expectedInput := "myapex-arm64.apex"
5142 if prebuilt.inputApex.String() != expectedInput {
5143 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5144 }
Wei Li340ee8e2022-03-18 17:33:24 -07005145 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5146 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5147 rule := testingModule.Rule("genProvenanceMetaData")
5148 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5149 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5150 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5151 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005152
5153 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5154 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005155}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005156
Paul Duffinc0609c62021-03-01 17:27:16 +00005157func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005158 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005159 prebuilt_apex {
5160 name: "myapex",
5161 }
5162 `)
5163}
5164
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005165func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005166 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005167 prebuilt_apex {
5168 name: "myapex",
5169 src: "myapex-arm.apex",
5170 filename: "notmyapex.apex",
5171 }
5172 `)
5173
Wei Li340ee8e2022-03-18 17:33:24 -07005174 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5175 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005176
5177 expected := "notmyapex.apex"
5178 if p.installFilename != expected {
5179 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5180 }
Wei Li340ee8e2022-03-18 17:33:24 -07005181 rule := testingModule.Rule("genProvenanceMetaData")
5182 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5183 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5184 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5185 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005186}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005187
Samiul Islam7c02e262021-09-08 17:48:28 +01005188func TestApexSetFilenameOverride(t *testing.T) {
5189 testApex(t, `
5190 apex_set {
5191 name: "com.company.android.myapex",
5192 apex_name: "com.android.myapex",
5193 set: "company-myapex.apks",
5194 filename: "com.company.android.myapex.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 filename: "com.company.android.myapex.capex"
5204 }
5205 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5206
5207 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5208 apex_set {
5209 name: "com.company.android.myapex",
5210 apex_name: "com.android.myapex",
5211 set: "company-myapex.apks",
5212 filename: "some-random-suffix"
5213 }
5214 `)
5215}
5216
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005217func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005218 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005219 prebuilt_apex {
5220 name: "myapex.prebuilt",
5221 src: "myapex-arm.apex",
5222 overrides: [
5223 "myapex",
5224 ],
5225 }
5226 `)
5227
Wei Li340ee8e2022-03-18 17:33:24 -07005228 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5229 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005230
5231 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005232 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005233 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005234 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005235 }
Wei Li340ee8e2022-03-18 17:33:24 -07005236 rule := testingModule.Rule("genProvenanceMetaData")
5237 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5238 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5239 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5240 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005241}
5242
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005243func TestPrebuiltApexName(t *testing.T) {
5244 testApex(t, `
5245 prebuilt_apex {
5246 name: "com.company.android.myapex",
5247 apex_name: "com.android.myapex",
5248 src: "company-myapex-arm.apex",
5249 }
5250 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5251
5252 testApex(t, `
5253 apex_set {
5254 name: "com.company.android.myapex",
5255 apex_name: "com.android.myapex",
5256 set: "company-myapex.apks",
5257 }
5258 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5259}
5260
5261func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5262 _ = android.GroupFixturePreparers(
5263 java.PrepareForTestWithJavaDefaultModules,
5264 PrepareForTestWithApexBuildComponents,
5265 android.FixtureWithRootAndroidBp(`
5266 platform_bootclasspath {
5267 name: "platform-bootclasspath",
5268 fragments: [
5269 {
5270 apex: "com.android.art",
5271 module: "art-bootclasspath-fragment",
5272 },
5273 ],
5274 }
5275
5276 prebuilt_apex {
5277 name: "com.company.android.art",
5278 apex_name: "com.android.art",
5279 src: "com.company.android.art-arm.apex",
5280 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5281 }
5282
5283 prebuilt_bootclasspath_fragment {
5284 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005285 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005286 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005287 hidden_api: {
5288 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5289 metadata: "my-bootclasspath-fragment/metadata.csv",
5290 index: "my-bootclasspath-fragment/index.csv",
5291 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5292 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5293 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005294 }
5295
5296 java_import {
5297 name: "core-oj",
5298 jars: ["prebuilt.jar"],
5299 }
5300 `),
5301 ).RunTest(t)
5302}
5303
Paul Duffin092153d2021-01-26 11:42:39 +00005304// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5305// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005306func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005307 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005308
Paul Duffin89886cb2021-02-05 16:44:03 +00005309 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005310 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005311 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005312 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005313 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005314 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005315 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5316 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5317 android.NormalizePathForTesting(dexJarBuildPath))
5318 }
5319
5320 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005321 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005322 // Make sure the import has been given the correct path to the dex jar.
5323 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5324 dexJarBuildPath := p.DexJarInstallPath()
5325 stem := android.RemoveOptionalPrebuiltPrefix(name)
5326 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5327 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5328 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005329 }
5330
Paul Duffin39853512021-02-26 11:09:39 +00005331 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005332 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005333 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005334 android.AssertArrayString(t, "Check if there is no source variant",
5335 []string{"android_common"},
5336 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005337 }
5338
5339 t.Run("prebuilt only", func(t *testing.T) {
5340 bp := `
5341 prebuilt_apex {
5342 name: "myapex",
5343 arch: {
5344 arm64: {
5345 src: "myapex-arm64.apex",
5346 },
5347 arm: {
5348 src: "myapex-arm.apex",
5349 },
5350 },
Paul Duffin39853512021-02-26 11:09:39 +00005351 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005352 }
5353
5354 java_import {
5355 name: "libfoo",
5356 jars: ["libfoo.jar"],
5357 }
Paul Duffin39853512021-02-26 11:09:39 +00005358
5359 java_sdk_library_import {
5360 name: "libbar",
5361 public: {
5362 jars: ["libbar.jar"],
5363 },
5364 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005365 `
5366
5367 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5368 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5369
Martin Stjernholm44825602021-09-17 01:44:12 +01005370 deapexerName := deapexerModuleName("myapex")
5371 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5372
Paul Duffinf6932af2021-02-26 18:21:56 +00005373 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005374 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005375 rule := deapexer.Rule("deapexer")
5376 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5377 t.Errorf("expected: %q, found: %q", expected, actual)
5378 }
5379
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005380 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005381 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005382 rule = prebuiltApex.Rule("android/soong/android.Cp")
5383 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5384 t.Errorf("expected: %q, found: %q", expected, actual)
5385 }
5386
Paul Duffin89886cb2021-02-05 16:44:03 +00005387 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005388 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005389
5390 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005391 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005392 })
5393
5394 t.Run("prebuilt with source preferred", func(t *testing.T) {
5395
5396 bp := `
5397 prebuilt_apex {
5398 name: "myapex",
5399 arch: {
5400 arm64: {
5401 src: "myapex-arm64.apex",
5402 },
5403 arm: {
5404 src: "myapex-arm.apex",
5405 },
5406 },
Paul Duffin39853512021-02-26 11:09:39 +00005407 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005408 }
5409
5410 java_import {
5411 name: "libfoo",
5412 jars: ["libfoo.jar"],
5413 }
5414
5415 java_library {
5416 name: "libfoo",
5417 }
Paul Duffin39853512021-02-26 11:09:39 +00005418
5419 java_sdk_library_import {
5420 name: "libbar",
5421 public: {
5422 jars: ["libbar.jar"],
5423 },
5424 }
5425
5426 java_sdk_library {
5427 name: "libbar",
5428 srcs: ["foo/bar/MyClass.java"],
5429 unsafe_ignore_missing_latest_api: true,
5430 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005431 `
5432
5433 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5434 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5435
Paul Duffin89886cb2021-02-05 16:44:03 +00005436 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005437 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005438 ensureNoSourceVariant(t, ctx, "libfoo")
5439
5440 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005441 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005442 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005443 })
5444
5445 t.Run("prebuilt preferred with source", func(t *testing.T) {
5446 bp := `
5447 prebuilt_apex {
5448 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005449 arch: {
5450 arm64: {
5451 src: "myapex-arm64.apex",
5452 },
5453 arm: {
5454 src: "myapex-arm.apex",
5455 },
5456 },
Paul Duffin39853512021-02-26 11:09:39 +00005457 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005458 }
5459
5460 java_import {
5461 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005462 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005463 jars: ["libfoo.jar"],
5464 }
5465
5466 java_library {
5467 name: "libfoo",
5468 }
Paul Duffin39853512021-02-26 11:09:39 +00005469
5470 java_sdk_library_import {
5471 name: "libbar",
5472 prefer: true,
5473 public: {
5474 jars: ["libbar.jar"],
5475 },
5476 }
5477
5478 java_sdk_library {
5479 name: "libbar",
5480 srcs: ["foo/bar/MyClass.java"],
5481 unsafe_ignore_missing_latest_api: true,
5482 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005483 `
5484
5485 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5486 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5487
Paul Duffin89886cb2021-02-05 16:44:03 +00005488 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005489 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005490 ensureNoSourceVariant(t, ctx, "libfoo")
5491
5492 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005493 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005494 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005495 })
5496}
5497
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005498func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005499 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005500 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005501 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5502 // is disabled.
5503 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5504 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005505
Paul Duffin37856732021-02-26 14:24:15 +00005506 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5507 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005508 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005509 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005510 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005511 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005512 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005513 foundLibfooJar = true
5514 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005515 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005516 }
5517 }
5518 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005519 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 +00005520 }
5521 }
5522
Paul Duffin40a3f652021-07-19 13:11:24 +01005523 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005524 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005525 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005526 var rule android.TestingBuildParams
5527
5528 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5529 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005530 }
5531
Paul Duffin40a3f652021-07-19 13:11:24 +01005532 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5533 t.Helper()
5534 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5535 var rule android.TestingBuildParams
5536
5537 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5538 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5539 }
5540
Paul Duffin89f570a2021-06-16 01:42:33 +01005541 fragment := java.ApexVariantReference{
5542 Apex: proptools.StringPtr("myapex"),
5543 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5544 }
5545
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005546 t.Run("prebuilt only", func(t *testing.T) {
5547 bp := `
5548 prebuilt_apex {
5549 name: "myapex",
5550 arch: {
5551 arm64: {
5552 src: "myapex-arm64.apex",
5553 },
5554 arm: {
5555 src: "myapex-arm.apex",
5556 },
5557 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005558 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5559 }
5560
5561 prebuilt_bootclasspath_fragment {
5562 name: "my-bootclasspath-fragment",
5563 contents: ["libfoo", "libbar"],
5564 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005565 hidden_api: {
5566 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5567 metadata: "my-bootclasspath-fragment/metadata.csv",
5568 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005569 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5570 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5571 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005572 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005573 }
5574
5575 java_import {
5576 name: "libfoo",
5577 jars: ["libfoo.jar"],
5578 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005579 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005580 }
Paul Duffin37856732021-02-26 14:24:15 +00005581
5582 java_sdk_library_import {
5583 name: "libbar",
5584 public: {
5585 jars: ["libbar.jar"],
5586 },
5587 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005588 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005589 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005590 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005591 `
5592
Paul Duffin89f570a2021-06-16 01:42:33 +01005593 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005594 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5595 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005596
Paul Duffin537ea3d2021-05-14 10:38:00 +01005597 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005598 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005599 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005600 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005601 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005602 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 +01005603 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005604 })
5605
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005606 t.Run("apex_set only", func(t *testing.T) {
5607 bp := `
5608 apex_set {
5609 name: "myapex",
5610 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005611 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005612 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005613 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5614 }
5615
5616 java_import {
5617 name: "myjavalib",
5618 jars: ["myjavalib.jar"],
5619 apex_available: ["myapex"],
5620 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005621 }
5622
5623 prebuilt_bootclasspath_fragment {
5624 name: "my-bootclasspath-fragment",
5625 contents: ["libfoo", "libbar"],
5626 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005627 hidden_api: {
5628 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5629 metadata: "my-bootclasspath-fragment/metadata.csv",
5630 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005631 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5632 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5633 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005634 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005635 }
5636
Liz Kammer2dc72442023-04-20 10:10:48 -04005637 prebuilt_systemserverclasspath_fragment {
5638 name: "my-systemserverclasspath-fragment",
5639 contents: ["libbaz"],
5640 apex_available: ["myapex"],
5641 }
5642
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005643 java_import {
5644 name: "libfoo",
5645 jars: ["libfoo.jar"],
5646 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005647 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005648 }
5649
5650 java_sdk_library_import {
5651 name: "libbar",
5652 public: {
5653 jars: ["libbar.jar"],
5654 },
5655 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005656 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005657 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005658 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005659
5660 java_sdk_library_import {
5661 name: "libbaz",
5662 public: {
5663 jars: ["libbaz.jar"],
5664 },
5665 apex_available: ["myapex"],
5666 shared_library: false,
5667 permitted_packages: ["baz"],
5668 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005669 `
5670
Paul Duffin89f570a2021-06-16 01:42:33 +01005671 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005672 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5673 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5674
Paul Duffin537ea3d2021-05-14 10:38:00 +01005675 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005676 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005677 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005678 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005679 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005680 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 +01005681 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005682
5683 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5684
5685 overrideNames := []string{
5686 "",
5687 "myjavalib.myapex",
5688 "libfoo.myapex",
5689 "libbar.myapex",
5690 "libbaz.myapex",
5691 }
5692 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5693 for i, e := range mkEntries {
5694 g := e.OverrideName
5695 if w := overrideNames[i]; w != g {
5696 t.Errorf("Expected override name %q, got %q", w, g)
5697 }
5698 }
5699
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005700 })
5701
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005702 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5703 bp := `
5704 prebuilt_apex {
5705 name: "myapex",
5706 arch: {
5707 arm64: {
5708 src: "myapex-arm64.apex",
5709 },
5710 arm: {
5711 src: "myapex-arm.apex",
5712 },
5713 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005714 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5715 }
5716
5717 prebuilt_bootclasspath_fragment {
5718 name: "my-bootclasspath-fragment",
5719 contents: ["libfoo", "libbar"],
5720 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005721 hidden_api: {
5722 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5723 metadata: "my-bootclasspath-fragment/metadata.csv",
5724 index: "my-bootclasspath-fragment/index.csv",
5725 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5726 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5727 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005728 }
5729
5730 java_import {
5731 name: "libfoo",
5732 jars: ["libfoo.jar"],
5733 apex_available: ["myapex"],
5734 }
5735
5736 java_library {
5737 name: "libfoo",
5738 srcs: ["foo/bar/MyClass.java"],
5739 apex_available: ["myapex"],
5740 }
Paul Duffin37856732021-02-26 14:24:15 +00005741
5742 java_sdk_library_import {
5743 name: "libbar",
5744 public: {
5745 jars: ["libbar.jar"],
5746 },
5747 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005748 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005749 }
5750
5751 java_sdk_library {
5752 name: "libbar",
5753 srcs: ["foo/bar/MyClass.java"],
5754 unsafe_ignore_missing_latest_api: true,
5755 apex_available: ["myapex"],
5756 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005757 `
5758
5759 // In this test the source (java_library) libfoo is active since the
5760 // prebuilt (java_import) defaults to prefer:false. However the
5761 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5762 // find the dex boot jar in it. We either need to disable the source libfoo
5763 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005764 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005765 // dexbootjar check is skipped if AllowMissingDependencies is true
5766 preparerAllowMissingDeps := android.GroupFixturePreparers(
5767 preparer,
5768 android.PrepareForTestWithAllowMissingDependencies,
5769 )
5770 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005771 })
5772
5773 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5774 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005775 apex {
5776 name: "myapex",
5777 key: "myapex.key",
5778 updatable: false,
5779 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5780 }
5781
5782 apex_key {
5783 name: "myapex.key",
5784 public_key: "testkey.avbpubkey",
5785 private_key: "testkey.pem",
5786 }
5787
5788 bootclasspath_fragment {
5789 name: "my-bootclasspath-fragment",
5790 contents: ["libfoo", "libbar"],
5791 apex_available: ["myapex"],
5792 hidden_api: {
5793 split_packages: ["*"],
5794 },
5795 }
5796
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005797 prebuilt_apex {
5798 name: "myapex",
5799 arch: {
5800 arm64: {
5801 src: "myapex-arm64.apex",
5802 },
5803 arm: {
5804 src: "myapex-arm.apex",
5805 },
5806 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005807 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5808 }
5809
5810 prebuilt_bootclasspath_fragment {
5811 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005812 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005813 contents: ["libfoo", "libbar"],
5814 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005815 hidden_api: {
5816 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5817 metadata: "my-bootclasspath-fragment/metadata.csv",
5818 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005819 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5820 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5821 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005822 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005823 }
5824
5825 java_import {
5826 name: "libfoo",
5827 prefer: true,
5828 jars: ["libfoo.jar"],
5829 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005830 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005831 }
5832
5833 java_library {
5834 name: "libfoo",
5835 srcs: ["foo/bar/MyClass.java"],
5836 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005837 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005838 }
Paul Duffin37856732021-02-26 14:24:15 +00005839
5840 java_sdk_library_import {
5841 name: "libbar",
5842 prefer: true,
5843 public: {
5844 jars: ["libbar.jar"],
5845 },
5846 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005847 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005848 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005849 }
5850
5851 java_sdk_library {
5852 name: "libbar",
5853 srcs: ["foo/bar/MyClass.java"],
5854 unsafe_ignore_missing_latest_api: true,
5855 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005856 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005857 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005858 `
5859
Paul Duffin89f570a2021-06-16 01:42:33 +01005860 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005861 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5862 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005863
Paul Duffin537ea3d2021-05-14 10:38:00 +01005864 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005865 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005866 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005867 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005868 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005869 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 +01005870 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005871 })
5872
5873 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5874 bp := `
5875 apex {
5876 name: "myapex",
5877 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005878 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005879 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005880 }
5881
5882 apex_key {
5883 name: "myapex.key",
5884 public_key: "testkey.avbpubkey",
5885 private_key: "testkey.pem",
5886 }
5887
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005888 bootclasspath_fragment {
5889 name: "my-bootclasspath-fragment",
5890 contents: ["libfoo", "libbar"],
5891 apex_available: ["myapex"],
5892 hidden_api: {
5893 split_packages: ["*"],
5894 },
5895 }
5896
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005897 prebuilt_apex {
5898 name: "myapex",
5899 arch: {
5900 arm64: {
5901 src: "myapex-arm64.apex",
5902 },
5903 arm: {
5904 src: "myapex-arm.apex",
5905 },
5906 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005907 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5908 }
5909
5910 prebuilt_bootclasspath_fragment {
5911 name: "my-bootclasspath-fragment",
5912 contents: ["libfoo", "libbar"],
5913 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005914 hidden_api: {
5915 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5916 metadata: "my-bootclasspath-fragment/metadata.csv",
5917 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005918 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5919 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5920 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005921 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005922 }
5923
5924 java_import {
5925 name: "libfoo",
5926 jars: ["libfoo.jar"],
5927 apex_available: ["myapex"],
5928 }
5929
5930 java_library {
5931 name: "libfoo",
5932 srcs: ["foo/bar/MyClass.java"],
5933 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005934 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005935 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005936 }
Paul Duffin37856732021-02-26 14:24:15 +00005937
5938 java_sdk_library_import {
5939 name: "libbar",
5940 public: {
5941 jars: ["libbar.jar"],
5942 },
5943 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005944 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005945 }
5946
5947 java_sdk_library {
5948 name: "libbar",
5949 srcs: ["foo/bar/MyClass.java"],
5950 unsafe_ignore_missing_latest_api: true,
5951 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005952 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005953 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005954 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005955 `
5956
Paul Duffin89f570a2021-06-16 01:42:33 +01005957 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005958 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5959 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005960
Paul Duffin537ea3d2021-05-14 10:38:00 +01005961 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005962 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005963 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5964 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005965 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5966 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 +01005967 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005968 })
5969
5970 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5971 bp := `
5972 apex {
5973 name: "myapex",
5974 enabled: false,
5975 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005976 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005977 }
5978
5979 apex_key {
5980 name: "myapex.key",
5981 public_key: "testkey.avbpubkey",
5982 private_key: "testkey.pem",
5983 }
5984
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005985 bootclasspath_fragment {
5986 name: "my-bootclasspath-fragment",
5987 enabled: false,
5988 contents: ["libfoo", "libbar"],
5989 apex_available: ["myapex"],
5990 hidden_api: {
5991 split_packages: ["*"],
5992 },
5993 }
5994
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005995 prebuilt_apex {
5996 name: "myapex",
5997 arch: {
5998 arm64: {
5999 src: "myapex-arm64.apex",
6000 },
6001 arm: {
6002 src: "myapex-arm.apex",
6003 },
6004 },
Paul Duffin89f570a2021-06-16 01:42:33 +01006005 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6006 }
6007
6008 prebuilt_bootclasspath_fragment {
6009 name: "my-bootclasspath-fragment",
6010 contents: ["libfoo", "libbar"],
6011 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01006012 hidden_api: {
6013 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6014 metadata: "my-bootclasspath-fragment/metadata.csv",
6015 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01006016 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
6017 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
6018 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01006019 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006020 }
6021
6022 java_import {
6023 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006024 jars: ["libfoo.jar"],
6025 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006026 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006027 }
6028
6029 java_library {
6030 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006031 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006032 srcs: ["foo/bar/MyClass.java"],
6033 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006034 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006035 }
Paul Duffin37856732021-02-26 14:24:15 +00006036
6037 java_sdk_library_import {
6038 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00006039 public: {
6040 jars: ["libbar.jar"],
6041 },
6042 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006043 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01006044 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00006045 }
6046
6047 java_sdk_library {
6048 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006049 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00006050 srcs: ["foo/bar/MyClass.java"],
6051 unsafe_ignore_missing_latest_api: true,
6052 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006053 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006054 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006055 `
6056
Paul Duffin89f570a2021-06-16 01:42:33 +01006057 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01006058 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6059 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006060
Paul Duffin537ea3d2021-05-14 10:38:00 +01006061 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006062 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006063 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006064 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006065 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006066 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 +01006067 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006068 })
6069}
6070
Roland Levillain630846d2019-06-26 12:48:34 +01006071func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006072 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006073 apex_test {
6074 name: "myapex",
6075 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006076 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006077 tests: [
6078 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006079 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006080 ],
6081 }
6082
6083 apex_key {
6084 name: "myapex.key",
6085 public_key: "testkey.avbpubkey",
6086 private_key: "testkey.pem",
6087 }
6088
Liz Kammer1c14a212020-05-12 15:26:55 -07006089 filegroup {
6090 name: "fg",
6091 srcs: [
6092 "baz",
6093 "bar/baz"
6094 ],
6095 }
6096
Roland Levillain630846d2019-06-26 12:48:34 +01006097 cc_test {
6098 name: "mytest",
6099 gtest: false,
6100 srcs: ["mytest.cpp"],
6101 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006102 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006103 system_shared_libs: [],
6104 static_executable: true,
6105 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006106 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006107 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006108
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006109 cc_library {
6110 name: "mylib",
6111 srcs: ["mylib.cpp"],
6112 system_shared_libs: [],
6113 stl: "none",
6114 }
6115
Liz Kammer5bd365f2020-05-27 15:15:11 -07006116 filegroup {
6117 name: "fg2",
6118 srcs: [
6119 "testdata/baz"
6120 ],
6121 }
6122
Roland Levillain9b5fde92019-06-28 15:41:19 +01006123 cc_test {
6124 name: "mytests",
6125 gtest: false,
6126 srcs: [
6127 "mytest1.cpp",
6128 "mytest2.cpp",
6129 "mytest3.cpp",
6130 ],
6131 test_per_src: true,
6132 relative_install_path: "test",
6133 system_shared_libs: [],
6134 static_executable: true,
6135 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006136 data: [
6137 ":fg",
6138 ":fg2",
6139 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006140 }
Roland Levillain630846d2019-06-26 12:48:34 +01006141 `)
6142
Sundong Ahnabb64432019-10-22 13:58:29 +09006143 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006144 copyCmds := apexRule.Args["copy_commands"]
6145
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006146 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006147 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006148 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006149
Liz Kammer1c14a212020-05-12 15:26:55 -07006150 //Ensure that test data are copied into apex.
6151 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6152 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6153
Roland Levillain9b5fde92019-06-28 15:41:19 +01006154 // Ensure that test deps built with `test_per_src` are copied into apex.
6155 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6156 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6157 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006158
6159 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07006160 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006161 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006162 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006163 prefix := "TARGET_"
6164 var builder strings.Builder
6165 data.Custom(&builder, name, prefix, "", data)
6166 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006167 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6168 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6169 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6170 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006171 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006172}
6173
Jooyung Hand48f3c32019-08-23 11:18:57 +09006174func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6175 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6176 apex {
6177 name: "myapex",
6178 key: "myapex.key",
6179 native_shared_libs: ["libfoo"],
6180 }
6181
6182 apex_key {
6183 name: "myapex.key",
6184 public_key: "testkey.avbpubkey",
6185 private_key: "testkey.pem",
6186 }
6187
6188 cc_library {
6189 name: "libfoo",
6190 stl: "none",
6191 system_shared_libs: [],
6192 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006193 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006194 }
6195 `)
6196 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6197 apex {
6198 name: "myapex",
6199 key: "myapex.key",
6200 java_libs: ["myjar"],
6201 }
6202
6203 apex_key {
6204 name: "myapex.key",
6205 public_key: "testkey.avbpubkey",
6206 private_key: "testkey.pem",
6207 }
6208
6209 java_library {
6210 name: "myjar",
6211 srcs: ["foo/bar/MyClass.java"],
6212 sdk_version: "none",
6213 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006214 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006215 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006216 }
6217 `)
6218}
6219
Bill Peckhama41a6962021-01-11 10:58:54 -08006220func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006221 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006222 apex {
6223 name: "myapex",
6224 key: "myapex.key",
6225 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006226 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006227 }
6228
6229 apex_key {
6230 name: "myapex.key",
6231 public_key: "testkey.avbpubkey",
6232 private_key: "testkey.pem",
6233 }
6234
6235 java_import {
6236 name: "myjavaimport",
6237 apex_available: ["myapex"],
6238 jars: ["my.jar"],
6239 compile_dex: true,
6240 }
6241 `)
6242
6243 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6244 apexRule := module.Rule("apexRule")
6245 copyCmds := apexRule.Args["copy_commands"]
6246 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6247}
6248
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006249func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006250 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006251 apex {
6252 name: "myapex",
6253 key: "myapex.key",
6254 apps: [
6255 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006256 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006257 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006258 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006259 }
6260
6261 apex_key {
6262 name: "myapex.key",
6263 public_key: "testkey.avbpubkey",
6264 private_key: "testkey.pem",
6265 }
6266
6267 android_app {
6268 name: "AppFoo",
6269 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006270 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006271 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006272 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006273 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006274 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006275 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006276
6277 android_app {
6278 name: "AppFooPriv",
6279 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006280 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006281 system_modules: "none",
6282 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006283 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006284 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006285 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006286 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006287
6288 cc_library_shared {
6289 name: "libjni",
6290 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006291 shared_libs: ["libfoo"],
6292 stl: "none",
6293 system_shared_libs: [],
6294 apex_available: [ "myapex" ],
6295 sdk_version: "current",
6296 }
6297
6298 cc_library_shared {
6299 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006300 stl: "none",
6301 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006302 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006303 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006304 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006305 `)
6306
Sundong Ahnabb64432019-10-22 13:58:29 +09006307 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006308 apexRule := module.Rule("apexRule")
6309 copyCmds := apexRule.Args["copy_commands"]
6310
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006311 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6312 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006313 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006314
Colin Crossaede88c2020-08-11 12:17:01 -07006315 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006316 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006317 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006318 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006319 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006320 // JNI libraries including transitive deps are
6321 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006322 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006323 // ... embedded inside APK (jnilibs.zip)
6324 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6325 // ... and not directly inside the APEX
6326 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6327 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006328
6329 apexBundle := module.Module().(*apexBundle)
6330 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6331 var builder strings.Builder
6332 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6333 androidMk := builder.String()
6334 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6335 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6336 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6337 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6338 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6339 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 +01006340}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006341
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006342func TestApexWithAppImportBuildId(t *testing.T) {
6343 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6344 for _, id := range invalidBuildIds {
6345 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6346 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6347 variables.BuildId = proptools.StringPtr(id)
6348 })
6349 testApexError(t, message, `apex {
6350 name: "myapex",
6351 key: "myapex.key",
6352 apps: ["AppFooPrebuilt"],
6353 updatable: false,
6354 }
6355
6356 apex_key {
6357 name: "myapex.key",
6358 public_key: "testkey.avbpubkey",
6359 private_key: "testkey.pem",
6360 }
6361
6362 android_app_import {
6363 name: "AppFooPrebuilt",
6364 apk: "PrebuiltAppFoo.apk",
6365 presigned: true,
6366 apex_available: ["myapex"],
6367 }
6368 `, fixture)
6369 }
6370}
6371
Dario Frenicde2a032019-10-27 00:29:22 +01006372func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006373 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006374 apex {
6375 name: "myapex",
6376 key: "myapex.key",
6377 apps: [
6378 "AppFooPrebuilt",
6379 "AppFooPrivPrebuilt",
6380 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006381 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006382 }
6383
6384 apex_key {
6385 name: "myapex.key",
6386 public_key: "testkey.avbpubkey",
6387 private_key: "testkey.pem",
6388 }
6389
6390 android_app_import {
6391 name: "AppFooPrebuilt",
6392 apk: "PrebuiltAppFoo.apk",
6393 presigned: true,
6394 dex_preopt: {
6395 enabled: false,
6396 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006397 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006398 }
6399
6400 android_app_import {
6401 name: "AppFooPrivPrebuilt",
6402 apk: "PrebuiltAppFooPriv.apk",
6403 privileged: true,
6404 presigned: true,
6405 dex_preopt: {
6406 enabled: false,
6407 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006408 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006409 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006410 }
6411 `)
6412
Sundong Ahnabb64432019-10-22 13:58:29 +09006413 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01006414 apexRule := module.Rule("apexRule")
6415 copyCmds := apexRule.Args["copy_commands"]
6416
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006417 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6418 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006419}
6420
6421func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006422 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006423 apex {
6424 name: "myapex",
6425 key: "myapex.key",
6426 apps: [
6427 "AppFoo",
6428 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006429 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006430 }
6431
6432 apex_key {
6433 name: "myapex.key",
6434 public_key: "testkey.avbpubkey",
6435 private_key: "testkey.pem",
6436 }
6437
6438 android_app {
6439 name: "AppFoo",
6440 srcs: ["foo/bar/MyClass.java"],
6441 sdk_version: "none",
6442 system_modules: "none",
6443 apex_available: [ "myapex" ],
6444 }
6445
6446 android_app_import {
6447 name: "AppFoo",
6448 apk: "AppFooPrebuilt.apk",
6449 filename: "AppFooPrebuilt.apk",
6450 presigned: true,
6451 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006452 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006453 }
6454 `, withFiles(map[string][]byte{
6455 "AppFooPrebuilt.apk": nil,
6456 }))
6457
6458 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006459 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006460 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006461}
6462
Dario Freni6f3937c2019-12-20 22:58:03 +00006463func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006464 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006465 apex {
6466 name: "myapex",
6467 key: "myapex.key",
6468 apps: [
6469 "TesterHelpAppFoo",
6470 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006471 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006472 }
6473
6474 apex_key {
6475 name: "myapex.key",
6476 public_key: "testkey.avbpubkey",
6477 private_key: "testkey.pem",
6478 }
6479
6480 android_test_helper_app {
6481 name: "TesterHelpAppFoo",
6482 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006483 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006484 }
6485
6486 `)
6487
6488 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6489 apexRule := module.Rule("apexRule")
6490 copyCmds := apexRule.Args["copy_commands"]
6491
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006492 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006493}
6494
Jooyung Han18020ea2019-11-13 10:50:48 +09006495func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6496 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006497 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006498 apex {
6499 name: "myapex",
6500 key: "myapex.key",
6501 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006502 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006503 }
6504
6505 apex_key {
6506 name: "myapex.key",
6507 public_key: "testkey.avbpubkey",
6508 private_key: "testkey.pem",
6509 }
6510
6511 apex {
6512 name: "otherapex",
6513 key: "myapex.key",
6514 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006515 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006516 }
6517
6518 cc_defaults {
6519 name: "libfoo-defaults",
6520 apex_available: ["otherapex"],
6521 }
6522
6523 cc_library {
6524 name: "libfoo",
6525 defaults: ["libfoo-defaults"],
6526 stl: "none",
6527 system_shared_libs: [],
6528 }`)
6529}
6530
Paul Duffine52e66f2020-03-30 17:54:29 +01006531func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006532 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006533 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006534 apex {
6535 name: "myapex",
6536 key: "myapex.key",
6537 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006538 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006539 }
6540
6541 apex_key {
6542 name: "myapex.key",
6543 public_key: "testkey.avbpubkey",
6544 private_key: "testkey.pem",
6545 }
6546
6547 apex {
6548 name: "otherapex",
6549 key: "otherapex.key",
6550 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006551 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006552 }
6553
6554 apex_key {
6555 name: "otherapex.key",
6556 public_key: "testkey.avbpubkey",
6557 private_key: "testkey.pem",
6558 }
6559
6560 cc_library {
6561 name: "libfoo",
6562 stl: "none",
6563 system_shared_libs: [],
6564 apex_available: ["otherapex"],
6565 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006566}
Jiyong Park127b40b2019-09-30 16:04:35 +09006567
Paul Duffine52e66f2020-03-30 17:54:29 +01006568func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006569 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006570 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006571.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006572.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006573.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006574.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006575.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006576.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006577 apex {
6578 name: "myapex",
6579 key: "myapex.key",
6580 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006581 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006582 }
6583
6584 apex_key {
6585 name: "myapex.key",
6586 public_key: "testkey.avbpubkey",
6587 private_key: "testkey.pem",
6588 }
6589
Jiyong Park127b40b2019-09-30 16:04:35 +09006590 cc_library {
6591 name: "libfoo",
6592 stl: "none",
6593 shared_libs: ["libbar"],
6594 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006595 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006596 }
6597
6598 cc_library {
6599 name: "libbar",
6600 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006601 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006602 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006603 apex_available: ["myapex"],
6604 }
6605
6606 cc_library {
6607 name: "libbaz",
6608 stl: "none",
6609 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006610 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006611}
Jiyong Park127b40b2019-09-30 16:04:35 +09006612
Liz Kammer5f108fa2023-05-11 14:33:17 -04006613func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6614 testApex(t, `
6615 apex {
6616 name: "myapex",
6617 key: "myapex.key",
6618 native_shared_libs: ["libfoo"],
6619 updatable: false,
6620 }
6621
6622 apex_key {
6623 name: "myapex.key",
6624 public_key: "testkey.avbpubkey",
6625 private_key: "testkey.pem",
6626 }
6627
6628 cc_library {
6629 name: "libfoo",
6630 stl: "none",
6631 static_libs: ["libbar"],
6632 system_shared_libs: [],
6633 apex_available: ["myapex"],
6634 }
6635
6636 cc_library {
6637 name: "libbar",
6638 stl: "none",
6639 shared_libs: ["libbaz"],
6640 system_shared_libs: [],
6641 apex_available: ["myapex"],
6642 }
6643
6644 cc_library {
6645 name: "libbaz",
6646 stl: "none",
6647 system_shared_libs: [],
6648 }`)
6649
6650 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6651 apex {
6652 name: "myapex",
6653 key: "myapex.key",
6654 native_shared_libs: ["libfoo"],
6655 updatable: false,
6656 }
6657
6658 apex_key {
6659 name: "myapex.key",
6660 public_key: "testkey.avbpubkey",
6661 private_key: "testkey.pem",
6662 }
6663
6664 cc_library {
6665 name: "libfoo",
6666 stl: "none",
6667 static_libs: ["libbar"],
6668 system_shared_libs: [],
6669 apex_available: ["myapex"],
6670 }
6671
6672 cc_library {
6673 name: "libbar",
6674 stl: "none",
6675 system_shared_libs: [],
6676 }`)
6677}
6678
Paul Duffine52e66f2020-03-30 17:54:29 +01006679func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006680 testApexError(t, "\"otherapex\" is not a valid module name", `
6681 apex {
6682 name: "myapex",
6683 key: "myapex.key",
6684 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006685 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006686 }
6687
6688 apex_key {
6689 name: "myapex.key",
6690 public_key: "testkey.avbpubkey",
6691 private_key: "testkey.pem",
6692 }
6693
6694 cc_library {
6695 name: "libfoo",
6696 stl: "none",
6697 system_shared_libs: [],
6698 apex_available: ["otherapex"],
6699 }`)
6700
Paul Duffine52e66f2020-03-30 17:54:29 +01006701 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006702 apex {
6703 name: "myapex",
6704 key: "myapex.key",
6705 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006706 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006707 }
6708
6709 apex_key {
6710 name: "myapex.key",
6711 public_key: "testkey.avbpubkey",
6712 private_key: "testkey.pem",
6713 }
6714
6715 cc_library {
6716 name: "libfoo",
6717 stl: "none",
6718 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006719 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006720 apex_available: ["myapex"],
6721 }
6722
6723 cc_library {
6724 name: "libbar",
6725 stl: "none",
6726 system_shared_libs: [],
6727 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006728 }
6729
6730 cc_library {
6731 name: "libbaz",
6732 stl: "none",
6733 system_shared_libs: [],
6734 stubs: {
6735 versions: ["10", "20", "30"],
6736 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006737 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006738}
Jiyong Park127b40b2019-09-30 16:04:35 +09006739
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006740func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6741 t.Run("negative variant_version produces error", func(t *testing.T) {
6742 testApexError(t, "expected an integer between 0-9; got -1", `
6743 apex {
6744 name: "myapex",
6745 key: "myapex.key",
6746 apex_available_name: "com.android.foo",
6747 variant_version: "-1",
6748 updatable: false,
6749 }
6750 apex_key {
6751 name: "myapex.key",
6752 public_key: "testkey.avbpubkey",
6753 private_key: "testkey.pem",
6754 }
6755 `)
6756 })
6757
6758 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6759 testApexError(t, "expected an integer between 0-9; got 10", `
6760 apex {
6761 name: "myapex",
6762 key: "myapex.key",
6763 apex_available_name: "com.android.foo",
6764 variant_version: "10",
6765 updatable: false,
6766 }
6767 apex_key {
6768 name: "myapex.key",
6769 public_key: "testkey.avbpubkey",
6770 private_key: "testkey.pem",
6771 }
6772 `)
6773 })
6774}
6775
6776func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6777 context := android.GroupFixturePreparers(
6778 android.PrepareForIntegrationTestWithAndroid,
6779 PrepareForTestWithApexBuildComponents,
6780 android.FixtureMergeMockFs(android.MockFS{
6781 "system/sepolicy/apex/foo-file_contexts": nil,
6782 "system/sepolicy/apex/bar-file_contexts": nil,
6783 }),
6784 )
6785 result := context.RunTestWithBp(t, `
6786 apex {
6787 name: "foo",
6788 key: "myapex.key",
6789 apex_available_name: "com.android.foo",
6790 variant_version: "0",
6791 updatable: false,
6792 }
6793 apex {
6794 name: "bar",
6795 key: "myapex.key",
6796 apex_available_name: "com.android.foo",
6797 variant_version: "3",
6798 updatable: false,
6799 }
6800 apex_key {
6801 name: "myapex.key",
6802 public_key: "testkey.avbpubkey",
6803 private_key: "testkey.pem",
6804 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006805 override_apex {
6806 name: "myoverrideapex",
6807 base: "bar",
6808 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006809 `)
6810
6811 fooManifestRule := result.ModuleForTests("foo", "android_common_foo_image").Rule("apexManifestRule")
6812 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6813 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6814 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6815 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6816 }
6817
6818 barManifestRule := result.ModuleForTests("bar", "android_common_bar_image").Rule("apexManifestRule")
6819 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6820 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6821 barActualDefaultVersion := barManifestRule.Args["default_version"]
6822 if barActualDefaultVersion != barExpectedDefaultVersion {
6823 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6824 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006825
6826 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar_image").Rule("apexManifestRule")
6827 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6828 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6829 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6830 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006831}
6832
Sam Delmericoca816532023-06-02 14:09:50 -04006833func TestApexAvailable_ApexAvailableName(t *testing.T) {
6834 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6835 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6836 apex {
6837 name: "myapex_sminus",
6838 key: "myapex.key",
6839 apps: ["AppFoo"],
6840 apex_available_name: "myapex",
6841 updatable: false,
6842 }
6843 apex {
6844 name: "myapex",
6845 key: "myapex.key",
6846 apps: ["AppFoo"],
6847 updatable: false,
6848 }
6849 apex_key {
6850 name: "myapex.key",
6851 public_key: "testkey.avbpubkey",
6852 private_key: "testkey.pem",
6853 }
6854 android_app {
6855 name: "AppFoo",
6856 srcs: ["foo/bar/MyClass.java"],
6857 sdk_version: "none",
6858 system_modules: "none",
6859 apex_available: [ "myapex_sminus" ],
6860 }`,
6861 android.FixtureMergeMockFs(android.MockFS{
6862 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6863 }),
6864 )
6865 })
6866
6867 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6868 testApex(t, `
6869 apex {
6870 name: "myapex_sminus",
6871 key: "myapex.key",
6872 apps: ["AppFoo"],
6873 apex_available_name: "myapex",
6874 updatable: false,
6875 }
6876 apex {
6877 name: "myapex",
6878 key: "myapex.key",
6879 apps: ["AppFoo"],
6880 updatable: false,
6881 }
6882 apex_key {
6883 name: "myapex.key",
6884 public_key: "testkey.avbpubkey",
6885 private_key: "testkey.pem",
6886 }
6887 android_app {
6888 name: "AppFoo",
6889 srcs: ["foo/bar/MyClass.java"],
6890 sdk_version: "none",
6891 system_modules: "none",
6892 apex_available: [ "myapex" ],
6893 }`,
6894 android.FixtureMergeMockFs(android.MockFS{
6895 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6896 }),
6897 )
6898 })
6899
6900 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6901 testApex(t, `
6902 override_apex {
6903 name: "myoverrideapex_sminus",
6904 base: "myapex_sminus",
6905 key: "myapex.key",
6906 apps: ["AppFooOverride"],
6907 }
6908 override_apex {
6909 name: "myoverrideapex",
6910 base: "myapex",
6911 key: "myapex.key",
6912 apps: ["AppFooOverride"],
6913 }
6914 apex {
6915 name: "myapex_sminus",
6916 key: "myapex.key",
6917 apps: ["AppFoo"],
6918 apex_available_name: "myapex",
6919 updatable: false,
6920 }
6921 apex {
6922 name: "myapex",
6923 key: "myapex.key",
6924 apps: ["AppFoo"],
6925 updatable: false,
6926 }
6927 apex_key {
6928 name: "myapex.key",
6929 public_key: "testkey.avbpubkey",
6930 private_key: "testkey.pem",
6931 }
6932 android_app {
6933 name: "AppFooOverride",
6934 srcs: ["foo/bar/MyClass.java"],
6935 sdk_version: "none",
6936 system_modules: "none",
6937 apex_available: [ "myapex" ],
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.FixtureMergeMockFs(android.MockFS{
6947 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6948 }),
6949 )
6950 })
6951}
6952
6953func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6954 context := android.GroupFixturePreparers(
6955 android.PrepareForIntegrationTestWithAndroid,
6956 PrepareForTestWithApexBuildComponents,
6957 java.PrepareForTestWithDexpreopt,
6958 android.FixtureMergeMockFs(android.MockFS{
6959 "system/sepolicy/apex/myapex-file_contexts": nil,
6960 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6961 }),
6962 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6963 variables.BuildId = proptools.StringPtr("buildid")
6964 }),
6965 )
6966 context.RunTestWithBp(t, `
6967 override_apex {
6968 name: "myoverrideapex_sminus",
6969 base: "myapex_sminus",
6970 }
6971 override_apex {
6972 name: "myoverrideapex",
6973 base: "myapex",
6974 }
6975 apex {
6976 name: "myapex",
6977 key: "myapex.key",
6978 apps: ["AppFoo"],
6979 updatable: false,
6980 }
6981 apex {
6982 name: "myapex_sminus",
6983 apex_available_name: "myapex",
6984 key: "myapex.key",
6985 apps: ["AppFoo_sminus"],
6986 updatable: false,
6987 }
6988 apex_key {
6989 name: "myapex.key",
6990 public_key: "testkey.avbpubkey",
6991 private_key: "testkey.pem",
6992 }
6993 android_app {
6994 name: "AppFoo",
6995 srcs: ["foo/bar/MyClass.java"],
6996 sdk_version: "none",
6997 system_modules: "none",
6998 apex_available: [ "myapex" ],
6999 }
7000 android_app {
7001 name: "AppFoo_sminus",
7002 srcs: ["foo/bar/MyClass.java"],
7003 sdk_version: "none",
7004 min_sdk_version: "29",
7005 system_modules: "none",
7006 apex_available: [ "myapex" ],
7007 }`)
7008}
7009
Jiyong Park89e850a2020-04-07 16:37:39 +09007010func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007011 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09007012 apex {
7013 name: "myapex",
7014 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09007015 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007016 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09007017 }
7018
7019 apex_key {
7020 name: "myapex.key",
7021 public_key: "testkey.avbpubkey",
7022 private_key: "testkey.pem",
7023 }
7024
7025 cc_library {
7026 name: "libfoo",
7027 stl: "none",
7028 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09007029 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09007030 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09007031 }
7032
7033 cc_library {
7034 name: "libfoo2",
7035 stl: "none",
7036 system_shared_libs: [],
7037 shared_libs: ["libbaz"],
7038 apex_available: ["//apex_available:platform"],
7039 }
7040
7041 cc_library {
7042 name: "libbar",
7043 stl: "none",
7044 system_shared_libs: [],
7045 apex_available: ["myapex"],
7046 }
7047
7048 cc_library {
7049 name: "libbaz",
7050 stl: "none",
7051 system_shared_libs: [],
7052 apex_available: ["myapex"],
7053 stubs: {
7054 versions: ["1"],
7055 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007056 }`)
7057
Jiyong Park89e850a2020-04-07 16:37:39 +09007058 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7059 // because it depends on libbar which isn't available to platform
7060 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7061 if libfoo.NotAvailableForPlatform() != true {
7062 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7063 }
7064
7065 // libfoo2 however can be available to platform because it depends on libbaz which provides
7066 // stubs
7067 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7068 if libfoo2.NotAvailableForPlatform() == true {
7069 t.Errorf("%q should be available to platform", libfoo2.String())
7070 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007071}
Jiyong Parka90ca002019-10-07 15:47:24 +09007072
Paul Duffine52e66f2020-03-30 17:54:29 +01007073func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007074 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007075 apex {
7076 name: "myapex",
7077 key: "myapex.key",
7078 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007079 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007080 }
7081
7082 apex_key {
7083 name: "myapex.key",
7084 public_key: "testkey.avbpubkey",
7085 private_key: "testkey.pem",
7086 }
7087
7088 cc_library {
7089 name: "libfoo",
7090 stl: "none",
7091 system_shared_libs: [],
7092 apex_available: ["myapex"],
7093 static: {
7094 apex_available: ["//apex_available:platform"],
7095 },
7096 }`)
7097
Jiyong Park89e850a2020-04-07 16:37:39 +09007098 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7099 if libfooShared.NotAvailableForPlatform() != true {
7100 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7101 }
7102 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7103 if libfooStatic.NotAvailableForPlatform() != false {
7104 t.Errorf("%q should be available to platform", libfooStatic.String())
7105 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007106}
7107
Jiyong Park5d790c32019-11-15 18:40:32 +09007108func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007109 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007110 apex {
7111 name: "myapex",
7112 key: "myapex.key",
7113 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007114 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007115 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007116 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007117 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007118 }
7119
7120 override_apex {
7121 name: "override_myapex",
7122 base: "myapex",
7123 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007124 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007125 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007126 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007127 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007128 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007129 key: "mynewapex.key",
7130 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007131 }
7132
7133 apex_key {
7134 name: "myapex.key",
7135 public_key: "testkey.avbpubkey",
7136 private_key: "testkey.pem",
7137 }
7138
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007139 apex_key {
7140 name: "mynewapex.key",
7141 public_key: "testkey2.avbpubkey",
7142 private_key: "testkey2.pem",
7143 }
7144
7145 android_app_certificate {
7146 name: "myapex.certificate",
7147 certificate: "testkey",
7148 }
7149
Jiyong Park5d790c32019-11-15 18:40:32 +09007150 android_app {
7151 name: "app",
7152 srcs: ["foo/bar/MyClass.java"],
7153 package_name: "foo",
7154 sdk_version: "none",
7155 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007156 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007157 }
7158
7159 override_android_app {
7160 name: "override_app",
7161 base: "app",
7162 package_name: "bar",
7163 }
markchien7c803b82021-08-26 22:10:06 +08007164
7165 bpf {
7166 name: "bpf",
7167 srcs: ["bpf.c"],
7168 }
7169
7170 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007171 name: "overrideBpf",
7172 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007173 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007174
7175 prebuilt_etc {
7176 name: "myetc",
7177 src: "myprebuilt",
7178 }
7179
7180 prebuilt_etc {
7181 name: "override_myetc",
7182 src: "override_myprebuilt",
7183 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007184 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007185
Jiyong Park317645e2019-12-05 13:20:58 +09007186 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
7187 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
7188 if originalVariant.GetOverriddenBy() != "" {
7189 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7190 }
7191 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7192 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7193 }
7194
Jiyong Park5d790c32019-11-15 18:40:32 +09007195 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
7196 apexRule := module.Rule("apexRule")
7197 copyCmds := apexRule.Args["copy_commands"]
7198
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007199 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7200 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007201
markchien7c803b82021-08-26 22:10:06 +08007202 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007203 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007204
Daniel Norman5a3ce132021-08-26 15:44:43 -07007205 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7206 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7207
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007208 apexBundle := module.Module().(*apexBundle)
7209 name := apexBundle.Name()
7210 if name != "override_myapex" {
7211 t.Errorf("name should be \"override_myapex\", but was %q", name)
7212 }
7213
Baligh Uddin004d7172020-02-19 21:29:28 -08007214 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7215 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7216 }
7217
Jiyong Park20bacab2020-03-03 11:45:41 +09007218 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007219 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007220 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7221
7222 signApkRule := module.Rule("signapk")
7223 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007224
Colin Crossaa255532020-07-03 13:18:24 -07007225 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007226 var builder strings.Builder
7227 data.Custom(&builder, name, "TARGET_", "", data)
7228 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007229 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7230 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007231 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007232 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007233 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007234 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007235 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007236 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007237}
7238
Albert Martineefabcf2022-03-21 20:11:16 +00007239func TestMinSdkVersionOverride(t *testing.T) {
7240 // Override from 29 to 31
7241 minSdkOverride31 := "31"
7242 ctx := testApex(t, `
7243 apex {
7244 name: "myapex",
7245 key: "myapex.key",
7246 native_shared_libs: ["mylib"],
7247 updatable: true,
7248 min_sdk_version: "29"
7249 }
7250
7251 override_apex {
7252 name: "override_myapex",
7253 base: "myapex",
7254 logging_parent: "com.foo.bar",
7255 package_name: "test.overridden.package"
7256 }
7257
7258 apex_key {
7259 name: "myapex.key",
7260 public_key: "testkey.avbpubkey",
7261 private_key: "testkey.pem",
7262 }
7263
7264 cc_library {
7265 name: "mylib",
7266 srcs: ["mylib.cpp"],
7267 runtime_libs: ["libbar"],
7268 system_shared_libs: [],
7269 stl: "none",
7270 apex_available: [ "myapex" ],
7271 min_sdk_version: "apex_inherit"
7272 }
7273
7274 cc_library {
7275 name: "libbar",
7276 srcs: ["mylib.cpp"],
7277 system_shared_libs: [],
7278 stl: "none",
7279 apex_available: [ "myapex" ],
7280 min_sdk_version: "apex_inherit"
7281 }
7282
7283 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7284
7285 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
7286 copyCmds := apexRule.Args["copy_commands"]
7287
7288 // Ensure that direct non-stubs dep is always included
7289 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7290
7291 // Ensure that runtime_libs dep in included
7292 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7293
7294 // Ensure libraries target overridden min_sdk_version value
7295 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7296}
7297
7298func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7299 // Attempt to override from 31 to 29, should be a NOOP
7300 minSdkOverride29 := "29"
7301 ctx := testApex(t, `
7302 apex {
7303 name: "myapex",
7304 key: "myapex.key",
7305 native_shared_libs: ["mylib"],
7306 updatable: true,
7307 min_sdk_version: "31"
7308 }
7309
7310 override_apex {
7311 name: "override_myapex",
7312 base: "myapex",
7313 logging_parent: "com.foo.bar",
7314 package_name: "test.overridden.package"
7315 }
7316
7317 apex_key {
7318 name: "myapex.key",
7319 public_key: "testkey.avbpubkey",
7320 private_key: "testkey.pem",
7321 }
7322
7323 cc_library {
7324 name: "mylib",
7325 srcs: ["mylib.cpp"],
7326 runtime_libs: ["libbar"],
7327 system_shared_libs: [],
7328 stl: "none",
7329 apex_available: [ "myapex" ],
7330 min_sdk_version: "apex_inherit"
7331 }
7332
7333 cc_library {
7334 name: "libbar",
7335 srcs: ["mylib.cpp"],
7336 system_shared_libs: [],
7337 stl: "none",
7338 apex_available: [ "myapex" ],
7339 min_sdk_version: "apex_inherit"
7340 }
7341
7342 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7343
7344 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
7345 copyCmds := apexRule.Args["copy_commands"]
7346
7347 // Ensure that direct non-stubs dep is always included
7348 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7349
7350 // Ensure that runtime_libs dep in included
7351 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7352
7353 // Ensure libraries target the original min_sdk_version value rather than the overridden
7354 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7355}
7356
Jooyung Han214bf372019-11-12 13:03:50 +09007357func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007358 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007359 apex {
7360 name: "myapex",
7361 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007362 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007363 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007364 }
7365
7366 apex_key {
7367 name: "myapex.key",
7368 public_key: "testkey.avbpubkey",
7369 private_key: "testkey.pem",
7370 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007371
7372 cc_library {
7373 name: "mylib",
7374 srcs: ["mylib.cpp"],
7375 stl: "libc++",
7376 system_shared_libs: [],
7377 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007378 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007379 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007380 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007381
7382 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
7383 args := module.Rule("apexRule").Args
7384 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007385 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007386
7387 // The copies of the libraries in the apex should have one more dependency than
7388 // the ones outside the apex, namely the unwinder. Ideally we should check
7389 // the dependency names directly here but for some reason the names are blank in
7390 // this test.
7391 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007392 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007393 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7394 if len(apexImplicits) != len(nonApexImplicits)+1 {
7395 t.Errorf("%q missing unwinder dep", lib)
7396 }
7397 }
Jooyung Han214bf372019-11-12 13:03:50 +09007398}
7399
Paul Duffine05480a2021-03-08 15:07:14 +00007400var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007401 "api/current.txt": nil,
7402 "api/removed.txt": nil,
7403 "api/system-current.txt": nil,
7404 "api/system-removed.txt": nil,
7405 "api/test-current.txt": nil,
7406 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007407
Anton Hanssondff2c782020-12-21 17:10:01 +00007408 "100/public/api/foo.txt": nil,
7409 "100/public/api/foo-removed.txt": nil,
7410 "100/system/api/foo.txt": nil,
7411 "100/system/api/foo-removed.txt": nil,
7412
Paul Duffineedc5d52020-06-12 17:46:39 +01007413 // For java_sdk_library_import
7414 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007415}
7416
Jooyung Han58f26ab2019-12-18 15:34:32 +09007417func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007418 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007419 apex {
7420 name: "myapex",
7421 key: "myapex.key",
7422 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007423 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007424 }
7425
7426 apex_key {
7427 name: "myapex.key",
7428 public_key: "testkey.avbpubkey",
7429 private_key: "testkey.pem",
7430 }
7431
7432 java_sdk_library {
7433 name: "foo",
7434 srcs: ["a.java"],
7435 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007436 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007437 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007438
7439 prebuilt_apis {
7440 name: "sdk",
7441 api_dirs: ["100"],
7442 }
Paul Duffin9b879592020-05-26 13:21:35 +01007443 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007444
7445 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00007446 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007447 "javalib/foo.jar",
7448 "etc/permissions/foo.xml",
7449 })
7450 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007451 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007452 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 +09007453}
7454
Paul Duffin9b879592020-05-26 13:21:35 +01007455func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007456 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007457 apex {
7458 name: "myapex",
7459 key: "myapex.key",
7460 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007461 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007462 }
7463
7464 apex_key {
7465 name: "myapex.key",
7466 public_key: "testkey.avbpubkey",
7467 private_key: "testkey.pem",
7468 }
7469
7470 java_sdk_library {
7471 name: "foo",
7472 srcs: ["a.java"],
7473 api_packages: ["foo"],
7474 apex_available: ["myapex"],
7475 sdk_version: "none",
7476 system_modules: "none",
7477 }
7478
7479 java_library {
7480 name: "bar",
7481 srcs: ["a.java"],
7482 libs: ["foo"],
7483 apex_available: ["myapex"],
7484 sdk_version: "none",
7485 system_modules: "none",
7486 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007487
7488 prebuilt_apis {
7489 name: "sdk",
7490 api_dirs: ["100"],
7491 }
Paul Duffin9b879592020-05-26 13:21:35 +01007492 `, withFiles(filesForSdkLibrary))
7493
7494 // java_sdk_library installs both impl jar and permission XML
7495 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7496 "javalib/bar.jar",
7497 "javalib/foo.jar",
7498 "etc/permissions/foo.xml",
7499 })
7500
7501 // The bar library should depend on the implementation jar.
7502 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007503 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007504 t.Errorf("expected %q, found %#q", expected, actual)
7505 }
7506}
7507
7508func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007509 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007510 apex {
7511 name: "myapex",
7512 key: "myapex.key",
7513 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007514 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007515 }
7516
7517 apex_key {
7518 name: "myapex.key",
7519 public_key: "testkey.avbpubkey",
7520 private_key: "testkey.pem",
7521 }
7522
7523 java_sdk_library {
7524 name: "foo",
7525 srcs: ["a.java"],
7526 api_packages: ["foo"],
7527 apex_available: ["myapex"],
7528 sdk_version: "none",
7529 system_modules: "none",
7530 }
7531
7532 java_library {
7533 name: "bar",
7534 srcs: ["a.java"],
7535 libs: ["foo"],
7536 sdk_version: "none",
7537 system_modules: "none",
7538 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007539
7540 prebuilt_apis {
7541 name: "sdk",
7542 api_dirs: ["100"],
7543 }
Paul Duffin9b879592020-05-26 13:21:35 +01007544 `, withFiles(filesForSdkLibrary))
7545
7546 // java_sdk_library installs both impl jar and permission XML
7547 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7548 "javalib/foo.jar",
7549 "etc/permissions/foo.xml",
7550 })
7551
7552 // The bar library should depend on the stubs jar.
7553 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007554 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007555 t.Errorf("expected %q, found %#q", expected, actual)
7556 }
7557}
7558
Paul Duffineedc5d52020-06-12 17:46:39 +01007559func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007560 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007561 prebuilt_apis {
7562 name: "sdk",
7563 api_dirs: ["100"],
7564 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007565 withFiles(map[string][]byte{
7566 "apex/a.java": nil,
7567 "apex/apex_manifest.json": nil,
7568 "apex/Android.bp": []byte(`
7569 package {
7570 default_visibility: ["//visibility:private"],
7571 }
7572
7573 apex {
7574 name: "myapex",
7575 key: "myapex.key",
7576 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007577 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007578 }
7579
7580 apex_key {
7581 name: "myapex.key",
7582 public_key: "testkey.avbpubkey",
7583 private_key: "testkey.pem",
7584 }
7585
7586 java_library {
7587 name: "bar",
7588 srcs: ["a.java"],
7589 libs: ["foo"],
7590 apex_available: ["myapex"],
7591 sdk_version: "none",
7592 system_modules: "none",
7593 }
7594`),
7595 "source/a.java": nil,
7596 "source/api/current.txt": nil,
7597 "source/api/removed.txt": nil,
7598 "source/Android.bp": []byte(`
7599 package {
7600 default_visibility: ["//visibility:private"],
7601 }
7602
7603 java_sdk_library {
7604 name: "foo",
7605 visibility: ["//apex"],
7606 srcs: ["a.java"],
7607 api_packages: ["foo"],
7608 apex_available: ["myapex"],
7609 sdk_version: "none",
7610 system_modules: "none",
7611 public: {
7612 enabled: true,
7613 },
7614 }
7615`),
7616 "prebuilt/a.jar": nil,
7617 "prebuilt/Android.bp": []byte(`
7618 package {
7619 default_visibility: ["//visibility:private"],
7620 }
7621
7622 java_sdk_library_import {
7623 name: "foo",
7624 visibility: ["//apex", "//source"],
7625 apex_available: ["myapex"],
7626 prefer: true,
7627 public: {
7628 jars: ["a.jar"],
7629 },
7630 }
7631`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007632 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007633 )
7634
7635 // java_sdk_library installs both impl jar and permission XML
7636 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7637 "javalib/bar.jar",
7638 "javalib/foo.jar",
7639 "etc/permissions/foo.xml",
7640 })
7641
7642 // The bar library should depend on the implementation jar.
7643 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007644 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007645 t.Errorf("expected %q, found %#q", expected, actual)
7646 }
7647}
7648
7649func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7650 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7651 apex {
7652 name: "myapex",
7653 key: "myapex.key",
7654 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007655 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007656 }
7657
7658 apex_key {
7659 name: "myapex.key",
7660 public_key: "testkey.avbpubkey",
7661 private_key: "testkey.pem",
7662 }
7663
7664 java_sdk_library_import {
7665 name: "foo",
7666 apex_available: ["myapex"],
7667 prefer: true,
7668 public: {
7669 jars: ["a.jar"],
7670 },
7671 }
7672
7673 `, withFiles(filesForSdkLibrary))
7674}
7675
atrost6e126252020-01-27 17:01:16 +00007676func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007677 result := android.GroupFixturePreparers(
7678 prepareForApexTest,
7679 java.PrepareForTestWithPlatformCompatConfig,
7680 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007681 apex {
7682 name: "myapex",
7683 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007684 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007685 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007686 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007687 }
7688
7689 apex_key {
7690 name: "myapex.key",
7691 public_key: "testkey.avbpubkey",
7692 private_key: "testkey.pem",
7693 }
7694
7695 platform_compat_config {
7696 name: "myjar-platform-compat-config",
7697 src: ":myjar",
7698 }
7699
7700 java_library {
7701 name: "myjar",
7702 srcs: ["foo/bar/MyClass.java"],
7703 sdk_version: "none",
7704 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007705 apex_available: [ "myapex" ],
7706 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007707
7708 // Make sure that a preferred prebuilt does not affect the apex contents.
7709 prebuilt_platform_compat_config {
7710 name: "myjar-platform-compat-config",
7711 metadata: "compat-config/metadata.xml",
7712 prefer: true,
7713 }
atrost6e126252020-01-27 17:01:16 +00007714 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007715 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007716 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7717 "etc/compatconfig/myjar-platform-compat-config.xml",
7718 "javalib/myjar.jar",
7719 })
7720}
7721
Jooyung Han862c0d62022-12-21 10:15:37 +09007722func TestNoDupeApexFiles(t *testing.T) {
7723 android.GroupFixturePreparers(
7724 android.PrepareForTestWithAndroidBuildComponents,
7725 PrepareForTestWithApexBuildComponents,
7726 prepareForTestWithMyapex,
7727 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7728 ).
7729 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7730 RunTestWithBp(t, `
7731 apex {
7732 name: "myapex",
7733 key: "myapex.key",
7734 prebuilts: ["foo", "bar"],
7735 updatable: false,
7736 }
7737
7738 apex_key {
7739 name: "myapex.key",
7740 public_key: "testkey.avbpubkey",
7741 private_key: "testkey.pem",
7742 }
7743
7744 prebuilt_etc {
7745 name: "foo",
7746 src: "myprebuilt",
7747 filename_from_src: true,
7748 }
7749
7750 prebuilt_etc {
7751 name: "bar",
7752 src: "myprebuilt",
7753 filename_from_src: true,
7754 }
7755 `)
7756}
7757
Jiyong Park479321d2019-12-16 11:47:12 +09007758func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7759 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7760 apex {
7761 name: "myapex",
7762 key: "myapex.key",
7763 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007764 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007765 }
7766
7767 apex_key {
7768 name: "myapex.key",
7769 public_key: "testkey.avbpubkey",
7770 private_key: "testkey.pem",
7771 }
7772
7773 java_library {
7774 name: "myjar",
7775 srcs: ["foo/bar/MyClass.java"],
7776 sdk_version: "none",
7777 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007778 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007779 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007780 }
7781 `)
7782}
7783
Jiyong Park7afd1072019-12-30 16:56:33 +09007784func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007785 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007786 apex {
7787 name: "myapex",
7788 key: "myapex.key",
7789 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007790 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007791 }
7792
7793 apex_key {
7794 name: "myapex.key",
7795 public_key: "testkey.avbpubkey",
7796 private_key: "testkey.pem",
7797 }
7798
7799 cc_library {
7800 name: "mylib",
7801 srcs: ["mylib.cpp"],
7802 system_shared_libs: [],
7803 stl: "none",
7804 required: ["a", "b"],
7805 host_required: ["c", "d"],
7806 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007807 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007808 }
7809 `)
7810
7811 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007812 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007813 name := apexBundle.BaseModuleName()
7814 prefix := "TARGET_"
7815 var builder strings.Builder
7816 data.Custom(&builder, name, prefix, "", data)
7817 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007818 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007819 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7820 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007821}
7822
Jiyong Park7cd10e32020-01-14 09:22:18 +09007823func TestSymlinksFromApexToSystem(t *testing.T) {
7824 bp := `
7825 apex {
7826 name: "myapex",
7827 key: "myapex.key",
7828 native_shared_libs: ["mylib"],
7829 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007830 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007831 }
7832
Jiyong Park9d677202020-02-19 16:29:35 +09007833 apex {
7834 name: "myapex.updatable",
7835 key: "myapex.key",
7836 native_shared_libs: ["mylib"],
7837 java_libs: ["myjar"],
7838 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007839 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007840 }
7841
Jiyong Park7cd10e32020-01-14 09:22:18 +09007842 apex_key {
7843 name: "myapex.key",
7844 public_key: "testkey.avbpubkey",
7845 private_key: "testkey.pem",
7846 }
7847
7848 cc_library {
7849 name: "mylib",
7850 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007851 shared_libs: [
7852 "myotherlib",
7853 "myotherlib_ext",
7854 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007855 system_shared_libs: [],
7856 stl: "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 cc_library {
7866 name: "myotherlib",
7867 srcs: ["mylib.cpp"],
7868 system_shared_libs: [],
7869 stl: "none",
7870 apex_available: [
7871 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007872 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007873 "//apex_available:platform",
7874 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007875 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007876 }
7877
Jiyong Parkce243632023-02-17 18:22:25 +09007878 cc_library {
7879 name: "myotherlib_ext",
7880 srcs: ["mylib.cpp"],
7881 system_shared_libs: [],
7882 system_ext_specific: true,
7883 stl: "none",
7884 apex_available: [
7885 "myapex",
7886 "myapex.updatable",
7887 "//apex_available:platform",
7888 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007889 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007890 }
7891
Jiyong Park7cd10e32020-01-14 09:22:18 +09007892 java_library {
7893 name: "myjar",
7894 srcs: ["foo/bar/MyClass.java"],
7895 sdk_version: "none",
7896 system_modules: "none",
7897 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007898 apex_available: [
7899 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007900 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007901 "//apex_available:platform",
7902 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007903 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007904 }
7905
7906 java_library {
7907 name: "myotherjar",
7908 srcs: ["foo/bar/MyClass.java"],
7909 sdk_version: "none",
7910 system_modules: "none",
7911 apex_available: [
7912 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007913 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007914 "//apex_available:platform",
7915 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007916 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007917 }
7918 `
7919
7920 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7921 for _, f := range files {
7922 if f.path == file {
7923 if f.isLink {
7924 t.Errorf("%q is not a real file", file)
7925 }
7926 return
7927 }
7928 }
7929 t.Errorf("%q is not found", file)
7930 }
7931
Jiyong Parkce243632023-02-17 18:22:25 +09007932 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007933 for _, f := range files {
7934 if f.path == file {
7935 if !f.isLink {
7936 t.Errorf("%q is not a symlink", file)
7937 }
Jiyong Parkce243632023-02-17 18:22:25 +09007938 if f.src != target {
7939 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7940 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007941 return
7942 }
7943 }
7944 t.Errorf("%q is not found", file)
7945 }
7946
Jiyong Park9d677202020-02-19 16:29:35 +09007947 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7948 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007949 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007950 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007951 ensureRealfileExists(t, files, "javalib/myjar.jar")
7952 ensureRealfileExists(t, files, "lib64/mylib.so")
7953 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007954 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007955
Jiyong Park9d677202020-02-19 16:29:35 +09007956 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7957 ensureRealfileExists(t, files, "javalib/myjar.jar")
7958 ensureRealfileExists(t, files, "lib64/mylib.so")
7959 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007960 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007961
7962 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007963 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007964 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007965 ensureRealfileExists(t, files, "javalib/myjar.jar")
7966 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007967 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7968 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007969
7970 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7971 ensureRealfileExists(t, files, "javalib/myjar.jar")
7972 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007973 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7974 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007975}
7976
Yo Chiange8128052020-07-23 20:09:18 +08007977func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007978 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007979 apex {
7980 name: "myapex",
7981 key: "myapex.key",
7982 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007983 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007984 }
7985
7986 apex_key {
7987 name: "myapex.key",
7988 public_key: "testkey.avbpubkey",
7989 private_key: "testkey.pem",
7990 }
7991
7992 cc_library_shared {
7993 name: "mylib",
7994 srcs: ["mylib.cpp"],
7995 shared_libs: ["myotherlib"],
7996 system_shared_libs: [],
7997 stl: "none",
7998 apex_available: [
7999 "myapex",
8000 "//apex_available:platform",
8001 ],
8002 }
8003
8004 cc_prebuilt_library_shared {
8005 name: "myotherlib",
8006 srcs: ["prebuilt.so"],
8007 system_shared_libs: [],
8008 stl: "none",
8009 apex_available: [
8010 "myapex",
8011 "//apex_available:platform",
8012 ],
8013 }
8014 `)
8015
Prerana Patilb1896c82022-11-09 18:14:34 +00008016 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008017 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008018 var builder strings.Builder
8019 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8020 androidMk := builder.String()
8021 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008022 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008023 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8024 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8025 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008026 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008027}
8028
Jooyung Han643adc42020-02-27 13:50:06 +09008029func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008030 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008031 apex {
8032 name: "myapex",
8033 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09008034 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008035 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008036 }
8037
8038 apex_key {
8039 name: "myapex.key",
8040 public_key: "testkey.avbpubkey",
8041 private_key: "testkey.pem",
8042 }
8043
8044 cc_library {
8045 name: "mylib",
8046 srcs: ["mylib.cpp"],
8047 shared_libs: ["mylib2"],
8048 system_shared_libs: [],
8049 stl: "none",
8050 apex_available: [ "myapex" ],
8051 }
8052
8053 cc_library {
8054 name: "mylib2",
8055 srcs: ["mylib.cpp"],
8056 system_shared_libs: [],
8057 stl: "none",
8058 apex_available: [ "myapex" ],
8059 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008060
8061 rust_ffi_shared {
8062 name: "libfoo.rust",
8063 crate_name: "foo",
8064 srcs: ["foo.rs"],
8065 shared_libs: ["libfoo.shared_from_rust"],
8066 prefer_rlib: true,
8067 apex_available: ["myapex"],
8068 }
8069
8070 cc_library_shared {
8071 name: "libfoo.shared_from_rust",
8072 srcs: ["mylib.cpp"],
8073 system_shared_libs: [],
8074 stl: "none",
8075 stubs: {
8076 versions: ["10", "11", "12"],
8077 },
8078 }
8079
Jooyung Han643adc42020-02-27 13:50:06 +09008080 `)
8081
8082 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
8083 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09008084 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008085 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
8086 "lib64/mylib.so",
8087 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008088 "lib64/libfoo.rust.so",
8089 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8090 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008091 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008092
8093 // b/220397949
8094 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008095}
8096
Jooyung Han49f67012020-04-17 13:43:10 +09008097func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008098 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008099 apex {
8100 name: "myapex",
8101 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008102 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008103 }
8104 apex_key {
8105 name: "myapex.key",
8106 public_key: "testkey.avbpubkey",
8107 private_key: "testkey.pem",
8108 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008109 `,
8110 android.FixtureModifyConfig(func(config android.Config) {
8111 delete(config.Targets, android.Android)
8112 config.AndroidCommonTarget = android.Target{}
8113 }),
8114 )
Jooyung Han49f67012020-04-17 13:43:10 +09008115
8116 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8117 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8118 }
8119}
8120
Jiyong Parkbd159612020-02-28 15:22:21 +09008121func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008122 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008123 apex {
8124 name: "myapex",
8125 key: "myapex.key",
8126 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008127 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008128 }
8129
8130 apex_key {
8131 name: "myapex.key",
8132 public_key: "testkey.avbpubkey",
8133 private_key: "testkey.pem",
8134 }
8135
8136 android_app {
8137 name: "AppFoo",
8138 srcs: ["foo/bar/MyClass.java"],
8139 sdk_version: "none",
8140 system_modules: "none",
8141 apex_available: [ "myapex" ],
8142 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008143 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008144
Colin Crosscf371cc2020-11-13 11:48:42 -08008145 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09008146 content := bundleConfigRule.Args["content"]
8147
8148 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008149 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 +09008150}
8151
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008152func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008153 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008154 apex {
8155 name: "myapex",
8156 key: "myapex.key",
8157 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008158 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008159 }
8160
8161 apex_key {
8162 name: "myapex.key",
8163 public_key: "testkey.avbpubkey",
8164 private_key: "testkey.pem",
8165 }
8166
8167 android_app_set {
8168 name: "AppSet",
8169 set: "AppSet.apks",
8170 }`)
8171 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08008172 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008173 content := bundleConfigRule.Args["content"]
8174 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8175 s := mod.Rule("apexRule").Args["copy_commands"]
8176 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008177 if len(copyCmds) != 4 {
8178 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008179 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008180 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8181 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008182 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8183 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008184
8185 // Ensure that canned_fs_config has an entry for the app set zip file
8186 generateFsRule := mod.Rule("generateFsConfig")
8187 cmd := generateFsRule.RuleParams.Command
8188 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008189}
8190
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008191func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008192 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008193 apex_set {
8194 name: "myapex",
8195 filename: "foo_v2.apex",
8196 sanitized: {
8197 none: { set: "myapex.apks", },
8198 hwaddress: { set: "myapex.hwasan.apks", },
8199 },
Paul Duffin24704672021-04-06 16:09:30 +01008200 }
8201 `
8202 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008203
Paul Duffin24704672021-04-06 16:09:30 +01008204 // Check that the extractor produces the correct output file from the correct input file.
8205 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008206
Paul Duffin24704672021-04-06 16:09:30 +01008207 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8208 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008209
Paul Duffin24704672021-04-06 16:09:30 +01008210 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8211
8212 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008213 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8214 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008215
8216 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008217}
8218
Pranav Guptaeba03b02022-09-27 00:27:08 +00008219func TestApexSetApksModuleAssignment(t *testing.T) {
8220 ctx := testApex(t, `
8221 apex_set {
8222 name: "myapex",
8223 set: ":myapex_apks_file",
8224 }
8225
8226 filegroup {
8227 name: "myapex_apks_file",
8228 srcs: ["myapex.apks"],
8229 }
8230 `)
8231
8232 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8233
8234 // Check that the extractor produces the correct apks file from the input module
8235 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
8236 extractedApex := m.Output(extractorOutput)
8237
8238 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8239}
8240
Paul Duffin89f570a2021-06-16 01:42:33 +01008241func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008242 t.Helper()
8243
Paul Duffin55607122021-03-30 23:32:51 +01008244 fs := android.MockFS{
8245 "a.java": nil,
8246 "a.jar": nil,
8247 "apex_manifest.json": nil,
8248 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008249 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008250 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8251 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8252 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008253 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008254 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008255
Paul Duffin55607122021-03-30 23:32:51 +01008256 errorHandler := android.FixtureExpectsNoErrors
8257 if errmsg != "" {
8258 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008259 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008260
Paul Duffin55607122021-03-30 23:32:51 +01008261 result := android.GroupFixturePreparers(
8262 cc.PrepareForTestWithCcDefaultModules,
8263 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008264 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008265 java.PrepareForTestWithJavaSdkLibraryFiles,
8266 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008267 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008268 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008269 android.FixtureModifyMockFS(func(fs android.MockFS) {
8270 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8271 insert := ""
8272 for _, fragment := range fragments {
8273 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8274 }
8275 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8276 platform_bootclasspath {
8277 name: "platform-bootclasspath",
8278 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008279 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008280 %s
8281 ],
8282 }
8283 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008284 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008285 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008286 // Dexpreopt for boot jars requires the ART boot image profile.
8287 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8288 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008289 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008290 ).
8291 ExtendWithErrorHandler(errorHandler).
8292 RunTestWithBp(t, bp)
8293
8294 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008295}
8296
Paul Duffin5556c5f2022-06-09 17:32:21 +00008297func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008298 preparers := android.GroupFixturePreparers(
8299 java.PrepareForTestWithJavaDefaultModules,
8300 PrepareForTestWithApexBuildComponents,
8301 ).
8302 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
8303 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
8304
8305 bpBase := `
8306 apex_set {
8307 name: "com.android.myapex",
8308 installable: true,
8309 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8310 set: "myapex.apks",
8311 }
8312
8313 apex_set {
8314 name: "com.mycompany.android.myapex",
8315 apex_name: "com.android.myapex",
8316 installable: true,
8317 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8318 set: "company-myapex.apks",
8319 }
8320
8321 prebuilt_bootclasspath_fragment {
8322 name: "my-bootclasspath-fragment",
8323 apex_available: ["com.android.myapex"],
8324 %s
8325 }
8326 `
8327
8328 t.Run("java_import", func(t *testing.T) {
8329 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8330 java_import {
8331 name: "libfoo",
8332 jars: ["libfoo.jar"],
8333 apex_available: ["com.android.myapex"],
8334 }
8335 `)
8336 })
8337
8338 t.Run("java_sdk_library_import", func(t *testing.T) {
8339 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8340 java_sdk_library_import {
8341 name: "libfoo",
8342 public: {
8343 jars: ["libbar.jar"],
8344 },
8345 apex_available: ["com.android.myapex"],
8346 }
8347 `)
8348 })
8349
8350 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8351 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8352 image_name: "art",
8353 contents: ["libfoo"],
8354 `)+`
8355 java_sdk_library_import {
8356 name: "libfoo",
8357 public: {
8358 jars: ["libbar.jar"],
8359 },
8360 apex_available: ["com.android.myapex"],
8361 }
8362 `)
8363 })
8364}
8365
Paul Duffin5556c5f2022-06-09 17:32:21 +00008366func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8367 preparers := android.GroupFixturePreparers(
8368 java.PrepareForTestWithJavaDefaultModules,
8369 PrepareForTestWithApexBuildComponents,
8370 )
8371
8372 bpBase := `
8373 apex_set {
8374 name: "com.android.myapex",
8375 installable: true,
8376 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8377 set: "myapex.apks",
8378 }
8379
8380 apex_set {
8381 name: "com.android.myapex_compressed",
8382 apex_name: "com.android.myapex",
8383 installable: true,
8384 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8385 set: "myapex_compressed.apks",
8386 }
8387
8388 prebuilt_bootclasspath_fragment {
8389 name: "my-bootclasspath-fragment",
8390 apex_available: [
8391 "com.android.myapex",
8392 "com.android.myapex_compressed",
8393 ],
8394 hidden_api: {
8395 annotation_flags: "annotation-flags.csv",
8396 metadata: "metadata.csv",
8397 index: "index.csv",
8398 signature_patterns: "signature_patterns.csv",
8399 },
8400 %s
8401 }
8402 `
8403
8404 t.Run("java_import", func(t *testing.T) {
8405 result := preparers.RunTestWithBp(t,
8406 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8407 java_import {
8408 name: "libfoo",
8409 jars: ["libfoo.jar"],
8410 apex_available: [
8411 "com.android.myapex",
8412 "com.android.myapex_compressed",
8413 ],
8414 }
8415 `)
8416
8417 module := result.Module("libfoo", "android_common_com.android.myapex")
8418 usesLibraryDep := module.(java.UsesLibraryDependency)
8419 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8420 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8421 usesLibraryDep.DexJarBuildPath().Path())
8422 })
8423
8424 t.Run("java_sdk_library_import", func(t *testing.T) {
8425 result := preparers.RunTestWithBp(t,
8426 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8427 java_sdk_library_import {
8428 name: "libfoo",
8429 public: {
8430 jars: ["libbar.jar"],
8431 },
8432 apex_available: [
8433 "com.android.myapex",
8434 "com.android.myapex_compressed",
8435 ],
8436 compile_dex: true,
8437 }
8438 `)
8439
8440 module := result.Module("libfoo", "android_common_com.android.myapex")
8441 usesLibraryDep := module.(java.UsesLibraryDependency)
8442 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8443 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8444 usesLibraryDep.DexJarBuildPath().Path())
8445 })
8446
8447 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8448 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8449 image_name: "art",
8450 contents: ["libfoo"],
8451 `)+`
8452 java_sdk_library_import {
8453 name: "libfoo",
8454 public: {
8455 jars: ["libbar.jar"],
8456 },
8457 apex_available: [
8458 "com.android.myapex",
8459 "com.android.myapex_compressed",
8460 ],
8461 compile_dex: true,
8462 }
8463 `)
8464 })
8465}
8466
Jooyung Han548640b2020-04-27 12:10:30 +09008467func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8468 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8469 apex {
8470 name: "myapex",
8471 key: "myapex.key",
8472 updatable: true,
8473 }
8474
8475 apex_key {
8476 name: "myapex.key",
8477 public_key: "testkey.avbpubkey",
8478 private_key: "testkey.pem",
8479 }
8480 `)
8481}
8482
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008483func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8484 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8485 apex {
8486 name: "myapex",
8487 key: "myapex.key",
8488 }
8489
8490 apex_key {
8491 name: "myapex.key",
8492 public_key: "testkey.avbpubkey",
8493 private_key: "testkey.pem",
8494 }
8495 `)
8496}
8497
Jooyung Handfc864c2023-03-20 18:19:07 +09008498func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8499 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008500 apex {
8501 name: "myapex",
8502 key: "myapex.key",
8503 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008504 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008505 soc_specific: true,
8506 }
8507
8508 apex_key {
8509 name: "myapex.key",
8510 public_key: "testkey.avbpubkey",
8511 private_key: "testkey.pem",
8512 }
8513 `)
8514}
8515
Jooyung Han02873da2023-03-22 17:41:03 +09008516func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8517 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8518 apex {
8519 name: "myapex",
8520 key: "myapex.key",
8521 updatable: false,
8522 min_sdk_version: "29",
8523 use_vndk_as_stable: true,
8524 vendor: true,
8525 }
8526
8527 apex_key {
8528 name: "myapex.key",
8529 public_key: "testkey.avbpubkey",
8530 private_key: "testkey.pem",
8531 }
8532 `)
8533}
8534
Jooyung Handfc864c2023-03-20 18:19:07 +09008535func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8536 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8537 apex {
8538 name: "myapex",
8539 key: "myapex.key",
8540 updatable: false,
8541 use_vndk_as_stable: true,
8542 }
8543
8544 apex_key {
8545 name: "myapex.key",
8546 public_key: "testkey.avbpubkey",
8547 private_key: "testkey.pem",
8548 }
8549 `)
8550}
8551
satayevb98371c2021-06-15 16:49:50 +01008552func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8553 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8554 apex {
8555 name: "myapex",
8556 key: "myapex.key",
8557 systemserverclasspath_fragments: [
8558 "mysystemserverclasspathfragment",
8559 ],
8560 min_sdk_version: "29",
8561 updatable: true,
8562 }
8563
8564 apex_key {
8565 name: "myapex.key",
8566 public_key: "testkey.avbpubkey",
8567 private_key: "testkey.pem",
8568 }
8569
8570 java_library {
8571 name: "foo",
8572 srcs: ["b.java"],
8573 min_sdk_version: "29",
8574 installable: true,
8575 apex_available: [
8576 "myapex",
8577 ],
8578 }
8579
8580 systemserverclasspath_fragment {
8581 name: "mysystemserverclasspathfragment",
8582 generate_classpaths_proto: false,
8583 contents: [
8584 "foo",
8585 ],
8586 apex_available: [
8587 "myapex",
8588 ],
8589 }
satayevabcd5972021-08-06 17:49:46 +01008590 `,
8591 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8592 )
satayevb98371c2021-06-15 16:49:50 +01008593}
8594
Paul Duffin064b70c2020-11-02 17:32:38 +00008595func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008596 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008597 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008598 fragment := java.ApexVariantReference{
8599 Apex: proptools.StringPtr("myapex"),
8600 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8601 }
8602
Paul Duffin064b70c2020-11-02 17:32:38 +00008603 testDexpreoptWithApexes(t, `
8604 prebuilt_apex {
8605 name: "myapex" ,
8606 arch: {
8607 arm64: {
8608 src: "myapex-arm64.apex",
8609 },
8610 arm: {
8611 src: "myapex-arm.apex",
8612 },
8613 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008614 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8615 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008616
Paul Duffin89f570a2021-06-16 01:42:33 +01008617 prebuilt_bootclasspath_fragment {
8618 name: "my-bootclasspath-fragment",
8619 contents: ["libfoo"],
8620 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008621 hidden_api: {
8622 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8623 metadata: "my-bootclasspath-fragment/metadata.csv",
8624 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008625 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8626 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8627 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008628 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008629 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008630
Paul Duffin89f570a2021-06-16 01:42:33 +01008631 java_import {
8632 name: "libfoo",
8633 jars: ["libfoo.jar"],
8634 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008635 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008636 }
8637 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008638 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008639}
8640
Spandan Dasf14e2542021-11-12 00:01:37 +00008641func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008642 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008643 bp += `
8644 apex_key {
8645 name: "myapex.key",
8646 public_key: "testkey.avbpubkey",
8647 private_key: "testkey.pem",
8648 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008649 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008650 "lib1/src/A.java": nil,
8651 "lib2/src/B.java": nil,
8652 "system/sepolicy/apex/myapex-file_contexts": nil,
8653 }
8654
Paul Duffin45338f02021-03-30 23:07:52 +01008655 errorHandler := android.FixtureExpectsNoErrors
8656 if errmsg != "" {
8657 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008658 }
Colin Crossae8600b2020-10-29 17:09:13 -07008659
Paul Duffin45338f02021-03-30 23:07:52 +01008660 android.GroupFixturePreparers(
8661 android.PrepareForTestWithAndroidBuildComponents,
8662 java.PrepareForTestWithJavaBuildComponents,
8663 PrepareForTestWithApexBuildComponents,
8664 android.PrepareForTestWithNeverallowRules(rules),
8665 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008666 apexBootJars := make([]string, 0, len(bootJars))
8667 for _, apexBootJar := range bootJars {
8668 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008669 }
satayevd604b212021-07-21 14:23:52 +01008670 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008671 }),
8672 fs.AddToFixture(),
8673 ).
8674 ExtendWithErrorHandler(errorHandler).
8675 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008676}
8677
8678func TestApexPermittedPackagesRules(t *testing.T) {
8679 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008680 name string
8681 expectedError string
8682 bp string
8683 bootJars []string
8684 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008685 }{
8686
8687 {
8688 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8689 expectedError: "",
8690 bp: `
8691 java_library {
8692 name: "bcp_lib1",
8693 srcs: ["lib1/src/*.java"],
8694 permitted_packages: ["foo.bar"],
8695 apex_available: ["myapex"],
8696 sdk_version: "none",
8697 system_modules: "none",
8698 }
8699 java_library {
8700 name: "nonbcp_lib2",
8701 srcs: ["lib2/src/*.java"],
8702 apex_available: ["myapex"],
8703 permitted_packages: ["a.b"],
8704 sdk_version: "none",
8705 system_modules: "none",
8706 }
8707 apex {
8708 name: "myapex",
8709 key: "myapex.key",
8710 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008711 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008712 }`,
8713 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008714 bcpPermittedPackages: map[string][]string{
8715 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008716 "foo.bar",
8717 },
8718 },
8719 },
8720 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008721 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008722 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 +01008723 bp: `
8724 java_library {
8725 name: "bcp_lib1",
8726 srcs: ["lib1/src/*.java"],
8727 apex_available: ["myapex"],
8728 permitted_packages: ["foo.bar"],
8729 sdk_version: "none",
8730 system_modules: "none",
8731 }
8732 java_library {
8733 name: "bcp_lib2",
8734 srcs: ["lib2/src/*.java"],
8735 apex_available: ["myapex"],
8736 permitted_packages: ["foo.bar", "bar.baz"],
8737 sdk_version: "none",
8738 system_modules: "none",
8739 }
8740 apex {
8741 name: "myapex",
8742 key: "myapex.key",
8743 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008744 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008745 }
8746 `,
8747 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008748 bcpPermittedPackages: map[string][]string{
8749 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008750 "foo.bar",
8751 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008752 "bcp_lib2": []string{
8753 "foo.bar",
8754 },
8755 },
8756 },
8757 {
8758 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8759 expectedError: "",
8760 bp: `
8761 java_library {
8762 name: "bcp_lib_restricted",
8763 srcs: ["lib1/src/*.java"],
8764 apex_available: ["myapex"],
8765 permitted_packages: ["foo.bar"],
8766 sdk_version: "none",
8767 min_sdk_version: "29",
8768 system_modules: "none",
8769 }
8770 java_library {
8771 name: "bcp_lib_unrestricted",
8772 srcs: ["lib2/src/*.java"],
8773 apex_available: ["myapex"],
8774 permitted_packages: ["foo.bar", "bar.baz"],
8775 sdk_version: "none",
8776 min_sdk_version: "29",
8777 system_modules: "none",
8778 }
8779 apex {
8780 name: "myapex",
8781 key: "myapex.key",
8782 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8783 updatable: true,
8784 min_sdk_version: "29",
8785 }
8786 `,
8787 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8788 bcpPermittedPackages: map[string][]string{
8789 "bcp_lib1_non_updateable": []string{
8790 "foo.bar",
8791 },
8792 // 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 +01008793 },
8794 },
8795 }
8796 for _, tc := range testcases {
8797 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008798 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8799 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008800 })
8801 }
8802}
8803
Jiyong Park62304bb2020-04-13 16:19:48 +09008804func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008805 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008806 apex {
8807 name: "myapex",
8808 key: "myapex.key",
8809 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008810 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008811 }
8812
8813 apex_key {
8814 name: "myapex.key",
8815 public_key: "testkey.avbpubkey",
8816 private_key: "testkey.pem",
8817 }
8818
8819 cc_library {
8820 name: "mylib",
8821 srcs: ["mylib.cpp"],
8822 system_shared_libs: [],
8823 stl: "none",
8824 stubs: {
8825 versions: ["1"],
8826 },
8827 apex_available: ["myapex"],
8828 }
8829
8830 cc_library {
8831 name: "myprivlib",
8832 srcs: ["mylib.cpp"],
8833 system_shared_libs: [],
8834 stl: "none",
8835 apex_available: ["myapex"],
8836 }
8837
8838
8839 cc_test {
8840 name: "mytest",
8841 gtest: false,
8842 srcs: ["mylib.cpp"],
8843 system_shared_libs: [],
8844 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008845 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008846 test_for: ["myapex"]
8847 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008848
8849 cc_library {
8850 name: "mytestlib",
8851 srcs: ["mylib.cpp"],
8852 system_shared_libs: [],
8853 shared_libs: ["mylib", "myprivlib"],
8854 stl: "none",
8855 test_for: ["myapex"],
8856 }
8857
8858 cc_benchmark {
8859 name: "mybench",
8860 srcs: ["mylib.cpp"],
8861 system_shared_libs: [],
8862 shared_libs: ["mylib", "myprivlib"],
8863 stl: "none",
8864 test_for: ["myapex"],
8865 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008866 `)
8867
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008868 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008869 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008870 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8871 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8872 }
8873
8874 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008875 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008876 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8877 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8878 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8879}
Jiyong Park46a512f2020-12-04 18:02:13 +09008880
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008881func TestIndirectTestFor(t *testing.T) {
8882 ctx := testApex(t, `
8883 apex {
8884 name: "myapex",
8885 key: "myapex.key",
8886 native_shared_libs: ["mylib", "myprivlib"],
8887 updatable: false,
8888 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008889
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008890 apex_key {
8891 name: "myapex.key",
8892 public_key: "testkey.avbpubkey",
8893 private_key: "testkey.pem",
8894 }
8895
8896 cc_library {
8897 name: "mylib",
8898 srcs: ["mylib.cpp"],
8899 system_shared_libs: [],
8900 stl: "none",
8901 stubs: {
8902 versions: ["1"],
8903 },
8904 apex_available: ["myapex"],
8905 }
8906
8907 cc_library {
8908 name: "myprivlib",
8909 srcs: ["mylib.cpp"],
8910 system_shared_libs: [],
8911 stl: "none",
8912 shared_libs: ["mylib"],
8913 apex_available: ["myapex"],
8914 }
8915
8916 cc_library {
8917 name: "mytestlib",
8918 srcs: ["mylib.cpp"],
8919 system_shared_libs: [],
8920 shared_libs: ["myprivlib"],
8921 stl: "none",
8922 test_for: ["myapex"],
8923 }
8924 `)
8925
8926 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008927 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008928 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8929 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8930 }
8931
8932 // The platform variant of mytestlib links to the platform variant of the
8933 // internal myprivlib.
8934 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8935
8936 // The platform variant of myprivlib links to the platform variant of mylib
8937 // and bypasses its stubs.
8938 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 +09008939}
8940
Martin Stjernholmec009002021-03-27 15:18:31 +00008941func TestTestForForLibInOtherApex(t *testing.T) {
8942 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8943 _ = testApex(t, `
8944 apex {
8945 name: "com.android.art",
8946 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008947 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008948 updatable: false,
8949 }
8950
8951 apex {
8952 name: "com.android.art.debug",
8953 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008954 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008955 updatable: false,
8956 }
8957
8958 apex_key {
8959 name: "myapex.key",
8960 public_key: "testkey.avbpubkey",
8961 private_key: "testkey.pem",
8962 }
8963
8964 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008965 name: "libnativebridge",
8966 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008967 system_shared_libs: [],
8968 stl: "none",
8969 stubs: {
8970 versions: ["1"],
8971 },
8972 apex_available: ["com.android.art", "com.android.art.debug"],
8973 }
8974
8975 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008976 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008977 srcs: ["mylib.cpp"],
8978 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008979 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008980 stl: "none",
8981 apex_available: ["com.android.art.debug"],
8982 test_for: ["com.android.art"],
8983 }
8984 `,
8985 android.MockFS{
8986 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8987 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8988 }.AddToFixture())
8989}
8990
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008991// TODO(jungjw): Move this to proptools
8992func intPtr(i int) *int {
8993 return &i
8994}
8995
8996func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008997 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008998 apex_set {
8999 name: "myapex",
9000 set: "myapex.apks",
9001 filename: "foo_v2.apex",
9002 overrides: ["foo"],
9003 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009004 `,
9005 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9006 variables.Platform_sdk_version = intPtr(30)
9007 }),
9008 android.FixtureModifyConfig(func(config android.Config) {
9009 config.Targets[android.Android] = []android.Target{
9010 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9011 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9012 }
9013 }),
9014 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009015
Paul Duffin24704672021-04-06 16:09:30 +01009016 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009017
9018 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009019 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009020 actual := extractedApex.Args["abis"]
9021 expected := "ARMEABI_V7A,ARM64_V8A"
9022 if actual != expected {
9023 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9024 }
9025 actual = extractedApex.Args["sdk-version"]
9026 expected = "30"
9027 if actual != expected {
9028 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9029 }
9030
Paul Duffin6717d882021-06-15 19:09:41 +01009031 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009032 a := m.Module().(*ApexSet)
9033 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009034 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009035 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9036 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9037 }
9038}
9039
Anton Hansson805e0a52022-11-25 14:06:46 +00009040func TestApexSet_NativeBridge(t *testing.T) {
9041 ctx := testApex(t, `
9042 apex_set {
9043 name: "myapex",
9044 set: "myapex.apks",
9045 filename: "foo_v2.apex",
9046 overrides: ["foo"],
9047 }
9048 `,
9049 android.FixtureModifyConfig(func(config android.Config) {
9050 config.Targets[android.Android] = []android.Target{
9051 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9052 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9053 }
9054 }),
9055 )
9056
9057 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
9058
9059 // Check extract_apks tool parameters. No native bridge arch expected
9060 extractedApex := m.Output("extracted/myapex.apks")
9061 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9062}
9063
Jiyong Park7d95a512020-05-10 15:16:24 +09009064func TestNoStaticLinkingToStubsLib(t *testing.T) {
9065 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9066 apex {
9067 name: "myapex",
9068 key: "myapex.key",
9069 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009070 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009071 }
9072
9073 apex_key {
9074 name: "myapex.key",
9075 public_key: "testkey.avbpubkey",
9076 private_key: "testkey.pem",
9077 }
9078
9079 cc_library {
9080 name: "mylib",
9081 srcs: ["mylib.cpp"],
9082 static_libs: ["otherlib"],
9083 system_shared_libs: [],
9084 stl: "none",
9085 apex_available: [ "myapex" ],
9086 }
9087
9088 cc_library {
9089 name: "otherlib",
9090 srcs: ["mylib.cpp"],
9091 system_shared_libs: [],
9092 stl: "none",
9093 stubs: {
9094 versions: ["1", "2", "3"],
9095 },
9096 apex_available: [ "myapex" ],
9097 }
9098 `)
9099}
9100
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009101func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009102 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009103 apex {
9104 name: "myapex",
9105 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009106 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009107 custom_sign_tool: "sign_myapex",
9108 }
9109
9110 apex_key {
9111 name: "myapex.key",
9112 public_key: "testkey.avbpubkey",
9113 private_key: "testkey.pem",
9114 }
9115 `)
9116
9117 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9118 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009119 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 +09009120}
9121
9122func TestApexKeysTxtOverrides(t *testing.T) {
9123 ctx := testApex(t, `
9124 apex {
9125 name: "myapex",
9126 key: "myapex.key",
9127 updatable: false,
9128 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009129 }
9130
9131 apex_key {
9132 name: "myapex.key",
9133 public_key: "testkey.avbpubkey",
9134 private_key: "testkey.pem",
9135 }
9136
9137 prebuilt_apex {
9138 name: "myapex",
9139 prefer: true,
9140 arch: {
9141 arm64: {
9142 src: "myapex-arm64.apex",
9143 },
9144 arm: {
9145 src: "myapex-arm.apex",
9146 },
9147 },
9148 }
9149
9150 apex_set {
9151 name: "myapex_set",
9152 set: "myapex.apks",
9153 filename: "myapex_set.apex",
9154 overrides: ["myapex"],
9155 }
9156 `)
9157
9158 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9159 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
9160 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 +09009161 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 +09009162}
9163
Jooyung Han938b5932020-06-20 12:47:47 +09009164func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009165 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009166 apex {
9167 name: "myapex",
9168 key: "myapex.key",
9169 apps: ["app"],
9170 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009171 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009172 }
9173
9174 apex_key {
9175 name: "myapex.key",
9176 public_key: "testkey.avbpubkey",
9177 private_key: "testkey.pem",
9178 }
9179
9180 android_app {
9181 name: "app",
9182 srcs: ["foo/bar/MyClass.java"],
9183 package_name: "foo",
9184 sdk_version: "none",
9185 system_modules: "none",
9186 apex_available: [ "myapex" ],
9187 }
9188 `, withFiles(map[string][]byte{
9189 "sub/Android.bp": []byte(`
9190 override_apex {
9191 name: "override_myapex",
9192 base: "myapex",
9193 apps: ["override_app"],
9194 allowed_files: ":allowed",
9195 }
9196 // Overridable "path" property should be referenced indirectly
9197 filegroup {
9198 name: "allowed",
9199 srcs: ["allowed.txt"],
9200 }
9201 override_android_app {
9202 name: "override_app",
9203 base: "app",
9204 package_name: "bar",
9205 }
9206 `),
9207 }))
9208
9209 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
9210 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9211 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9212 }
9213
9214 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
9215 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9216 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9217 }
9218}
9219
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009220func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009221 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009222 apex {
9223 name: "myapex",
9224 key: "myapex.key",
9225 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009226 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009227 }
9228
9229 apex_key {
9230 name: "myapex.key",
9231 public_key: "testkey.avbpubkey",
9232 private_key: "testkey.pem",
9233 }
9234
9235 cc_library {
9236 name: "mylib",
9237 srcs: ["mylib.cpp"],
9238 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009239 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009240 },
9241 apex_available: ["myapex"],
9242 }
9243
9244 cc_prebuilt_library_shared {
9245 name: "mylib",
9246 prefer: false,
9247 srcs: ["prebuilt.so"],
9248 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009249 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009250 },
9251 apex_available: ["myapex"],
9252 }
9253 `)
9254}
9255
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009256func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009257 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009258 apex {
9259 name: "myapex",
9260 key: "myapex.key",
9261 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009262 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009263 }
9264 apex_key {
9265 name: "myapex.key",
9266 public_key: "testkey.avbpubkey",
9267 private_key: "testkey.pem",
9268 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009269 `,
9270 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9271 variables.CompressedApex = proptools.BoolPtr(true)
9272 }),
9273 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009274
9275 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
9276 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9277
9278 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
9279 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9280
9281 // Make sure output of bundle is .capex
9282 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9283 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9284
9285 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009286 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009287 var builder strings.Builder
9288 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9289 androidMk := builder.String()
9290 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9291}
9292
Martin Stjernholm2856c662020-12-02 15:03:42 +00009293func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009294 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009295 apex {
9296 name: "myapex",
9297 key: "myapex.key",
9298 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009299 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009300 }
9301
9302 apex_key {
9303 name: "myapex.key",
9304 public_key: "testkey.avbpubkey",
9305 private_key: "testkey.pem",
9306 }
9307
9308 cc_library {
9309 name: "mylib",
9310 srcs: ["mylib.cpp"],
9311 apex_available: ["myapex"],
9312 shared_libs: ["otherlib"],
9313 system_shared_libs: [],
9314 }
9315
9316 cc_library {
9317 name: "otherlib",
9318 srcs: ["mylib.cpp"],
9319 stubs: {
9320 versions: ["current"],
9321 },
9322 }
9323
9324 cc_prebuilt_library_shared {
9325 name: "otherlib",
9326 prefer: true,
9327 srcs: ["prebuilt.so"],
9328 stubs: {
9329 versions: ["current"],
9330 },
9331 }
9332 `)
9333
9334 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009335 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009336 var builder strings.Builder
9337 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9338 androidMk := builder.String()
9339
9340 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9341 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009342 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009343}
9344
Jiyong Parke3867542020-12-03 17:28:25 +09009345func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009346 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009347 apex {
9348 name: "myapex",
9349 key: "myapex.key",
9350 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009351 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009352 }
9353
9354 apex_key {
9355 name: "myapex.key",
9356 public_key: "testkey.avbpubkey",
9357 private_key: "testkey.pem",
9358 }
9359
9360 cc_library {
9361 name: "mylib",
9362 srcs: ["mylib.cpp"],
9363 system_shared_libs: [],
9364 stl: "none",
9365 apex_available: ["myapex"],
9366 shared_libs: ["mylib2"],
9367 target: {
9368 apex: {
9369 exclude_shared_libs: ["mylib2"],
9370 },
9371 },
9372 }
9373
9374 cc_library {
9375 name: "mylib2",
9376 srcs: ["mylib.cpp"],
9377 system_shared_libs: [],
9378 stl: "none",
9379 }
9380 `)
9381
9382 // Check if mylib is linked to mylib2 for the non-apex target
9383 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9384 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9385
9386 // Make sure that the link doesn't occur for the apex target
9387 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9388 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9389
9390 // It shouldn't appear in the copy cmd as well.
9391 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
9392 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9393}
9394
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009395func TestPrebuiltStubLibDep(t *testing.T) {
9396 bpBase := `
9397 apex {
9398 name: "myapex",
9399 key: "myapex.key",
9400 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009401 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009402 }
9403 apex_key {
9404 name: "myapex.key",
9405 public_key: "testkey.avbpubkey",
9406 private_key: "testkey.pem",
9407 }
9408 cc_library {
9409 name: "mylib",
9410 srcs: ["mylib.cpp"],
9411 apex_available: ["myapex"],
9412 shared_libs: ["stublib"],
9413 system_shared_libs: [],
9414 }
9415 apex {
9416 name: "otherapex",
9417 enabled: %s,
9418 key: "myapex.key",
9419 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009420 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009421 }
9422 `
9423
9424 stublibSourceBp := `
9425 cc_library {
9426 name: "stublib",
9427 srcs: ["mylib.cpp"],
9428 apex_available: ["otherapex"],
9429 system_shared_libs: [],
9430 stl: "none",
9431 stubs: {
9432 versions: ["1"],
9433 },
9434 }
9435 `
9436
9437 stublibPrebuiltBp := `
9438 cc_prebuilt_library_shared {
9439 name: "stublib",
9440 srcs: ["prebuilt.so"],
9441 apex_available: ["otherapex"],
9442 stubs: {
9443 versions: ["1"],
9444 },
9445 %s
9446 }
9447 `
9448
9449 tests := []struct {
9450 name string
9451 stublibBp string
9452 usePrebuilt bool
9453 modNames []string // Modules to collect AndroidMkEntries for
9454 otherApexEnabled []string
9455 }{
9456 {
9457 name: "only_source",
9458 stublibBp: stublibSourceBp,
9459 usePrebuilt: false,
9460 modNames: []string{"stublib"},
9461 otherApexEnabled: []string{"true", "false"},
9462 },
9463 {
9464 name: "source_preferred",
9465 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9466 usePrebuilt: false,
9467 modNames: []string{"stublib", "prebuilt_stublib"},
9468 otherApexEnabled: []string{"true", "false"},
9469 },
9470 {
9471 name: "prebuilt_preferred",
9472 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9473 usePrebuilt: true,
9474 modNames: []string{"stublib", "prebuilt_stublib"},
9475 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9476 },
9477 {
9478 name: "only_prebuilt",
9479 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9480 usePrebuilt: true,
9481 modNames: []string{"stublib"},
9482 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9483 },
9484 }
9485
9486 for _, test := range tests {
9487 t.Run(test.name, func(t *testing.T) {
9488 for _, otherApexEnabled := range test.otherApexEnabled {
9489 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009490 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009491
9492 type modAndMkEntries struct {
9493 mod *cc.Module
9494 mkEntries android.AndroidMkEntries
9495 }
9496 entries := []*modAndMkEntries{}
9497
9498 // Gather shared lib modules that are installable
9499 for _, modName := range test.modNames {
9500 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9501 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9502 continue
9503 }
9504 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009505 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009506 continue
9507 }
Colin Crossaa255532020-07-03 13:18:24 -07009508 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009509 if ent.Disabled {
9510 continue
9511 }
9512 entries = append(entries, &modAndMkEntries{
9513 mod: mod,
9514 mkEntries: ent,
9515 })
9516 }
9517 }
9518 }
9519
9520 var entry *modAndMkEntries = nil
9521 for _, ent := range entries {
9522 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9523 if entry != nil {
9524 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9525 } else {
9526 entry = ent
9527 }
9528 }
9529 }
9530
9531 if entry == nil {
9532 t.Errorf("AndroidMk entry for \"stublib\" missing")
9533 } else {
9534 isPrebuilt := entry.mod.Prebuilt() != nil
9535 if isPrebuilt != test.usePrebuilt {
9536 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9537 }
9538 if !entry.mod.IsStubs() {
9539 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9540 }
9541 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9542 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9543 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009544 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009545 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009546 if !android.InList(expected, cflags) {
9547 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9548 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009549 }
9550 })
9551 }
9552 })
9553 }
9554}
9555
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009556func TestHostApexInHostOnlyBuild(t *testing.T) {
9557 testApex(t, `
9558 apex {
9559 name: "myapex",
9560 host_supported: true,
9561 key: "myapex.key",
9562 updatable: false,
9563 payload_type: "zip",
9564 }
9565 apex_key {
9566 name: "myapex.key",
9567 public_key: "testkey.avbpubkey",
9568 private_key: "testkey.pem",
9569 }
9570 `,
9571 android.FixtureModifyConfig(func(config android.Config) {
9572 // We may not have device targets in all builds, e.g. in
9573 // prebuilts/build-tools/build-prebuilts.sh
9574 config.Targets[android.Android] = []android.Target{}
9575 }))
9576}
9577
Colin Crossc33e5212021-05-25 18:16:02 -07009578func TestApexJavaCoverage(t *testing.T) {
9579 bp := `
9580 apex {
9581 name: "myapex",
9582 key: "myapex.key",
9583 java_libs: ["mylib"],
9584 bootclasspath_fragments: ["mybootclasspathfragment"],
9585 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9586 updatable: false,
9587 }
9588
9589 apex_key {
9590 name: "myapex.key",
9591 public_key: "testkey.avbpubkey",
9592 private_key: "testkey.pem",
9593 }
9594
9595 java_library {
9596 name: "mylib",
9597 srcs: ["mylib.java"],
9598 apex_available: ["myapex"],
9599 compile_dex: true,
9600 }
9601
9602 bootclasspath_fragment {
9603 name: "mybootclasspathfragment",
9604 contents: ["mybootclasspathlib"],
9605 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009606 hidden_api: {
9607 split_packages: ["*"],
9608 },
Colin Crossc33e5212021-05-25 18:16:02 -07009609 }
9610
9611 java_library {
9612 name: "mybootclasspathlib",
9613 srcs: ["mybootclasspathlib.java"],
9614 apex_available: ["myapex"],
9615 compile_dex: true,
9616 }
9617
9618 systemserverclasspath_fragment {
9619 name: "mysystemserverclasspathfragment",
9620 contents: ["mysystemserverclasspathlib"],
9621 apex_available: ["myapex"],
9622 }
9623
9624 java_library {
9625 name: "mysystemserverclasspathlib",
9626 srcs: ["mysystemserverclasspathlib.java"],
9627 apex_available: ["myapex"],
9628 compile_dex: true,
9629 }
9630 `
9631
9632 result := android.GroupFixturePreparers(
9633 PrepareForTestWithApexBuildComponents,
9634 prepareForTestWithMyapex,
9635 java.PrepareForTestWithJavaDefaultModules,
9636 android.PrepareForTestWithAndroidBuildComponents,
9637 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009638 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9639 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009640 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009641 ).RunTest(t)
9642
9643 // Make sure jacoco ran on both mylib and mybootclasspathlib
9644 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9645 t.Errorf("Failed to find jacoco rule for mylib")
9646 }
9647 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9648 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9649 }
9650 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9651 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9652 }
9653}
9654
Jiyong Park192600a2021-08-03 07:52:17 +00009655func TestProhibitStaticExecutable(t *testing.T) {
9656 testApexError(t, `executable mybin is static`, `
9657 apex {
9658 name: "myapex",
9659 key: "myapex.key",
9660 binaries: ["mybin"],
9661 min_sdk_version: "29",
9662 }
9663
9664 apex_key {
9665 name: "myapex.key",
9666 public_key: "testkey.avbpubkey",
9667 private_key: "testkey.pem",
9668 }
9669
9670 cc_binary {
9671 name: "mybin",
9672 srcs: ["mylib.cpp"],
9673 relative_install_path: "foo/bar",
9674 static_executable: true,
9675 system_shared_libs: [],
9676 stl: "none",
9677 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009678 min_sdk_version: "29",
9679 }
9680 `)
9681
9682 testApexError(t, `executable mybin.rust is static`, `
9683 apex {
9684 name: "myapex",
9685 key: "myapex.key",
9686 binaries: ["mybin.rust"],
9687 min_sdk_version: "29",
9688 }
9689
9690 apex_key {
9691 name: "myapex.key",
9692 public_key: "testkey.avbpubkey",
9693 private_key: "testkey.pem",
9694 }
9695
9696 rust_binary {
9697 name: "mybin.rust",
9698 srcs: ["foo.rs"],
9699 static_executable: true,
9700 apex_available: ["myapex"],
9701 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009702 }
9703 `)
9704}
9705
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009706func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9707 ctx := testApex(t, `
9708 apex {
9709 name: "myapex",
9710 key: "myapex.key",
9711 updatable: false,
9712 java_libs: ["foo"],
9713 }
9714
9715 apex_key {
9716 name: "myapex.key",
9717 public_key: "testkey.avbpubkey",
9718 private_key: "testkey.pem",
9719 }
9720
9721 java_library {
9722 name: "foo",
9723 srcs: ["foo.java"],
9724 apex_available: ["myapex"],
9725 installable: true,
9726 }
9727 `,
9728 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
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 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 +00009737}
9738
9739func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9740 ctx := testApex(t, `
9741 prebuilt_apex {
9742 name: "myapex",
9743 arch: {
9744 arm64: {
9745 src: "myapex-arm64.apex",
9746 },
9747 arm: {
9748 src: "myapex-arm.apex",
9749 },
9750 },
9751 exported_java_libs: ["foo"],
9752 }
9753
9754 java_import {
9755 name: "foo",
9756 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009757 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009758 }
9759 `,
9760 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9761 )
9762
9763 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9764 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9765 mainModuleEntries := entriesList[0]
9766 android.AssertArrayString(t,
9767 "LOCAL_REQUIRED_MODULES",
9768 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9769 []string{
9770 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9771 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9772 })
9773}
9774
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009775func TestAndroidMk_RequiredModules(t *testing.T) {
9776 ctx := testApex(t, `
9777 apex {
9778 name: "myapex",
9779 key: "myapex.key",
9780 updatable: false,
9781 java_libs: ["foo"],
9782 required: ["otherapex"],
9783 }
9784
9785 apex {
9786 name: "otherapex",
9787 key: "myapex.key",
9788 updatable: false,
9789 java_libs: ["foo"],
9790 required: ["otherapex"],
9791 }
9792
9793 apex_key {
9794 name: "myapex.key",
9795 public_key: "testkey.avbpubkey",
9796 private_key: "testkey.pem",
9797 }
9798
9799 java_library {
9800 name: "foo",
9801 srcs: ["foo.java"],
9802 apex_available: ["myapex", "otherapex"],
9803 installable: true,
9804 }
9805 `)
9806
9807 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9808 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9809 var builder strings.Builder
9810 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9811 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009812 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009813}
9814
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009815func TestAndroidMk_RequiredDeps(t *testing.T) {
9816 ctx := testApex(t, `
9817 apex {
9818 name: "myapex",
9819 key: "myapex.key",
9820 updatable: false,
9821 }
9822
9823 apex_key {
9824 name: "myapex.key",
9825 public_key: "testkey.avbpubkey",
9826 private_key: "testkey.pem",
9827 }
9828 `)
9829
9830 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009831 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009832 data := android.AndroidMkDataForTest(t, ctx, bundle)
9833 var builder strings.Builder
9834 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9835 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009836 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009837}
9838
Jooyung Hana6d36672022-02-24 13:58:07 +09009839func TestApexOutputFileProducer(t *testing.T) {
9840 for _, tc := range []struct {
9841 name string
9842 ref string
9843 expected_data []string
9844 }{
9845 {
9846 name: "test_using_output",
9847 ref: ":myapex",
9848 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9849 },
9850 {
9851 name: "test_using_apex",
9852 ref: ":myapex{.apex}",
9853 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9854 },
9855 } {
9856 t.Run(tc.name, func(t *testing.T) {
9857 ctx := testApex(t, `
9858 apex {
9859 name: "myapex",
9860 key: "myapex.key",
9861 compressible: true,
9862 updatable: false,
9863 }
9864
9865 apex_key {
9866 name: "myapex.key",
9867 public_key: "testkey.avbpubkey",
9868 private_key: "testkey.pem",
9869 }
9870
9871 java_test {
9872 name: "`+tc.name+`",
9873 srcs: ["a.java"],
9874 data: ["`+tc.ref+`"],
9875 }
9876 `,
9877 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9878 variables.CompressedApex = proptools.BoolPtr(true)
9879 }))
9880 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9881 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9882 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9883 })
9884 }
9885}
9886
satayev758968a2021-12-06 11:42:40 +00009887func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9888 preparer := android.GroupFixturePreparers(
9889 PrepareForTestWithApexBuildComponents,
9890 prepareForTestWithMyapex,
9891 java.PrepareForTestWithJavaSdkLibraryFiles,
9892 java.PrepareForTestWithJavaDefaultModules,
9893 android.PrepareForTestWithAndroidBuildComponents,
9894 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9895 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9896 )
9897
9898 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9899 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9900 preparer.RunTestWithBp(t, `
9901 apex {
9902 name: "myapex",
9903 key: "myapex.key",
9904 bootclasspath_fragments: ["mybootclasspathfragment"],
9905 min_sdk_version: "30",
9906 updatable: false,
9907 }
9908
9909 apex_key {
9910 name: "myapex.key",
9911 public_key: "testkey.avbpubkey",
9912 private_key: "testkey.pem",
9913 }
9914
9915 bootclasspath_fragment {
9916 name: "mybootclasspathfragment",
9917 contents: ["mybootclasspathlib"],
9918 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009919 hidden_api: {
9920 split_packages: ["*"],
9921 },
satayev758968a2021-12-06 11:42:40 +00009922 }
9923
9924 java_sdk_library {
9925 name: "mybootclasspathlib",
9926 srcs: ["mybootclasspathlib.java"],
9927 apex_available: ["myapex"],
9928 compile_dex: true,
9929 unsafe_ignore_missing_latest_api: true,
9930 min_sdk_version: "31",
9931 static_libs: ["util"],
9932 }
9933
9934 java_library {
9935 name: "util",
9936 srcs: ["a.java"],
9937 apex_available: ["myapex"],
9938 min_sdk_version: "31",
9939 static_libs: ["another_util"],
9940 }
9941
9942 java_library {
9943 name: "another_util",
9944 srcs: ["a.java"],
9945 min_sdk_version: "31",
9946 apex_available: ["myapex"],
9947 }
9948 `)
9949 })
9950
9951 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9952 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9953 preparer.RunTestWithBp(t, `
9954 apex {
9955 name: "myapex",
9956 key: "myapex.key",
9957 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9958 min_sdk_version: "30",
9959 updatable: false,
9960 }
9961
9962 apex_key {
9963 name: "myapex.key",
9964 public_key: "testkey.avbpubkey",
9965 private_key: "testkey.pem",
9966 }
9967
9968 systemserverclasspath_fragment {
9969 name: "mysystemserverclasspathfragment",
9970 contents: ["mysystemserverclasspathlib"],
9971 apex_available: ["myapex"],
9972 }
9973
9974 java_sdk_library {
9975 name: "mysystemserverclasspathlib",
9976 srcs: ["mysystemserverclasspathlib.java"],
9977 apex_available: ["myapex"],
9978 compile_dex: true,
9979 min_sdk_version: "32",
9980 unsafe_ignore_missing_latest_api: true,
9981 static_libs: ["util"],
9982 }
9983
9984 java_library {
9985 name: "util",
9986 srcs: ["a.java"],
9987 apex_available: ["myapex"],
9988 min_sdk_version: "31",
9989 static_libs: ["another_util"],
9990 }
9991
9992 java_library {
9993 name: "another_util",
9994 srcs: ["a.java"],
9995 min_sdk_version: "31",
9996 apex_available: ["myapex"],
9997 }
9998 `)
9999 })
10000
10001 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10002 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
10003 RunTestWithBp(t, `
10004 apex {
10005 name: "myapex",
10006 key: "myapex.key",
10007 bootclasspath_fragments: ["mybootclasspathfragment"],
10008 min_sdk_version: "30",
10009 updatable: false,
10010 }
10011
10012 apex_key {
10013 name: "myapex.key",
10014 public_key: "testkey.avbpubkey",
10015 private_key: "testkey.pem",
10016 }
10017
10018 bootclasspath_fragment {
10019 name: "mybootclasspathfragment",
10020 contents: ["mybootclasspathlib"],
10021 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010022 hidden_api: {
10023 split_packages: ["*"],
10024 },
satayev758968a2021-12-06 11:42:40 +000010025 }
10026
10027 java_sdk_library {
10028 name: "mybootclasspathlib",
10029 srcs: ["mybootclasspathlib.java"],
10030 apex_available: ["myapex"],
10031 compile_dex: true,
10032 unsafe_ignore_missing_latest_api: true,
10033 }
10034 `)
10035 })
10036
10037 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10038 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10039 RunTestWithBp(t, `
10040 apex {
10041 name: "myapex",
10042 key: "myapex.key",
10043 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10044 min_sdk_version: "30",
10045 updatable: false,
10046 }
10047
10048 apex_key {
10049 name: "myapex.key",
10050 public_key: "testkey.avbpubkey",
10051 private_key: "testkey.pem",
10052 }
10053
10054 systemserverclasspath_fragment {
10055 name: "mysystemserverclasspathfragment",
10056 contents: ["mysystemserverclasspathlib"],
10057 apex_available: ["myapex"],
10058 }
10059
10060 java_sdk_library {
10061 name: "mysystemserverclasspathlib",
10062 srcs: ["mysystemserverclasspathlib.java"],
10063 apex_available: ["myapex"],
10064 compile_dex: true,
10065 unsafe_ignore_missing_latest_api: true,
10066 }
10067 `)
10068 })
10069}
10070
Jiakai Zhang6decef92022-01-12 17:56:19 +000010071// Verifies that the APEX depends on all the Make modules in the list.
10072func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10073 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10074 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010075 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010076 }
10077}
10078
10079// Verifies that the APEX does not depend on any of the Make modules in the list.
10080func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10081 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10082 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010083 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010084 }
10085}
10086
Cole Faust1021ccd2023-02-26 21:15:25 -080010087// TODO(b/193460475): Re-enable this test
10088//func TestApexStrictUpdtabilityLint(t *testing.T) {
10089// bpTemplate := `
10090// apex {
10091// name: "myapex",
10092// key: "myapex.key",
10093// java_libs: ["myjavalib"],
10094// updatable: %v,
10095// min_sdk_version: "29",
10096// }
10097// apex_key {
10098// name: "myapex.key",
10099// }
10100// java_library {
10101// name: "myjavalib",
10102// srcs: ["MyClass.java"],
10103// apex_available: [ "myapex" ],
10104// lint: {
10105// strict_updatability_linting: %v,
10106// },
10107// sdk_version: "current",
10108// min_sdk_version: "29",
10109// }
10110// `
10111// fs := android.MockFS{
10112// "lint-baseline.xml": nil,
10113// }
10114//
10115// testCases := []struct {
10116// testCaseName string
10117// apexUpdatable bool
10118// javaStrictUpdtabilityLint bool
10119// lintFileExists bool
10120// disallowedFlagExpected bool
10121// }{
10122// {
10123// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10124// apexUpdatable: true,
10125// javaStrictUpdtabilityLint: true,
10126// lintFileExists: false,
10127// disallowedFlagExpected: false,
10128// },
10129// {
10130// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10131// apexUpdatable: false,
10132// javaStrictUpdtabilityLint: false,
10133// lintFileExists: true,
10134// disallowedFlagExpected: false,
10135// },
10136// {
10137// testCaseName: "non-updatable apex respects strict updatability of javalib",
10138// apexUpdatable: false,
10139// javaStrictUpdtabilityLint: true,
10140// lintFileExists: true,
10141// disallowedFlagExpected: true,
10142// },
10143// {
10144// testCaseName: "updatable apex sets strict updatability of javalib to true",
10145// apexUpdatable: true,
10146// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10147// lintFileExists: true,
10148// disallowedFlagExpected: true,
10149// },
10150// }
10151//
10152// for _, testCase := range testCases {
10153// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10154// fixtures := []android.FixturePreparer{}
10155// if testCase.lintFileExists {
10156// fixtures = append(fixtures, fs.AddToFixture())
10157// }
10158//
10159// result := testApex(t, bp, fixtures...)
10160// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10161// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10162// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10163//
10164// if disallowedFlagActual != testCase.disallowedFlagExpected {
10165// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10166// }
10167// }
10168//}
10169//
10170//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10171// bp := `
10172// apex {
10173// name: "myapex",
10174// key: "myapex.key",
10175// java_libs: ["myjavalib"],
10176// updatable: true,
10177// min_sdk_version: "29",
10178// }
10179// apex_key {
10180// name: "myapex.key",
10181// }
10182// java_library {
10183// name: "myjavalib",
10184// srcs: ["MyClass.java"],
10185// apex_available: [ "myapex" ],
10186// sdk_version: "current",
10187// min_sdk_version: "29",
10188// }
10189// `
10190//
10191// testCases := []struct {
10192// testCaseName string
10193// moduleDirectory string
10194// disallowedFlagExpected bool
10195// }{
10196// {
10197// testCaseName: "lintable module defined outside libcore",
10198// moduleDirectory: "",
10199// disallowedFlagExpected: true,
10200// },
10201// {
10202// testCaseName: "lintable module defined in libcore root directory",
10203// moduleDirectory: "libcore/",
10204// disallowedFlagExpected: false,
10205// },
10206// {
10207// testCaseName: "lintable module defined in libcore child directory",
10208// moduleDirectory: "libcore/childdir/",
10209// disallowedFlagExpected: true,
10210// },
10211// }
10212//
10213// for _, testCase := range testCases {
10214// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10215// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10216// result := testApex(t, "", lintFileCreator, bpFileCreator)
10217// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10218// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10219// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10220// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10221//
10222// if disallowedFlagActual != testCase.disallowedFlagExpected {
10223// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10224// }
10225// }
10226//}
10227//
10228//// checks transtive deps of an apex coming from bootclasspath_fragment
10229//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10230// bp := `
10231// apex {
10232// name: "myapex",
10233// key: "myapex.key",
10234// bootclasspath_fragments: ["mybootclasspathfragment"],
10235// updatable: true,
10236// min_sdk_version: "29",
10237// }
10238// apex_key {
10239// name: "myapex.key",
10240// }
10241// bootclasspath_fragment {
10242// name: "mybootclasspathfragment",
10243// contents: ["myjavalib"],
10244// apex_available: ["myapex"],
10245// hidden_api: {
10246// split_packages: ["*"],
10247// },
10248// }
10249// java_library {
10250// name: "myjavalib",
10251// srcs: ["MyClass.java"],
10252// apex_available: [ "myapex" ],
10253// sdk_version: "current",
10254// min_sdk_version: "29",
10255// compile_dex: true,
10256// }
10257// `
10258// fs := android.MockFS{
10259// "lint-baseline.xml": nil,
10260// }
10261//
10262// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10263// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10264// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10265// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10266// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10267// }
10268//}
Spandan Das66773252022-01-15 00:23:18 +000010269
Spandan Das42e89502022-05-06 22:12:55 +000010270// updatable apexes should propagate updatable=true to its apps
10271func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10272 bp := `
10273 apex {
10274 name: "myapex",
10275 key: "myapex.key",
10276 updatable: %v,
10277 apps: [
10278 "myapp",
10279 ],
10280 min_sdk_version: "30",
10281 }
10282 apex_key {
10283 name: "myapex.key",
10284 }
10285 android_app {
10286 name: "myapp",
10287 updatable: %v,
10288 apex_available: [
10289 "myapex",
10290 ],
10291 sdk_version: "current",
10292 min_sdk_version: "30",
10293 }
10294 `
10295 testCases := []struct {
10296 name string
10297 apex_is_updatable_bp bool
10298 app_is_updatable_bp bool
10299 app_is_updatable_expected bool
10300 }{
10301 {
10302 name: "Non-updatable apex respects updatable property of non-updatable app",
10303 apex_is_updatable_bp: false,
10304 app_is_updatable_bp: false,
10305 app_is_updatable_expected: false,
10306 },
10307 {
10308 name: "Non-updatable apex respects updatable property of updatable app",
10309 apex_is_updatable_bp: false,
10310 app_is_updatable_bp: true,
10311 app_is_updatable_expected: true,
10312 },
10313 {
10314 name: "Updatable apex respects updatable property of updatable app",
10315 apex_is_updatable_bp: true,
10316 app_is_updatable_bp: true,
10317 app_is_updatable_expected: true,
10318 },
10319 {
10320 name: "Updatable apex sets updatable=true on non-updatable app",
10321 apex_is_updatable_bp: true,
10322 app_is_updatable_bp: false,
10323 app_is_updatable_expected: true,
10324 },
10325 }
10326 for _, testCase := range testCases {
10327 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10328 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10329 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10330 }
10331}
10332
Kiyoung Kim487689e2022-07-26 09:48:22 +090010333func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10334 bp := `
10335 apex {
10336 name: "myapex",
10337 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010338 native_shared_libs: ["libbaz"],
10339 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010340 min_sdk_version: "29",
10341 }
10342 apex_key {
10343 name: "myapex.key",
10344 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010345 cc_binary {
10346 name: "binfoo",
10347 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010348 apex_available: ["myapex"],
10349 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010350 recovery_available: false,
10351 }
10352 cc_library {
10353 name: "libbar",
10354 srcs: ["libbar.cc"],
10355 stubs: {
10356 symbol_file: "libbar.map.txt",
10357 versions: [
10358 "29",
10359 ],
10360 },
10361 }
10362 cc_library {
10363 name: "libbaz",
10364 srcs: ["libbaz.cc"],
10365 apex_available: ["myapex"],
10366 min_sdk_version: "29",
10367 stubs: {
10368 symbol_file: "libbaz.map.txt",
10369 versions: [
10370 "29",
10371 ],
10372 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010373 }
10374 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010375 name: "libbar",
10376 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010377 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010378 variants: ["apex.29"],
10379 }
10380 cc_api_variant {
10381 name: "libbar",
10382 variant: "apex",
10383 version: "29",
10384 src: "libbar_apex_29.so",
10385 }
10386 cc_api_library {
10387 name: "libbaz",
10388 src: "libbaz_stub.so",
10389 min_sdk_version: "29",
10390 variants: ["apex.29"],
10391 }
10392 cc_api_variant {
10393 name: "libbaz",
10394 variant: "apex",
10395 version: "29",
10396 src: "libbaz_apex_29.so",
10397 }
10398 cc_api_library {
10399 name: "libqux",
10400 src: "libqux_stub.so",
10401 min_sdk_version: "29",
10402 variants: ["apex.29"],
10403 }
10404 cc_api_variant {
10405 name: "libqux",
10406 variant: "apex",
10407 version: "29",
10408 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010409 }
10410 api_imports {
10411 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010412 apex_shared_libs: [
10413 "libbar",
10414 "libbaz",
10415 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010416 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010417 }
10418 `
10419 result := testApex(t, bp)
10420
10421 hasDep := func(m android.Module, wantDep android.Module) bool {
10422 t.Helper()
10423 var found bool
10424 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10425 if dep == wantDep {
10426 found = true
10427 }
10428 })
10429 return found
10430 }
10431
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010432 // Library defines stubs and cc_api_library should be used with cc_api_library
10433 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10434 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10435 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010436
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010437 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10438 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010439
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010440 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10441 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10442 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10443 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10444
10445 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10446 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10447 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10448 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10449 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10450
10451 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10452 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10453 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10454
10455 // cc_api_library defined without original library should be linked with cc_api_library
10456 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10457 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10458 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10459}
10460
10461func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10462 bp := `
10463 apex {
10464 name: "myapex",
10465 key: "myapex.key",
10466 native_shared_libs: ["libbar"],
10467 min_sdk_version: "29",
10468 }
10469 apex_key {
10470 name: "myapex.key",
10471 }
10472 cc_binary {
10473 name: "binfoo",
10474 shared_libs: ["libbar"],
10475 recovery_available: false,
10476 }
10477 cc_library {
10478 name: "libbar",
10479 srcs: ["libbar.cc"],
10480 apex_available: ["myapex"],
10481 min_sdk_version: "29",
10482 stubs: {
10483 symbol_file: "libbar.map.txt",
10484 versions: [
10485 "29",
10486 ],
10487 },
10488 }
10489 cc_api_library {
10490 name: "libbar",
10491 src: "libbar_stub.so",
10492 variants: ["apex.29"],
10493 }
10494 cc_api_variant {
10495 name: "libbar",
10496 variant: "apex",
10497 version: "29",
10498 src: "libbar_apex_29.so",
10499 }
10500 api_imports {
10501 name: "api_imports",
10502 apex_shared_libs: [
10503 "libbar",
10504 ],
10505 }
10506 `
10507
10508 result := testApex(t, bp)
10509
10510 hasDep := func(m android.Module, wantDep android.Module) bool {
10511 t.Helper()
10512 var found bool
10513 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10514 if dep == wantDep {
10515 found = true
10516 }
10517 })
10518 return found
10519 }
10520
10521 // Library defines stubs and cc_api_library should be used with cc_api_library
10522 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10523 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10524 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10525
10526 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10527 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10528
10529 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10530 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10531 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10532 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010533}
Dennis Shend4f5d932023-01-31 20:27:21 +000010534
10535func TestTrimmedApex(t *testing.T) {
10536 bp := `
10537 apex {
10538 name: "myapex",
10539 key: "myapex.key",
10540 native_shared_libs: ["libfoo","libbaz"],
10541 min_sdk_version: "29",
10542 trim_against: "mydcla",
10543 }
10544 apex {
10545 name: "mydcla",
10546 key: "myapex.key",
10547 native_shared_libs: ["libfoo","libbar"],
10548 min_sdk_version: "29",
10549 file_contexts: ":myapex-file_contexts",
10550 dynamic_common_lib_apex: true,
10551 }
10552 apex_key {
10553 name: "myapex.key",
10554 }
10555 cc_library {
10556 name: "libfoo",
10557 shared_libs: ["libc"],
10558 apex_available: ["myapex","mydcla"],
10559 min_sdk_version: "29",
10560 }
10561 cc_library {
10562 name: "libbar",
10563 shared_libs: ["libc"],
10564 apex_available: ["myapex","mydcla"],
10565 min_sdk_version: "29",
10566 }
10567 cc_library {
10568 name: "libbaz",
10569 shared_libs: ["libc"],
10570 apex_available: ["myapex","mydcla"],
10571 min_sdk_version: "29",
10572 }
10573 cc_api_library {
10574 name: "libc",
10575 src: "libc.so",
10576 min_sdk_version: "29",
10577 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010578 vendor_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010579 }
10580 api_imports {
10581 name: "api_imports",
10582 shared_libs: [
10583 "libc",
10584 ],
10585 header_libs: [],
10586 }
10587 `
10588 ctx := testApex(t, bp)
10589 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10590 apexRule := module.MaybeRule("apexRule")
10591 if apexRule.Rule == nil {
10592 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10593 }
10594
10595 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
10596 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
10597 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10598 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10599 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10600 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10601}
Jingwen Chendea7a642023-03-28 11:30:50 +000010602
10603func TestCannedFsConfig(t *testing.T) {
10604 ctx := testApex(t, `
10605 apex {
10606 name: "myapex",
10607 key: "myapex.key",
10608 updatable: false,
10609 }
10610
10611 apex_key {
10612 name: "myapex.key",
10613 public_key: "testkey.avbpubkey",
10614 private_key: "testkey.pem",
10615 }`)
10616 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10617 generateFsRule := mod.Rule("generateFsConfig")
10618 cmd := generateFsRule.RuleParams.Command
10619
10620 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10621}
10622
10623func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10624 ctx := testApex(t, `
10625 apex {
10626 name: "myapex",
10627 key: "myapex.key",
10628 canned_fs_config: "my_config",
10629 updatable: false,
10630 }
10631
10632 apex_key {
10633 name: "myapex.key",
10634 public_key: "testkey.avbpubkey",
10635 private_key: "testkey.pem",
10636 }`)
10637 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10638 generateFsRule := mod.Rule("generateFsConfig")
10639 cmd := generateFsRule.RuleParams.Command
10640
10641 // Ensure that canned_fs_config has "cat my_config" at the end
10642 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10643}
Spandan Das20fce2d2023-04-12 17:21:39 +000010644
10645func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10646 testCases := []struct {
10647 desc string
10648 hasStubs bool
10649 apexAvailable string
10650 expectedError string
10651 }{
10652 {
10653 desc: "non-stub library can have multiple apex_available",
10654 hasStubs: false,
10655 apexAvailable: `["myapex", "otherapex"]`,
10656 },
10657 {
10658 desc: "stub library should not be available to anyapex",
10659 hasStubs: true,
10660 apexAvailable: `["//apex_available:anyapex"]`,
10661 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10662 },
10663 {
10664 desc: "stub library should not be available to multiple apexes",
10665 hasStubs: true,
10666 apexAvailable: `["myapex", "otherapex"]`,
10667 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10668 },
10669 {
10670 desc: "stub library can be available to a core apex and a test apex",
10671 hasStubs: true,
10672 apexAvailable: `["myapex", "test_myapex"]`,
10673 },
10674 }
10675 bpTemplate := `
10676 cc_library {
10677 name: "libfoo",
10678 %v
10679 apex_available: %v,
10680 }
10681 apex {
10682 name: "myapex",
10683 key: "apex.key",
10684 updatable: false,
10685 native_shared_libs: ["libfoo"],
10686 }
10687 apex {
10688 name: "otherapex",
10689 key: "apex.key",
10690 updatable: false,
10691 }
10692 apex_test {
10693 name: "test_myapex",
10694 key: "apex.key",
10695 updatable: false,
10696 native_shared_libs: ["libfoo"],
10697 }
10698 apex_key {
10699 name: "apex.key",
10700 }
10701 `
10702 for _, tc := range testCases {
10703 stubs := ""
10704 if tc.hasStubs {
10705 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10706 }
10707 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10708 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10709 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10710 })
10711 if tc.expectedError == "" {
10712 testApex(t, bp, mockFsFixturePreparer)
10713 } else {
10714 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10715 }
10716 }
10717}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010718
10719func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10720 context := android.GroupFixturePreparers(
10721 android.PrepareForIntegrationTestWithAndroid,
10722 cc.PrepareForIntegrationTestWithCc,
10723 PrepareForTestWithApexBuildComponents,
10724 prepareForTestWithMyapex,
10725 filesystem.PrepareForTestWithFilesystemBuildComponents,
10726 )
10727 result := context.RunTestWithBp(t, `
10728 android_system_image {
10729 name: "myfilesystem",
10730 deps: [
10731 "libfoo",
10732 ],
10733 linker_config_src: "linker.config.json",
10734 }
10735
10736 cc_library {
10737 name: "libfoo",
10738 shared_libs: [
10739 "libbar",
10740 ],
10741 stl: "none",
10742 }
10743
10744 cc_library {
10745 name: "libbar",
10746 stl: "none",
10747 apex_available: ["myapex"],
10748 }
10749
10750 apex {
10751 name: "myapex",
10752 native_shared_libs: ["libbar"],
10753 key: "myapex.key",
10754 updatable: false,
10755 }
10756
10757 apex_key {
10758 name: "myapex.key",
10759 public_key: "testkey.avbpubkey",
10760 private_key: "testkey.pem",
10761 }
10762 `)
10763
10764 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10765 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10766 inputs.Strings(),
10767 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10768}