blob: 05988365b6c64342df00820a7878a80cd751ff9c [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Kiyoung Kim487689e2022-07-26 09:48:22 +090028 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090029 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070036 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090037 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090038 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070039 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090040)
41
Jooyung Hand3639552019-08-09 12:57:43 +090042// names returns name list from white space separated string
43func names(s string) (ns []string) {
44 for _, n := range strings.Split(s, " ") {
45 if len(n) > 0 {
46 ns = append(ns, n)
47 }
48 }
49 return
50}
51
Paul Duffin40b62572021-03-20 11:39:01 +000052func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090053 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010054 android.GroupFixturePreparers(
55 prepareForApexTest,
56 android.GroupFixturePreparers(preparers...),
57 ).
Paul Duffine05480a2021-03-08 15:07:14 +000058 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000059 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090060}
61
Paul Duffin40b62572021-03-20 11:39:01 +000062func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090063 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010064
65 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000066 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010067 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000068 }
Paul Duffin284165a2021-03-29 01:50:31 +010069
70 result := android.GroupFixturePreparers(
71 prepareForApexTest,
72 android.GroupFixturePreparers(preparers...),
73 optionalBpPreparer,
74 ).RunTest(t)
75
Paul Duffine05480a2021-03-08 15:07:14 +000076 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090077}
78
Paul Duffin810f33d2021-03-09 14:12:32 +000079func withFiles(files android.MockFS) android.FixturePreparer {
80 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090081}
82
Paul Duffin810f33d2021-03-09 14:12:32 +000083func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
84 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090085 for k, v := range targets {
86 config.Targets[k] = v
87 }
Paul Duffin810f33d2021-03-09 14:12:32 +000088 })
Jooyung Han344d5432019-08-23 11:17:39 +090089}
90
Jooyung Han35155c42020-02-06 17:33:20 +090091// withNativeBridgeTargets sets configuration with targets including:
92// - X86_64 (primary)
93// - X86 (secondary)
94// - Arm64 on X86_64 (native bridge)
95// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000096var withNativeBridgeEnabled = android.FixtureModifyConfig(
97 func(config android.Config) {
98 config.Targets[android.Android] = []android.Target{
99 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
100 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
104 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
107 }
108 },
109)
110
111func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
112 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
113 variables.ManifestPackageNameOverrides = specs
114 })
Jooyung Han35155c42020-02-06 17:33:20 +0900115}
116
Albert Martineefabcf2022-03-21 20:11:16 +0000117func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
118 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
119 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
120 })
121}
122
Paul Duffin810f33d2021-03-09 14:12:32 +0000123var withBinder32bit = android.FixtureModifyProductVariables(
124 func(variables android.FixtureProductVariables) {
125 variables.Binder32bit = proptools.BoolPtr(true)
126 },
127)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900128
Paul Duffin810f33d2021-03-09 14:12:32 +0000129var withUnbundledBuild = android.FixtureModifyProductVariables(
130 func(variables android.FixtureProductVariables) {
131 variables.Unbundled_build = proptools.BoolPtr(true)
132 },
133)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900134
Paul Duffin284165a2021-03-29 01:50:31 +0100135// Legacy preparer used for running tests within the apex package.
136//
137// This includes everything that was needed to run any test in the apex package prior to the
138// introduction of the test fixtures. Tests that are being converted to use fixtures directly
139// rather than through the testApex...() methods should avoid using this and instead use the
140// various preparers directly, using android.GroupFixturePreparers(...) to group them when
141// necessary.
142//
143// deprecated
144var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000145 // General preparers in alphabetical order as test infrastructure will enforce correct
146 // registration order.
147 android.PrepareForTestWithAndroidBuildComponents,
148 bpf.PrepareForTestWithBpf,
149 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100150 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000151 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
152 rust.PrepareForTestWithRustDefaultModules,
153 sh.PrepareForTestWithShBuildComponents,
154
155 PrepareForTestWithApexBuildComponents,
156
157 // Additional apex test specific preparers.
158 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
159 filegroup {
160 name: "myapex-file_contexts",
161 srcs: [
162 "apex/myapex-file_contexts",
163 ],
164 }
165 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000166 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000167 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000168 "a.java": nil,
169 "PrebuiltAppFoo.apk": nil,
170 "PrebuiltAppFooPriv.apk": nil,
171 "apex_manifest.json": nil,
172 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000173 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
174 "system/sepolicy/apex/myapex2-file_contexts": nil,
175 "system/sepolicy/apex/otherapex-file_contexts": nil,
176 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
177 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700178 "mylib.cpp": nil,
179 "mytest.cpp": nil,
180 "mytest1.cpp": nil,
181 "mytest2.cpp": nil,
182 "mytest3.cpp": nil,
183 "myprebuilt": nil,
184 "my_include": nil,
185 "foo/bar/MyClass.java": nil,
186 "prebuilt.jar": nil,
187 "prebuilt.so": nil,
188 "vendor/foo/devkeys/test.x509.pem": nil,
189 "vendor/foo/devkeys/test.pk8": nil,
190 "testkey.x509.pem": nil,
191 "testkey.pk8": nil,
192 "testkey.override.x509.pem": nil,
193 "testkey.override.pk8": nil,
194 "vendor/foo/devkeys/testkey.avbpubkey": nil,
195 "vendor/foo/devkeys/testkey.pem": nil,
196 "NOTICE": nil,
197 "custom_notice": nil,
198 "custom_notice_for_static_lib": nil,
199 "testkey2.avbpubkey": nil,
200 "testkey2.pem": nil,
201 "myapex-arm64.apex": nil,
202 "myapex-arm.apex": nil,
203 "myapex.apks": nil,
204 "frameworks/base/api/current.txt": nil,
205 "framework/aidl/a.aidl": nil,
206 "dummy.txt": nil,
207 "baz": nil,
208 "bar/baz": nil,
209 "testdata/baz": nil,
210 "AppSet.apks": nil,
211 "foo.rs": nil,
212 "libfoo.jar": nil,
213 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000214 },
215 ),
216
217 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
218 variables.DeviceVndkVersion = proptools.StringPtr("current")
219 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
220 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
221 variables.Platform_sdk_codename = proptools.StringPtr("Q")
222 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000223 // "Tiramisu" needs to be in the next line for compatibility with soong code,
224 // not because of these tests specifically (it's not used by the tests)
225 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900226 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000227 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000228 }),
229)
230
Paul Duffin52bfaa42021-03-23 23:40:12 +0000231var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
232 "system/sepolicy/apex/myapex-file_contexts": nil,
233})
234
Jooyung Han643adc42020-02-27 13:50:06 +0900235// ensure that 'result' equals 'expected'
236func ensureEquals(t *testing.T, result string, expected string) {
237 t.Helper()
238 if result != expected {
239 t.Errorf("%q != %q", expected, result)
240 }
241}
242
Jiyong Park25fc6a92018-11-18 18:02:45 +0900243// ensure that 'result' contains 'expected'
244func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900245 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900246 if !strings.Contains(result, expected) {
247 t.Errorf("%q is not found in %q", expected, result)
248 }
249}
250
Liz Kammer5bd365f2020-05-27 15:15:11 -0700251// ensure that 'result' contains 'expected' exactly one time
252func ensureContainsOnce(t *testing.T, result string, expected string) {
253 t.Helper()
254 count := strings.Count(result, expected)
255 if count != 1 {
256 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
257 }
258}
259
Jiyong Park25fc6a92018-11-18 18:02:45 +0900260// ensures that 'result' does not contain 'notExpected'
261func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900262 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900263 if strings.Contains(result, notExpected) {
264 t.Errorf("%q is found in %q", notExpected, result)
265 }
266}
267
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700268func ensureMatches(t *testing.T, result string, expectedRex string) {
269 ok, err := regexp.MatchString(expectedRex, result)
270 if err != nil {
271 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
272 return
273 }
274 if !ok {
275 t.Errorf("%s does not match regular expession %s", result, expectedRex)
276 }
277}
278
Jiyong Park25fc6a92018-11-18 18:02:45 +0900279func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900280 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900281 if !android.InList(expected, result) {
282 t.Errorf("%q is not found in %v", expected, result)
283 }
284}
285
286func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900287 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900288 if android.InList(notExpected, result) {
289 t.Errorf("%q is found in %v", notExpected, result)
290 }
291}
292
Jooyung Hane1633032019-08-01 17:41:43 +0900293func ensureListEmpty(t *testing.T, result []string) {
294 t.Helper()
295 if len(result) > 0 {
296 t.Errorf("%q is expected to be empty", result)
297 }
298}
299
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000300func ensureListNotEmpty(t *testing.T, result []string) {
301 t.Helper()
302 if len(result) == 0 {
303 t.Errorf("%q is expected to be not empty", result)
304 }
305}
306
Jiyong Park25fc6a92018-11-18 18:02:45 +0900307// Minimal test
308func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800309 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900310 apex_defaults {
311 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900312 manifest: ":myapex.manifest",
313 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900314 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900315 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900316 native_shared_libs: [
317 "mylib",
318 "libfoo.ffi",
319 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900320 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800321 multilib: {
322 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900323 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800324 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900325 },
Jiyong Park77acec62020-06-01 21:39:15 +0900326 java_libs: [
327 "myjar",
328 "myjar_dex",
329 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000330 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900331 }
332
Jiyong Park30ca9372019-02-07 16:27:23 +0900333 apex {
334 name: "myapex",
335 defaults: ["myapex-defaults"],
336 }
337
Jiyong Park25fc6a92018-11-18 18:02:45 +0900338 apex_key {
339 name: "myapex.key",
340 public_key: "testkey.avbpubkey",
341 private_key: "testkey.pem",
342 }
343
Jiyong Park809bb722019-02-13 21:33:49 +0900344 filegroup {
345 name: "myapex.manifest",
346 srcs: ["apex_manifest.json"],
347 }
348
349 filegroup {
350 name: "myapex.androidmanifest",
351 srcs: ["AndroidManifest.xml"],
352 }
353
Jiyong Park25fc6a92018-11-18 18:02:45 +0900354 cc_library {
355 name: "mylib",
356 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900357 shared_libs: [
358 "mylib2",
359 "libbar.ffi",
360 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900361 system_shared_libs: [],
362 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000363 // TODO: remove //apex_available:platform
364 apex_available: [
365 "//apex_available:platform",
366 "myapex",
367 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900368 }
369
Alex Light3d673592019-01-18 14:37:31 -0800370 cc_binary {
371 name: "foo",
372 srcs: ["mylib.cpp"],
373 compile_multilib: "both",
374 multilib: {
375 lib32: {
376 suffix: "32",
377 },
378 lib64: {
379 suffix: "64",
380 },
381 },
382 symlinks: ["foo_link_"],
383 symlink_preferred_arch: true,
384 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800385 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700386 apex_available: [ "myapex", "com.android.gki.*" ],
387 }
388
Jiyong Park99644e92020-11-17 22:21:02 +0900389 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000390 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900391 srcs: ["foo.rs"],
392 rlibs: ["libfoo.rlib.rust"],
393 dylibs: ["libfoo.dylib.rust"],
394 apex_available: ["myapex"],
395 }
396
397 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000398 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900399 srcs: ["foo.rs"],
400 crate_name: "foo",
401 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900402 shared_libs: ["libfoo.shared_from_rust"],
403 }
404
405 cc_library_shared {
406 name: "libfoo.shared_from_rust",
407 srcs: ["mylib.cpp"],
408 system_shared_libs: [],
409 stl: "none",
410 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900411 }
412
413 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000414 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900415 srcs: ["foo.rs"],
416 crate_name: "foo",
417 apex_available: ["myapex"],
418 }
419
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900420 rust_ffi_shared {
421 name: "libfoo.ffi",
422 srcs: ["foo.rs"],
423 crate_name: "foo",
424 apex_available: ["myapex"],
425 }
426
427 rust_ffi_shared {
428 name: "libbar.ffi",
429 srcs: ["foo.rs"],
430 crate_name: "bar",
431 apex_available: ["myapex"],
432 }
433
Yifan Hongd22a84a2020-07-28 17:37:46 -0700434 apex {
435 name: "com.android.gki.fake",
436 binaries: ["foo"],
437 key: "myapex.key",
438 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000439 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800440 }
441
Paul Duffindddd5462020-04-07 15:25:44 +0100442 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900443 name: "mylib2",
444 srcs: ["mylib.cpp"],
445 system_shared_libs: [],
446 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900447 static_libs: ["libstatic"],
448 // TODO: remove //apex_available:platform
449 apex_available: [
450 "//apex_available:platform",
451 "myapex",
452 ],
453 }
454
Paul Duffindddd5462020-04-07 15:25:44 +0100455 cc_prebuilt_library_shared {
456 name: "mylib2",
457 srcs: ["prebuilt.so"],
458 // TODO: remove //apex_available:platform
459 apex_available: [
460 "//apex_available:platform",
461 "myapex",
462 ],
463 }
464
Jiyong Park9918e1a2020-03-17 19:16:40 +0900465 cc_library_static {
466 name: "libstatic",
467 srcs: ["mylib.cpp"],
468 system_shared_libs: [],
469 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000470 // TODO: remove //apex_available:platform
471 apex_available: [
472 "//apex_available:platform",
473 "myapex",
474 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900475 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476
477 java_library {
478 name: "myjar",
479 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900480 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900481 sdk_version: "none",
482 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900484 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000485 // TODO: remove //apex_available:platform
486 apex_available: [
487 "//apex_available:platform",
488 "myapex",
489 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 }
491
Jiyong Park77acec62020-06-01 21:39:15 +0900492 dex_import {
493 name: "myjar_dex",
494 jars: ["prebuilt.jar"],
495 apex_available: [
496 "//apex_available:platform",
497 "myapex",
498 ],
499 }
500
Jiyong Park7f7766d2019-07-25 22:02:35 +0900501 java_library {
502 name: "myotherjar",
503 srcs: ["foo/bar/MyClass.java"],
504 sdk_version: "none",
505 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900506 // TODO: remove //apex_available:platform
507 apex_available: [
508 "//apex_available:platform",
509 "myapex",
510 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900511 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900512
513 java_library {
514 name: "mysharedjar",
515 srcs: ["foo/bar/MyClass.java"],
516 sdk_version: "none",
517 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900518 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900519 `)
520
Paul Duffina71a67a2021-03-29 00:42:57 +0100521 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900523 // Make sure that Android.mk is created
524 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700525 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900526 var builder strings.Builder
527 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
528
529 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000530 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900531 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
532
Jiyong Park42cca6c2019-04-01 11:15:50 +0900533 optFlags := apexRule.Args["opt_flags"]
534 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700535 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100536 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900537
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538 copyCmds := apexRule.Args["copy_commands"]
539
540 // Ensure that main rule creates an output
541 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
542
543 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700544 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
546 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900547 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900548 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900549
550 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700551 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
552 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900553 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900557
558 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800559 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
560 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900561 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900562 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900563 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900564 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
565 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900567 // .. but not for java libs
568 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900569 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800570
Colin Cross7113d202019-11-20 16:39:12 -0800571 // Ensure that the platform variant ends with _shared or _common
572 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
573 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900574 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
575 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900576 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
577
578 // Ensure that dynamic dependency to java libs are not included
579 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800580
581 // Ensure that all symlinks are present.
582 found_foo_link_64 := false
583 found_foo := false
584 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900585 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800586 if strings.HasSuffix(cmd, "bin/foo") {
587 found_foo = true
588 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
589 found_foo_link_64 = true
590 }
591 }
592 }
593 good := found_foo && found_foo_link_64
594 if !good {
595 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
596 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900597
Artur Satayeva8bd1132020-04-27 18:07:06 +0100598 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100600 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
601 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
602 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100603
604 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100606 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
607 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
608 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800609}
610
Jooyung Hanf21c7972019-12-16 22:32:06 +0900611func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800612 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900613 apex_defaults {
614 name: "myapex-defaults",
615 key: "myapex.key",
616 prebuilts: ["myetc"],
617 native_shared_libs: ["mylib"],
618 java_libs: ["myjar"],
619 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900620 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800621 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000622 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900623 }
624
625 prebuilt_etc {
626 name: "myetc",
627 src: "myprebuilt",
628 }
629
630 apex {
631 name: "myapex",
632 defaults: ["myapex-defaults"],
633 }
634
635 apex_key {
636 name: "myapex.key",
637 public_key: "testkey.avbpubkey",
638 private_key: "testkey.pem",
639 }
640
641 cc_library {
642 name: "mylib",
643 system_shared_libs: [],
644 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000645 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900646 }
647
648 java_library {
649 name: "myjar",
650 srcs: ["foo/bar/MyClass.java"],
651 sdk_version: "none",
652 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000653 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900654 }
655
656 android_app {
657 name: "AppFoo",
658 srcs: ["foo/bar/MyClass.java"],
659 sdk_version: "none",
660 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000661 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900662 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900663
664 runtime_resource_overlay {
665 name: "rro",
666 theme: "blue",
667 }
668
markchien2f59ec92020-09-02 16:23:38 +0800669 bpf {
670 name: "bpf",
671 srcs: ["bpf.c", "bpf2.c"],
672 }
673
Ken Chenfad7f9d2021-11-10 22:02:57 +0800674 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800675 name: "netdTest",
676 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800677 sub_dir: "netd",
678 }
679
Jooyung Hanf21c7972019-12-16 22:32:06 +0900680 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000681 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900682 "etc/myetc",
683 "javalib/myjar.jar",
684 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000685 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900686 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800687 "etc/bpf/bpf.o",
688 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800689 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900690 })
691}
692
Jooyung Han01a3ee22019-11-02 02:52:25 +0900693func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800694 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695 apex {
696 name: "myapex",
697 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000698 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900699 }
700
701 apex_key {
702 name: "myapex.key",
703 public_key: "testkey.avbpubkey",
704 private_key: "testkey.pem",
705 }
706 `)
707
708 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900709 args := module.Rule("apexRule").Args
710 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
711 t.Error("manifest should be apex_manifest.pb, but " + manifest)
712 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900713}
714
Liz Kammer4854a7d2021-05-27 14:28:27 -0400715func TestApexManifestMinSdkVersion(t *testing.T) {
716 ctx := testApex(t, `
717 apex_defaults {
718 name: "my_defaults",
719 key: "myapex.key",
720 product_specific: true,
721 file_contexts: ":my-file-contexts",
722 updatable: false,
723 }
724 apex {
725 name: "myapex_30",
726 min_sdk_version: "30",
727 defaults: ["my_defaults"],
728 }
729
730 apex {
731 name: "myapex_current",
732 min_sdk_version: "current",
733 defaults: ["my_defaults"],
734 }
735
736 apex {
737 name: "myapex_none",
738 defaults: ["my_defaults"],
739 }
740
741 apex_key {
742 name: "myapex.key",
743 public_key: "testkey.avbpubkey",
744 private_key: "testkey.pem",
745 }
746
747 filegroup {
748 name: "my-file-contexts",
749 srcs: ["product_specific_file_contexts"],
750 }
751 `, withFiles(map[string][]byte{
752 "product_specific_file_contexts": nil,
753 }), android.FixtureModifyProductVariables(
754 func(variables android.FixtureProductVariables) {
755 variables.Unbundled_build = proptools.BoolPtr(true)
756 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
757 }), android.FixtureMergeEnv(map[string]string{
758 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
759 }))
760
761 testCases := []struct {
762 module string
763 minSdkVersion string
764 }{
765 {
766 module: "myapex_30",
767 minSdkVersion: "30",
768 },
769 {
770 module: "myapex_current",
771 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
772 },
773 {
774 module: "myapex_none",
775 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
776 },
777 }
778 for _, tc := range testCases {
779 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
780 args := module.Rule("apexRule").Args
781 optFlags := args["opt_flags"]
782 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
783 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
784 }
785 }
786}
787
Jooyung Hanaf730952023-02-28 14:13:38 +0900788func TestFileContexts(t *testing.T) {
789 for _, useFileContextsAsIs := range []bool{true, false} {
790 prop := ""
791 if useFileContextsAsIs {
792 prop = "use_file_contexts_as_is: true,\n"
793 }
794 ctx := testApex(t, `
795 apex {
796 name: "myapex",
797 key: "myapex.key",
798 file_contexts: "file_contexts",
799 updatable: false,
800 vendor: true,
801 `+prop+`
802 }
803
804 apex_key {
805 name: "myapex.key",
806 public_key: "testkey.avbpubkey",
807 private_key: "testkey.pem",
808 }
809 `, withFiles(map[string][]byte{
810 "file_contexts": nil,
811 }))
812
813 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("file_contexts")
814 forceLabellingCommand := "apex_manifest\\\\.pb u:object_r:system_file:s0"
815 if useFileContextsAsIs {
816 android.AssertStringDoesNotContain(t, "should force-label",
817 rule.RuleParams.Command, forceLabellingCommand)
818 } else {
819 android.AssertStringDoesContain(t, "shouldn't force-label",
820 rule.RuleParams.Command, forceLabellingCommand)
821 }
822 }
823}
824
Alex Light5098a612018-11-29 17:12:15 -0800825func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800826 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800827 apex {
828 name: "myapex",
829 key: "myapex.key",
830 payload_type: "zip",
831 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000832 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800833 }
834
835 apex_key {
836 name: "myapex.key",
837 public_key: "testkey.avbpubkey",
838 private_key: "testkey.pem",
839 }
840
841 cc_library {
842 name: "mylib",
843 srcs: ["mylib.cpp"],
844 shared_libs: ["mylib2"],
845 system_shared_libs: [],
846 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000847 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800848 }
849
850 cc_library {
851 name: "mylib2",
852 srcs: ["mylib.cpp"],
853 system_shared_libs: [],
854 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000855 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800856 }
857 `)
858
Sundong Ahnabb64432019-10-22 13:58:29 +0900859 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800860 copyCmds := zipApexRule.Args["copy_commands"]
861
862 // Ensure that main rule creates an output
863 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
864
865 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700866 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800867
868 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700869 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800870
871 // Ensure that both direct and indirect deps are copied into apex
872 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
873 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900874}
875
876func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800877 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900878 apex {
879 name: "myapex",
880 key: "myapex.key",
881 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900882 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000883 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900884 }
885
886 apex_key {
887 name: "myapex.key",
888 public_key: "testkey.avbpubkey",
889 private_key: "testkey.pem",
890 }
891
892 cc_library {
893 name: "mylib",
894 srcs: ["mylib.cpp"],
895 shared_libs: ["mylib2", "mylib3"],
896 system_shared_libs: [],
897 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000898 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900899 }
900
901 cc_library {
902 name: "mylib2",
903 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900904 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900905 system_shared_libs: [],
906 stl: "none",
907 stubs: {
908 versions: ["1", "2", "3"],
909 },
910 }
911
912 cc_library {
913 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900914 srcs: ["mylib.cpp"],
915 shared_libs: ["mylib4"],
916 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900917 stl: "none",
918 stubs: {
919 versions: ["10", "11", "12"],
920 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000921 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900922 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900923
924 cc_library {
925 name: "mylib4",
926 srcs: ["mylib.cpp"],
927 system_shared_libs: [],
928 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000929 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900930 }
Jiyong Park105dc322021-06-11 17:22:09 +0900931
932 rust_binary {
933 name: "foo.rust",
934 srcs: ["foo.rs"],
935 shared_libs: ["libfoo.shared_from_rust"],
936 prefer_rlib: true,
937 apex_available: ["myapex"],
938 }
939
940 cc_library_shared {
941 name: "libfoo.shared_from_rust",
942 srcs: ["mylib.cpp"],
943 system_shared_libs: [],
944 stl: "none",
945 stubs: {
946 versions: ["10", "11", "12"],
947 },
948 }
949
Jiyong Park25fc6a92018-11-18 18:02:45 +0900950 `)
951
Sundong Ahnabb64432019-10-22 13:58:29 +0900952 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900953 copyCmds := apexRule.Args["copy_commands"]
954
955 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800956 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900957
958 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800959 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900960
961 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800962 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900963
Colin Crossaede88c2020-08-11 12:17:01 -0700964 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900965
966 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900967 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900968 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900969 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900970
971 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700972 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900973 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700974 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900975
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700976 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
977 // is replaced by sharing of "cFlags" in cc/builder.go.
978 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
979 // module variable representing "cflags". So it was not detected by ensureNotContains.
980 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
981 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
982 // including the original cflags's "-include mylib.h".
983 //
Jiyong Park64379952018-12-13 18:37:29 +0900984 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700985 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
986 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900987
Jiyong Park85cc35a2022-07-17 11:30:47 +0900988 // Ensure that genstub for platform-provided lib is invoked with --systemapi
989 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
990 // Ensure that genstub for apex-provided lib is invoked with --apex
991 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900992
Jooyung Hana57af4a2020-01-23 05:36:59 +0000993 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900994 "lib64/mylib.so",
995 "lib64/mylib3.so",
996 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900997 "bin/foo.rust",
998 "lib64/libc++.so", // by the implicit dependency from foo.rust
999 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001000 })
Jiyong Park105dc322021-06-11 17:22:09 +09001001
1002 // Ensure that stub dependency from a rust module is not included
1003 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1004 // The rust module is linked to the stub cc library
Peter Collingbournee7c71c32023-03-31 20:21:19 -07001005 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001006 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1007 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001008
1009 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1010 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001011}
1012
Jiyong Park1bc84122021-06-22 20:23:05 +09001013func TestApexCanUsePrivateApis(t *testing.T) {
1014 ctx := testApex(t, `
1015 apex {
1016 name: "myapex",
1017 key: "myapex.key",
1018 native_shared_libs: ["mylib"],
1019 binaries: ["foo.rust"],
1020 updatable: false,
1021 platform_apis: true,
1022 }
1023
1024 apex_key {
1025 name: "myapex.key",
1026 public_key: "testkey.avbpubkey",
1027 private_key: "testkey.pem",
1028 }
1029
1030 cc_library {
1031 name: "mylib",
1032 srcs: ["mylib.cpp"],
1033 shared_libs: ["mylib2"],
1034 system_shared_libs: [],
1035 stl: "none",
1036 apex_available: [ "myapex" ],
1037 }
1038
1039 cc_library {
1040 name: "mylib2",
1041 srcs: ["mylib.cpp"],
1042 cflags: ["-include mylib.h"],
1043 system_shared_libs: [],
1044 stl: "none",
1045 stubs: {
1046 versions: ["1", "2", "3"],
1047 },
1048 }
1049
1050 rust_binary {
1051 name: "foo.rust",
1052 srcs: ["foo.rs"],
1053 shared_libs: ["libfoo.shared_from_rust"],
1054 prefer_rlib: true,
1055 apex_available: ["myapex"],
1056 }
1057
1058 cc_library_shared {
1059 name: "libfoo.shared_from_rust",
1060 srcs: ["mylib.cpp"],
1061 system_shared_libs: [],
1062 stl: "none",
1063 stubs: {
1064 versions: ["10", "11", "12"],
1065 },
1066 }
1067 `)
1068
1069 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1070 copyCmds := apexRule.Args["copy_commands"]
1071
1072 // Ensure that indirect stubs dep is not included
1073 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1074 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1075
1076 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1077 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001078 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001079 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1080 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Peter Collingbournee7c71c32023-03-31 20:21:19 -07001081 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001082 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1083 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1084}
1085
Colin Cross7812fd32020-09-25 12:35:10 -07001086func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1087 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001088 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001089 apex {
1090 name: "myapex",
1091 key: "myapex.key",
1092 native_shared_libs: ["mylib", "mylib3"],
1093 min_sdk_version: "29",
1094 }
1095
1096 apex_key {
1097 name: "myapex.key",
1098 public_key: "testkey.avbpubkey",
1099 private_key: "testkey.pem",
1100 }
1101
1102 cc_library {
1103 name: "mylib",
1104 srcs: ["mylib.cpp"],
1105 shared_libs: ["mylib2", "mylib3"],
1106 system_shared_libs: [],
1107 stl: "none",
1108 apex_available: [ "myapex" ],
1109 min_sdk_version: "28",
1110 }
1111
1112 cc_library {
1113 name: "mylib2",
1114 srcs: ["mylib.cpp"],
1115 cflags: ["-include mylib.h"],
1116 system_shared_libs: [],
1117 stl: "none",
1118 stubs: {
1119 versions: ["28", "29", "30", "current"],
1120 },
1121 min_sdk_version: "28",
1122 }
1123
1124 cc_library {
1125 name: "mylib3",
1126 srcs: ["mylib.cpp"],
1127 shared_libs: ["mylib4"],
1128 system_shared_libs: [],
1129 stl: "none",
1130 stubs: {
1131 versions: ["28", "29", "30", "current"],
1132 },
1133 apex_available: [ "myapex" ],
1134 min_sdk_version: "28",
1135 }
1136
1137 cc_library {
1138 name: "mylib4",
1139 srcs: ["mylib.cpp"],
1140 system_shared_libs: [],
1141 stl: "none",
1142 apex_available: [ "myapex" ],
1143 min_sdk_version: "28",
1144 }
1145 `)
1146
1147 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1148 copyCmds := apexRule.Args["copy_commands"]
1149
1150 // Ensure that direct non-stubs dep is always included
1151 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1152
1153 // Ensure that indirect stubs dep is not included
1154 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1155
1156 // Ensure that direct stubs dep is included
1157 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1158
1159 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1160
Jiyong Park55549df2021-02-26 23:57:23 +09001161 // Ensure that mylib is linking with the latest version of stub for mylib2
1162 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001163 // ... and not linking to the non-stub (impl) variant of mylib2
1164 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1165
1166 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1167 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1168 // .. and not linking to the stubs variant of mylib3
1169 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1170
1171 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001172 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001173 ensureNotContains(t, mylib2Cflags, "-include ")
1174
Jiyong Park85cc35a2022-07-17 11:30:47 +09001175 // Ensure that genstub is invoked with --systemapi
1176 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001177
1178 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1179 "lib64/mylib.so",
1180 "lib64/mylib3.so",
1181 "lib64/mylib4.so",
1182 })
1183}
1184
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001185func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1186 t.Parallel()
1187 // myapex (Z)
1188 // mylib -----------------.
1189 // |
1190 // otherapex (29) |
1191 // libstub's versions: 29 Z current
1192 // |
1193 // <platform> |
1194 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001195 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001196 apex {
1197 name: "myapex",
1198 key: "myapex.key",
1199 native_shared_libs: ["mylib"],
1200 min_sdk_version: "Z", // non-final
1201 }
1202
1203 cc_library {
1204 name: "mylib",
1205 srcs: ["mylib.cpp"],
1206 shared_libs: ["libstub"],
1207 apex_available: ["myapex"],
1208 min_sdk_version: "Z",
1209 }
1210
1211 apex_key {
1212 name: "myapex.key",
1213 public_key: "testkey.avbpubkey",
1214 private_key: "testkey.pem",
1215 }
1216
1217 apex {
1218 name: "otherapex",
1219 key: "myapex.key",
1220 native_shared_libs: ["libstub"],
1221 min_sdk_version: "29",
1222 }
1223
1224 cc_library {
1225 name: "libstub",
1226 srcs: ["mylib.cpp"],
1227 stubs: {
1228 versions: ["29", "Z", "current"],
1229 },
1230 apex_available: ["otherapex"],
1231 min_sdk_version: "29",
1232 }
1233
1234 // platform module depending on libstub from otherapex should use the latest stub("current")
1235 cc_library {
1236 name: "libplatform",
1237 srcs: ["mylib.cpp"],
1238 shared_libs: ["libstub"],
1239 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001240 `,
1241 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1242 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1243 variables.Platform_sdk_final = proptools.BoolPtr(false)
1244 variables.Platform_version_active_codenames = []string{"Z"}
1245 }),
1246 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001247
Jiyong Park55549df2021-02-26 23:57:23 +09001248 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001249 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001250 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001251 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001252 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001253
1254 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1255 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1256 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1257 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1258 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1259}
1260
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001261func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001262 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001263 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001264 name: "myapex2",
1265 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001266 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001267 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001268 }
1269
1270 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001271 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001272 public_key: "testkey.avbpubkey",
1273 private_key: "testkey.pem",
1274 }
1275
1276 cc_library {
1277 name: "mylib",
1278 srcs: ["mylib.cpp"],
1279 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001280 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001281 system_shared_libs: [],
1282 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001283 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001284 }
1285
1286 cc_library {
1287 name: "libfoo",
1288 srcs: ["mylib.cpp"],
1289 shared_libs: ["libbar"],
1290 system_shared_libs: [],
1291 stl: "none",
1292 stubs: {
1293 versions: ["10", "20", "30"],
1294 },
1295 }
1296
1297 cc_library {
1298 name: "libbar",
1299 srcs: ["mylib.cpp"],
1300 system_shared_libs: [],
1301 stl: "none",
1302 }
1303
Jiyong Park678c8812020-02-07 17:25:49 +09001304 cc_library_static {
1305 name: "libbaz",
1306 srcs: ["mylib.cpp"],
1307 system_shared_libs: [],
1308 stl: "none",
1309 apex_available: [ "myapex2" ],
1310 }
1311
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001312 `)
1313
Jiyong Park83dc74b2020-01-14 18:38:44 +09001314 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001315 copyCmds := apexRule.Args["copy_commands"]
1316
1317 // Ensure that direct non-stubs dep is always included
1318 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1319
1320 // Ensure that indirect stubs dep is not included
1321 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1322
1323 // Ensure that dependency of stubs is not included
1324 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1325
Colin Crossaede88c2020-08-11 12:17:01 -07001326 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001327
1328 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001329 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001330 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001331 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001332
Jiyong Park3ff16992019-12-27 14:11:47 +09001333 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001334
1335 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1336 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001337
Artur Satayeva8bd1132020-04-27 18:07:06 +01001338 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001339 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001340
Artur Satayeva8bd1132020-04-27 18:07:06 +01001341 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001342 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001343}
1344
Jooyung Hand3639552019-08-09 12:57:43 +09001345func TestApexWithRuntimeLibsDependency(t *testing.T) {
1346 /*
1347 myapex
1348 |
1349 v (runtime_libs)
1350 mylib ------+------> libfoo [provides stub]
1351 |
1352 `------> libbar
1353 */
Colin Cross1c460562021-02-16 17:55:47 -08001354 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001355 apex {
1356 name: "myapex",
1357 key: "myapex.key",
1358 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001359 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001360 }
1361
1362 apex_key {
1363 name: "myapex.key",
1364 public_key: "testkey.avbpubkey",
1365 private_key: "testkey.pem",
1366 }
1367
1368 cc_library {
1369 name: "mylib",
1370 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001371 static_libs: ["libstatic"],
1372 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001373 runtime_libs: ["libfoo", "libbar"],
1374 system_shared_libs: [],
1375 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001376 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001377 }
1378
1379 cc_library {
1380 name: "libfoo",
1381 srcs: ["mylib.cpp"],
1382 system_shared_libs: [],
1383 stl: "none",
1384 stubs: {
1385 versions: ["10", "20", "30"],
1386 },
1387 }
1388
1389 cc_library {
1390 name: "libbar",
1391 srcs: ["mylib.cpp"],
1392 system_shared_libs: [],
1393 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001394 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001395 }
1396
Liz Kammer5f108fa2023-05-11 14:33:17 -04001397 cc_library {
1398 name: "libstatic",
1399 srcs: ["mylib.cpp"],
1400 system_shared_libs: [],
1401 stl: "none",
1402 apex_available: [ "myapex" ],
1403 runtime_libs: ["libstatic_to_runtime"],
1404 }
1405
1406 cc_library {
1407 name: "libshared",
1408 srcs: ["mylib.cpp"],
1409 system_shared_libs: [],
1410 stl: "none",
1411 apex_available: [ "myapex" ],
1412 runtime_libs: ["libshared_to_runtime"],
1413 }
1414
1415 cc_library {
1416 name: "libstatic_to_runtime",
1417 srcs: ["mylib.cpp"],
1418 system_shared_libs: [],
1419 stl: "none",
1420 apex_available: [ "myapex" ],
1421 }
1422
1423 cc_library {
1424 name: "libshared_to_runtime",
1425 srcs: ["mylib.cpp"],
1426 system_shared_libs: [],
1427 stl: "none",
1428 apex_available: [ "myapex" ],
1429 }
Jooyung Hand3639552019-08-09 12:57:43 +09001430 `)
1431
Sundong Ahnabb64432019-10-22 13:58:29 +09001432 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001433 copyCmds := apexRule.Args["copy_commands"]
1434
1435 // Ensure that direct non-stubs dep is always included
1436 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1437
1438 // Ensure that indirect stubs dep is not included
1439 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1440
1441 // Ensure that runtime_libs dep in included
1442 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001443 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1444 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1445
1446 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001447
Sundong Ahnabb64432019-10-22 13:58:29 +09001448 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001449 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1450 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001451}
1452
Paul Duffina02cae32021-03-09 01:44:06 +00001453var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1454 cc.PrepareForTestWithCcBuildComponents,
1455 PrepareForTestWithApexBuildComponents,
1456 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001457 apex {
1458 name: "com.android.runtime",
1459 key: "com.android.runtime.key",
1460 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001461 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001462 }
1463
1464 apex_key {
1465 name: "com.android.runtime.key",
1466 public_key: "testkey.avbpubkey",
1467 private_key: "testkey.pem",
1468 }
Paul Duffina02cae32021-03-09 01:44:06 +00001469 `),
1470 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1471)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001472
Paul Duffina02cae32021-03-09 01:44:06 +00001473func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001474 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001475 cc_library {
1476 name: "libc",
1477 no_libcrt: true,
1478 nocrt: true,
1479 stl: "none",
1480 system_shared_libs: [],
1481 stubs: { versions: ["1"] },
1482 apex_available: ["com.android.runtime"],
1483
1484 sanitize: {
1485 hwaddress: true,
1486 }
1487 }
1488
1489 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001490 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001491 no_libcrt: true,
1492 nocrt: true,
1493 stl: "none",
1494 system_shared_libs: [],
1495 srcs: [""],
1496 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001497 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001498
1499 sanitize: {
1500 never: true,
1501 },
Spandan Das4de7b492023-05-05 21:13:01 +00001502 apex_available: [
1503 "//apex_available:anyapex",
1504 "//apex_available:platform",
1505 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001506 } `)
1507 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001508
1509 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1510 "lib64/bionic/libc.so",
1511 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1512 })
1513
Colin Cross4c4c1be2022-02-10 11:41:18 -08001514 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001515
1516 installed := hwasan.Description("install libclang_rt.hwasan")
1517 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1518
1519 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1520 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1521 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1522}
1523
1524func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001525 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001526 prepareForTestOfRuntimeApexWithHwasan,
1527 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1528 variables.SanitizeDevice = []string{"hwaddress"}
1529 }),
1530 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001531 cc_library {
1532 name: "libc",
1533 no_libcrt: true,
1534 nocrt: true,
1535 stl: "none",
1536 system_shared_libs: [],
1537 stubs: { versions: ["1"] },
1538 apex_available: ["com.android.runtime"],
1539 }
1540
1541 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001542 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001543 no_libcrt: true,
1544 nocrt: true,
1545 stl: "none",
1546 system_shared_libs: [],
1547 srcs: [""],
1548 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001549 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001550
1551 sanitize: {
1552 never: true,
1553 },
Spandan Das4de7b492023-05-05 21:13:01 +00001554 apex_available: [
1555 "//apex_available:anyapex",
1556 "//apex_available:platform",
1557 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001558 }
Paul Duffina02cae32021-03-09 01:44:06 +00001559 `)
1560 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001561
1562 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1563 "lib64/bionic/libc.so",
1564 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1565 })
1566
Colin Cross4c4c1be2022-02-10 11:41:18 -08001567 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001568
1569 installed := hwasan.Description("install libclang_rt.hwasan")
1570 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1571
1572 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1573 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1574 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1575}
1576
Jooyung Han61b66e92020-03-21 14:21:46 +00001577func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1578 testcases := []struct {
1579 name string
1580 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001581 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001582 shouldLink string
1583 shouldNotLink []string
1584 }{
1585 {
Jiyong Park55549df2021-02-26 23:57:23 +09001586 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001587 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001588 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001589 shouldLink: "current",
1590 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001591 },
1592 {
Jiyong Park55549df2021-02-26 23:57:23 +09001593 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001594 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001595 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001596 shouldLink: "current",
1597 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001598 },
1599 }
1600 for _, tc := range testcases {
1601 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001602 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001603 apex {
1604 name: "myapex",
1605 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001606 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001607 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001608 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001609 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001610
Jooyung Han61b66e92020-03-21 14:21:46 +00001611 apex_key {
1612 name: "myapex.key",
1613 public_key: "testkey.avbpubkey",
1614 private_key: "testkey.pem",
1615 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001616
Jooyung Han61b66e92020-03-21 14:21:46 +00001617 cc_library {
1618 name: "mylib",
1619 srcs: ["mylib.cpp"],
1620 vendor_available: true,
1621 shared_libs: ["libbar"],
1622 system_shared_libs: [],
1623 stl: "none",
1624 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001625 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001626 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001627
Jooyung Han61b66e92020-03-21 14:21:46 +00001628 cc_library {
1629 name: "libbar",
1630 srcs: ["mylib.cpp"],
1631 system_shared_libs: [],
1632 stl: "none",
1633 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001634 llndk: {
1635 symbol_file: "libbar.map.txt",
1636 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001637 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001638 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001639 withUnbundledBuild,
1640 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001641
Jooyung Han61b66e92020-03-21 14:21:46 +00001642 // Ensure that LLNDK dep is not included
1643 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1644 "lib64/mylib.so",
1645 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001646
Jooyung Han61b66e92020-03-21 14:21:46 +00001647 // Ensure that LLNDK dep is required
1648 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1649 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1650 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001651
Steven Moreland2c4000c2021-04-27 02:08:49 +00001652 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1653 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001654 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001655 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001656 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001657
Steven Moreland2c4000c2021-04-27 02:08:49 +00001658 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001659 ver := tc.shouldLink
1660 if tc.shouldLink == "current" {
1661 ver = strconv.Itoa(android.FutureApiLevelInt)
1662 }
1663 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001664 })
1665 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001666}
1667
Jiyong Park25fc6a92018-11-18 18:02:45 +09001668func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001669 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001670 apex {
1671 name: "myapex",
1672 key: "myapex.key",
1673 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001674 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001675 }
1676
1677 apex_key {
1678 name: "myapex.key",
1679 public_key: "testkey.avbpubkey",
1680 private_key: "testkey.pem",
1681 }
1682
1683 cc_library {
1684 name: "mylib",
1685 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001686 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001687 shared_libs: ["libdl#27"],
1688 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001689 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001690 }
1691
1692 cc_library_shared {
1693 name: "mylib_shared",
1694 srcs: ["mylib.cpp"],
1695 shared_libs: ["libdl#27"],
1696 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001697 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001698 }
1699
1700 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001701 name: "libBootstrap",
1702 srcs: ["mylib.cpp"],
1703 stl: "none",
1704 bootstrap: true,
1705 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001706 `)
1707
Sundong Ahnabb64432019-10-22 13:58:29 +09001708 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001709 copyCmds := apexRule.Args["copy_commands"]
1710
1711 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001712 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001713 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1714 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001715
1716 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001717 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001718
Colin Crossaede88c2020-08-11 12:17:01 -07001719 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1720 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1721 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001722
1723 // For dependency to libc
1724 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001725 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001726 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001727 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001728 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001729 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1730 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001731
1732 // For dependency to libm
1733 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001734 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001735 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001736 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001737 // ... and is not compiling with the stub
1738 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1739 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1740
1741 // For dependency to libdl
1742 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001743 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001744 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001745 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1746 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001747 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001748 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001749 // ... Cflags from stub is correctly exported to mylib
1750 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1751 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001752
1753 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001754 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1755 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1756 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1757 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001758}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001759
Jooyung Han749dc692020-04-15 11:03:39 +09001760func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001761 // there are three links between liba --> libz.
1762 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001763 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001764 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001765 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001766 apex {
1767 name: "myapex",
1768 key: "myapex.key",
1769 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001770 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001771 }
1772
1773 apex {
1774 name: "otherapex",
1775 key: "myapex.key",
1776 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001777 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001778 }
1779
1780 apex_key {
1781 name: "myapex.key",
1782 public_key: "testkey.avbpubkey",
1783 private_key: "testkey.pem",
1784 }
1785
1786 cc_library {
1787 name: "libx",
1788 shared_libs: ["liba"],
1789 system_shared_libs: [],
1790 stl: "none",
1791 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001792 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001793 }
1794
1795 cc_library {
1796 name: "liby",
1797 shared_libs: ["liba"],
1798 system_shared_libs: [],
1799 stl: "none",
1800 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001801 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001802 }
1803
1804 cc_library {
1805 name: "liba",
1806 shared_libs: ["libz"],
1807 system_shared_libs: [],
1808 stl: "none",
1809 apex_available: [
1810 "//apex_available:anyapex",
1811 "//apex_available:platform",
1812 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001813 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001814 }
1815
1816 cc_library {
1817 name: "libz",
1818 system_shared_libs: [],
1819 stl: "none",
1820 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001821 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001822 },
1823 }
Jooyung Han749dc692020-04-15 11:03:39 +09001824 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001825
1826 expectLink := func(from, from_variant, to, to_variant string) {
1827 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1828 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1829 }
1830 expectNoLink := func(from, from_variant, to, to_variant string) {
1831 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1832 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1833 }
1834 // platform liba is linked to non-stub version
1835 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001836 // liba in myapex is linked to current
1837 expectLink("liba", "shared_apex29", "libz", "shared_current")
1838 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001839 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001840 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001841 // liba in otherapex is linked to current
1842 expectLink("liba", "shared_apex30", "libz", "shared_current")
1843 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001844 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1845 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001846}
1847
Jooyung Hanaed150d2020-04-02 01:41:41 +09001848func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001849 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001850 apex {
1851 name: "myapex",
1852 key: "myapex.key",
1853 native_shared_libs: ["libx"],
1854 min_sdk_version: "R",
1855 }
1856
1857 apex_key {
1858 name: "myapex.key",
1859 public_key: "testkey.avbpubkey",
1860 private_key: "testkey.pem",
1861 }
1862
1863 cc_library {
1864 name: "libx",
1865 shared_libs: ["libz"],
1866 system_shared_libs: [],
1867 stl: "none",
1868 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001869 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001870 }
1871
1872 cc_library {
1873 name: "libz",
1874 system_shared_libs: [],
1875 stl: "none",
1876 stubs: {
1877 versions: ["29", "R"],
1878 },
1879 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001880 `,
1881 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1882 variables.Platform_version_active_codenames = []string{"R"}
1883 }),
1884 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001885
1886 expectLink := func(from, from_variant, to, to_variant string) {
1887 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1888 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1889 }
1890 expectNoLink := func(from, from_variant, to, to_variant string) {
1891 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1892 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1893 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001894 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1895 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001896 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1897 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001898}
1899
Jooyung Han4c4da062021-06-23 10:23:16 +09001900func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1901 testApex(t, `
1902 apex {
1903 name: "myapex",
1904 key: "myapex.key",
1905 java_libs: ["libx"],
1906 min_sdk_version: "S",
1907 }
1908
1909 apex_key {
1910 name: "myapex.key",
1911 public_key: "testkey.avbpubkey",
1912 private_key: "testkey.pem",
1913 }
1914
1915 java_library {
1916 name: "libx",
1917 srcs: ["a.java"],
1918 apex_available: [ "myapex" ],
1919 sdk_version: "current",
1920 min_sdk_version: "S", // should be okay
1921 }
1922 `,
1923 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1924 variables.Platform_version_active_codenames = []string{"S"}
1925 variables.Platform_sdk_codename = proptools.StringPtr("S")
1926 }),
1927 )
1928}
1929
Jooyung Han749dc692020-04-15 11:03:39 +09001930func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001931 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001932 apex {
1933 name: "myapex",
1934 key: "myapex.key",
1935 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001936 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001937 }
1938
1939 apex_key {
1940 name: "myapex.key",
1941 public_key: "testkey.avbpubkey",
1942 private_key: "testkey.pem",
1943 }
1944
1945 cc_library {
1946 name: "libx",
1947 shared_libs: ["libz"],
1948 system_shared_libs: [],
1949 stl: "none",
1950 apex_available: [ "myapex" ],
1951 }
1952
1953 cc_library {
1954 name: "libz",
1955 system_shared_libs: [],
1956 stl: "none",
1957 stubs: {
1958 versions: ["1", "2"],
1959 },
1960 }
1961 `)
1962
1963 expectLink := func(from, from_variant, to, to_variant string) {
1964 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1965 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1966 }
1967 expectNoLink := func(from, from_variant, to, to_variant string) {
1968 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1969 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1970 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001971 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001972 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001973 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001974 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001975}
1976
Jooyung Handfc864c2023-03-20 18:19:07 +09001977func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001978 ctx := testApex(t, `
1979 apex {
1980 name: "myapex",
1981 key: "myapex.key",
1982 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001983 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001984 vendor: true,
1985 min_sdk_version: "29",
1986 }
1987
1988 apex_key {
1989 name: "myapex.key",
1990 public_key: "testkey.avbpubkey",
1991 private_key: "testkey.pem",
1992 }
1993
1994 cc_library {
1995 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001996 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001997 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001998 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001999 shared_libs: ["libbar"],
2000 }
2001
2002 cc_library {
2003 name: "libbar",
2004 stubs: { versions: ["29", "30"] },
2005 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002006 }
2007 `)
2008
2009 vendorVariant := "android_vendor.29_arm64_armv8-a"
2010
Jooyung Handfc864c2023-03-20 18:19:07 +09002011 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
2012
2013 // Ensure that mylib links with "current" LLNDK
2014 libFlags := names(mylib.Rule("ld").Args["libFlags"])
2015 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
2016
2017 // Ensure that mylib is targeting 29
2018 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2019 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2020
2021 // Ensure that the correct variant of crtbegin_so is used.
2022 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2023 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002024
2025 // Ensure that the crtbegin_so used by the APEX is targeting 29
2026 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2027 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2028}
2029
Jooyung Han4495f842023-04-25 16:39:59 +09002030func TestTrackAllowedDeps(t *testing.T) {
2031 ctx := testApex(t, `
2032 apex {
2033 name: "myapex",
2034 key: "myapex.key",
2035 updatable: true,
2036 native_shared_libs: [
2037 "mylib",
2038 "yourlib",
2039 ],
2040 min_sdk_version: "29",
2041 }
2042
2043 apex {
2044 name: "myapex2",
2045 key: "myapex.key",
2046 updatable: false,
2047 native_shared_libs: ["yourlib"],
2048 }
2049
2050 apex_key {
2051 name: "myapex.key",
2052 public_key: "testkey.avbpubkey",
2053 private_key: "testkey.pem",
2054 }
2055
2056 cc_library {
2057 name: "mylib",
2058 srcs: ["mylib.cpp"],
2059 shared_libs: ["libbar"],
2060 min_sdk_version: "29",
2061 apex_available: ["myapex"],
2062 }
2063
2064 cc_library {
2065 name: "libbar",
2066 stubs: { versions: ["29", "30"] },
2067 }
2068
2069 cc_library {
2070 name: "yourlib",
2071 srcs: ["mylib.cpp"],
2072 min_sdk_version: "29",
2073 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2074 }
2075 `, withFiles(android.MockFS{
2076 "packages/modules/common/build/allowed_deps.txt": nil,
2077 }))
2078
2079 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2080 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2081 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2082 "out/soong/.intermediates/myapex/android_common_myapex_image/depsinfo/flatlist.txt")
2083 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2084 "out/soong/.intermediates/myapex2/android_common_myapex2_image/depsinfo/flatlist.txt")
2085
2086 myapex := ctx.ModuleForTests("myapex", "android_common_myapex_image")
2087 flatlist := strings.Split(myapex.Output("depsinfo/flatlist.txt").BuildParams.Args["content"], "\\n")
2088 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2089 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2090 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2091 flatlist, "mylib:(minSdkVersion:29)")
2092 android.AssertStringListContains(t, "track platform-available lib",
2093 flatlist, "yourlib(minSdkVersion:29)")
2094}
2095
2096func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2097 ctx := testApex(t, `
2098 apex {
2099 name: "myapex",
2100 key: "myapex.key",
2101 updatable: true,
2102 min_sdk_version: "29",
2103 }
2104
2105 apex_key {
2106 name: "myapex.key",
2107 public_key: "testkey.avbpubkey",
2108 private_key: "testkey.pem",
2109 }
2110 `)
2111 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2112 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2113 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2114 }
2115}
2116
Jooyung Han03b51852020-02-26 22:45:42 +09002117func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002118 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002119 apex {
2120 name: "myapex",
2121 key: "myapex.key",
2122 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002123 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002124 }
2125
2126 apex_key {
2127 name: "myapex.key",
2128 public_key: "testkey.avbpubkey",
2129 private_key: "testkey.pem",
2130 }
2131
2132 cc_library {
2133 name: "libx",
2134 system_shared_libs: [],
2135 stl: "none",
2136 apex_available: [ "myapex" ],
2137 stubs: {
2138 versions: ["1", "2"],
2139 },
2140 }
2141
2142 cc_library {
2143 name: "libz",
2144 shared_libs: ["libx"],
2145 system_shared_libs: [],
2146 stl: "none",
2147 }
2148 `)
2149
2150 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002151 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002152 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2153 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2154 }
2155 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002156 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002157 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2158 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2159 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002160 expectLink("libz", "shared", "libx", "shared_current")
2161 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002162 expectNoLink("libz", "shared", "libz", "shared_1")
2163 expectNoLink("libz", "shared", "libz", "shared")
2164}
2165
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002166var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2167 func(variables android.FixtureProductVariables) {
2168 variables.SanitizeDevice = []string{"hwaddress"}
2169 },
2170)
2171
Jooyung Han75568392020-03-20 04:29:24 +09002172func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002173 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002174 apex {
2175 name: "myapex",
2176 key: "myapex.key",
2177 native_shared_libs: ["libx"],
2178 min_sdk_version: "29",
2179 }
2180
2181 apex_key {
2182 name: "myapex.key",
2183 public_key: "testkey.avbpubkey",
2184 private_key: "testkey.pem",
2185 }
2186
2187 cc_library {
2188 name: "libx",
2189 shared_libs: ["libbar"],
2190 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002191 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002192 }
2193
2194 cc_library {
2195 name: "libbar",
2196 stubs: {
2197 versions: ["29", "30"],
2198 },
2199 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002200 `,
2201 prepareForTestWithSantitizeHwaddress,
2202 )
Jooyung Han03b51852020-02-26 22:45:42 +09002203 expectLink := func(from, from_variant, to, to_variant string) {
2204 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2205 libFlags := ld.Args["libFlags"]
2206 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2207 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002208 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002209}
2210
Jooyung Han75568392020-03-20 04:29:24 +09002211func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002212 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002213 apex {
2214 name: "myapex",
2215 key: "myapex.key",
2216 native_shared_libs: ["libx"],
2217 min_sdk_version: "29",
2218 }
2219
2220 apex_key {
2221 name: "myapex.key",
2222 public_key: "testkey.avbpubkey",
2223 private_key: "testkey.pem",
2224 }
2225
2226 cc_library {
2227 name: "libx",
2228 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002229 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002230 }
Jooyung Han75568392020-03-20 04:29:24 +09002231 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002232
2233 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002234 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002235 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002236 // note that platform variant is not.
2237 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002238 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002239}
2240
Jooyung Han749dc692020-04-15 11:03:39 +09002241func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2242 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002243 apex {
2244 name: "myapex",
2245 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002246 native_shared_libs: ["mylib"],
2247 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002248 }
2249
2250 apex_key {
2251 name: "myapex.key",
2252 public_key: "testkey.avbpubkey",
2253 private_key: "testkey.pem",
2254 }
Jooyung Han749dc692020-04-15 11:03:39 +09002255
2256 cc_library {
2257 name: "mylib",
2258 srcs: ["mylib.cpp"],
2259 system_shared_libs: [],
2260 stl: "none",
2261 apex_available: [
2262 "myapex",
2263 ],
2264 min_sdk_version: "30",
2265 }
2266 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002267
2268 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2269 apex {
2270 name: "myapex",
2271 key: "myapex.key",
2272 native_shared_libs: ["libfoo.ffi"],
2273 min_sdk_version: "29",
2274 }
2275
2276 apex_key {
2277 name: "myapex.key",
2278 public_key: "testkey.avbpubkey",
2279 private_key: "testkey.pem",
2280 }
2281
2282 rust_ffi_shared {
2283 name: "libfoo.ffi",
2284 srcs: ["foo.rs"],
2285 crate_name: "foo",
2286 apex_available: [
2287 "myapex",
2288 ],
2289 min_sdk_version: "30",
2290 }
2291 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002292
2293 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2294 apex {
2295 name: "myapex",
2296 key: "myapex.key",
2297 java_libs: ["libfoo"],
2298 min_sdk_version: "29",
2299 }
2300
2301 apex_key {
2302 name: "myapex.key",
2303 public_key: "testkey.avbpubkey",
2304 private_key: "testkey.pem",
2305 }
2306
2307 java_import {
2308 name: "libfoo",
2309 jars: ["libfoo.jar"],
2310 apex_available: [
2311 "myapex",
2312 ],
2313 min_sdk_version: "30",
2314 }
2315 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002316
2317 // Skip check for modules compiling against core API surface
2318 testApex(t, `
2319 apex {
2320 name: "myapex",
2321 key: "myapex.key",
2322 java_libs: ["libfoo"],
2323 min_sdk_version: "29",
2324 }
2325
2326 apex_key {
2327 name: "myapex.key",
2328 public_key: "testkey.avbpubkey",
2329 private_key: "testkey.pem",
2330 }
2331
2332 java_library {
2333 name: "libfoo",
2334 srcs: ["Foo.java"],
2335 apex_available: [
2336 "myapex",
2337 ],
2338 // Compile against core API surface
2339 sdk_version: "core_current",
2340 min_sdk_version: "30",
2341 }
2342 `)
2343
Jooyung Han749dc692020-04-15 11:03:39 +09002344}
2345
2346func TestApexMinSdkVersion_Okay(t *testing.T) {
2347 testApex(t, `
2348 apex {
2349 name: "myapex",
2350 key: "myapex.key",
2351 native_shared_libs: ["libfoo"],
2352 java_libs: ["libbar"],
2353 min_sdk_version: "29",
2354 }
2355
2356 apex_key {
2357 name: "myapex.key",
2358 public_key: "testkey.avbpubkey",
2359 private_key: "testkey.pem",
2360 }
2361
2362 cc_library {
2363 name: "libfoo",
2364 srcs: ["mylib.cpp"],
2365 shared_libs: ["libfoo_dep"],
2366 apex_available: ["myapex"],
2367 min_sdk_version: "29",
2368 }
2369
2370 cc_library {
2371 name: "libfoo_dep",
2372 srcs: ["mylib.cpp"],
2373 apex_available: ["myapex"],
2374 min_sdk_version: "29",
2375 }
2376
2377 java_library {
2378 name: "libbar",
2379 sdk_version: "current",
2380 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002381 static_libs: [
2382 "libbar_dep",
2383 "libbar_import_dep",
2384 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002385 apex_available: ["myapex"],
2386 min_sdk_version: "29",
2387 }
2388
2389 java_library {
2390 name: "libbar_dep",
2391 sdk_version: "current",
2392 srcs: ["a.java"],
2393 apex_available: ["myapex"],
2394 min_sdk_version: "29",
2395 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002396
2397 java_import {
2398 name: "libbar_import_dep",
2399 jars: ["libbar.jar"],
2400 apex_available: ["myapex"],
2401 min_sdk_version: "29",
2402 }
Jooyung Han03b51852020-02-26 22:45:42 +09002403 `)
2404}
2405
Colin Cross8ca61c12022-10-06 21:00:14 -07002406func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2407 // Tests that an apex dependency with min_sdk_version higher than the
2408 // min_sdk_version of the apex is allowed as long as the dependency's
2409 // min_sdk_version is less than or equal to the api level that the
2410 // architecture was introduced in. In this case, arm64 didn't exist
2411 // until api level 21, so the arm64 code will never need to run on
2412 // an api level 20 device, even if other architectures of the apex
2413 // will.
2414 testApex(t, `
2415 apex {
2416 name: "myapex",
2417 key: "myapex.key",
2418 native_shared_libs: ["libfoo"],
2419 min_sdk_version: "20",
2420 }
2421
2422 apex_key {
2423 name: "myapex.key",
2424 public_key: "testkey.avbpubkey",
2425 private_key: "testkey.pem",
2426 }
2427
2428 cc_library {
2429 name: "libfoo",
2430 srcs: ["mylib.cpp"],
2431 apex_available: ["myapex"],
2432 min_sdk_version: "21",
2433 stl: "none",
2434 }
2435 `)
2436}
2437
Artur Satayev8cf899a2020-04-15 17:29:42 +01002438func TestJavaStableSdkVersion(t *testing.T) {
2439 testCases := []struct {
2440 name string
2441 expectedError string
2442 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002443 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002444 }{
2445 {
2446 name: "Non-updatable apex with non-stable dep",
2447 bp: `
2448 apex {
2449 name: "myapex",
2450 java_libs: ["myjar"],
2451 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002452 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002453 }
2454 apex_key {
2455 name: "myapex.key",
2456 public_key: "testkey.avbpubkey",
2457 private_key: "testkey.pem",
2458 }
2459 java_library {
2460 name: "myjar",
2461 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002462 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002463 apex_available: ["myapex"],
2464 }
2465 `,
2466 },
2467 {
2468 name: "Updatable apex with stable dep",
2469 bp: `
2470 apex {
2471 name: "myapex",
2472 java_libs: ["myjar"],
2473 key: "myapex.key",
2474 updatable: true,
2475 min_sdk_version: "29",
2476 }
2477 apex_key {
2478 name: "myapex.key",
2479 public_key: "testkey.avbpubkey",
2480 private_key: "testkey.pem",
2481 }
2482 java_library {
2483 name: "myjar",
2484 srcs: ["foo/bar/MyClass.java"],
2485 sdk_version: "current",
2486 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002487 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002488 }
2489 `,
2490 },
2491 {
2492 name: "Updatable apex with non-stable dep",
2493 expectedError: "cannot depend on \"myjar\"",
2494 bp: `
2495 apex {
2496 name: "myapex",
2497 java_libs: ["myjar"],
2498 key: "myapex.key",
2499 updatable: true,
2500 }
2501 apex_key {
2502 name: "myapex.key",
2503 public_key: "testkey.avbpubkey",
2504 private_key: "testkey.pem",
2505 }
2506 java_library {
2507 name: "myjar",
2508 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002509 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002510 apex_available: ["myapex"],
2511 }
2512 `,
2513 },
2514 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002515 name: "Updatable apex with non-stable legacy core platform dep",
2516 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2517 bp: `
2518 apex {
2519 name: "myapex",
2520 java_libs: ["myjar-uses-legacy"],
2521 key: "myapex.key",
2522 updatable: true,
2523 }
2524 apex_key {
2525 name: "myapex.key",
2526 public_key: "testkey.avbpubkey",
2527 private_key: "testkey.pem",
2528 }
2529 java_library {
2530 name: "myjar-uses-legacy",
2531 srcs: ["foo/bar/MyClass.java"],
2532 sdk_version: "core_platform",
2533 apex_available: ["myapex"],
2534 }
2535 `,
2536 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2537 },
2538 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002539 name: "Updatable apex with non-stable transitive dep",
2540 // This is not actually detecting that the transitive dependency is unstable, rather it is
2541 // detecting that the transitive dependency is building against a wider API surface than the
2542 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002543 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002544 bp: `
2545 apex {
2546 name: "myapex",
2547 java_libs: ["myjar"],
2548 key: "myapex.key",
2549 updatable: true,
2550 }
2551 apex_key {
2552 name: "myapex.key",
2553 public_key: "testkey.avbpubkey",
2554 private_key: "testkey.pem",
2555 }
2556 java_library {
2557 name: "myjar",
2558 srcs: ["foo/bar/MyClass.java"],
2559 sdk_version: "current",
2560 apex_available: ["myapex"],
2561 static_libs: ["transitive-jar"],
2562 }
2563 java_library {
2564 name: "transitive-jar",
2565 srcs: ["foo/bar/MyClass.java"],
2566 sdk_version: "core_platform",
2567 apex_available: ["myapex"],
2568 }
2569 `,
2570 },
2571 }
2572
2573 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002574 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2575 continue
2576 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002577 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002578 errorHandler := android.FixtureExpectsNoErrors
2579 if test.expectedError != "" {
2580 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002581 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002582 android.GroupFixturePreparers(
2583 java.PrepareForTestWithJavaDefaultModules,
2584 PrepareForTestWithApexBuildComponents,
2585 prepareForTestWithMyapex,
2586 android.OptionalFixturePreparer(test.preparer),
2587 ).
2588 ExtendWithErrorHandler(errorHandler).
2589 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002590 })
2591 }
2592}
2593
Jooyung Han749dc692020-04-15 11:03:39 +09002594func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2595 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2596 apex {
2597 name: "myapex",
2598 key: "myapex.key",
2599 native_shared_libs: ["mylib"],
2600 min_sdk_version: "29",
2601 }
2602
2603 apex_key {
2604 name: "myapex.key",
2605 public_key: "testkey.avbpubkey",
2606 private_key: "testkey.pem",
2607 }
2608
2609 cc_library {
2610 name: "mylib",
2611 srcs: ["mylib.cpp"],
2612 shared_libs: ["mylib2"],
2613 system_shared_libs: [],
2614 stl: "none",
2615 apex_available: [
2616 "myapex",
2617 ],
2618 min_sdk_version: "29",
2619 }
2620
2621 // indirect part of the apex
2622 cc_library {
2623 name: "mylib2",
2624 srcs: ["mylib.cpp"],
2625 system_shared_libs: [],
2626 stl: "none",
2627 apex_available: [
2628 "myapex",
2629 ],
2630 min_sdk_version: "30",
2631 }
2632 `)
2633}
2634
2635func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2636 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2637 apex {
2638 name: "myapex",
2639 key: "myapex.key",
2640 apps: ["AppFoo"],
2641 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002642 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002643 }
2644
2645 apex_key {
2646 name: "myapex.key",
2647 public_key: "testkey.avbpubkey",
2648 private_key: "testkey.pem",
2649 }
2650
2651 android_app {
2652 name: "AppFoo",
2653 srcs: ["foo/bar/MyClass.java"],
2654 sdk_version: "current",
2655 min_sdk_version: "29",
2656 system_modules: "none",
2657 stl: "none",
2658 static_libs: ["bar"],
2659 apex_available: [ "myapex" ],
2660 }
2661
2662 java_library {
2663 name: "bar",
2664 sdk_version: "current",
2665 srcs: ["a.java"],
2666 apex_available: [ "myapex" ],
2667 }
2668 `)
2669}
2670
2671func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002672 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002673 apex {
2674 name: "myapex",
2675 key: "myapex.key",
2676 native_shared_libs: ["mylib"],
2677 min_sdk_version: "29",
2678 }
2679
2680 apex_key {
2681 name: "myapex.key",
2682 public_key: "testkey.avbpubkey",
2683 private_key: "testkey.pem",
2684 }
2685
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002686 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002687 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2688 cc_library {
2689 name: "mylib",
2690 srcs: ["mylib.cpp"],
2691 shared_libs: ["mylib2"],
2692 system_shared_libs: [],
2693 stl: "none",
2694 apex_available: ["myapex", "otherapex"],
2695 min_sdk_version: "29",
2696 }
2697
2698 cc_library {
2699 name: "mylib2",
2700 srcs: ["mylib.cpp"],
2701 system_shared_libs: [],
2702 stl: "none",
2703 apex_available: ["otherapex"],
2704 stubs: { versions: ["29", "30"] },
2705 min_sdk_version: "30",
2706 }
2707
2708 apex {
2709 name: "otherapex",
2710 key: "myapex.key",
2711 native_shared_libs: ["mylib", "mylib2"],
2712 min_sdk_version: "30",
2713 }
2714 `)
2715 expectLink := func(from, from_variant, to, to_variant string) {
2716 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2717 libFlags := ld.Args["libFlags"]
2718 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2719 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002720 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002721 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002722}
2723
Jooyung Haned124c32021-01-26 11:43:46 +09002724func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002725 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2726 func(variables android.FixtureProductVariables) {
2727 variables.Platform_sdk_codename = proptools.StringPtr("S")
2728 variables.Platform_version_active_codenames = []string{"S"}
2729 },
2730 )
Jooyung Haned124c32021-01-26 11:43:46 +09002731 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2732 apex {
2733 name: "myapex",
2734 key: "myapex.key",
2735 native_shared_libs: ["libfoo"],
2736 min_sdk_version: "S",
2737 }
2738 apex_key {
2739 name: "myapex.key",
2740 public_key: "testkey.avbpubkey",
2741 private_key: "testkey.pem",
2742 }
2743 cc_library {
2744 name: "libfoo",
2745 shared_libs: ["libbar"],
2746 apex_available: ["myapex"],
2747 min_sdk_version: "29",
2748 }
2749 cc_library {
2750 name: "libbar",
2751 apex_available: ["myapex"],
2752 }
2753 `, withSAsActiveCodeNames)
2754}
2755
2756func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002757 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2758 variables.Platform_sdk_codename = proptools.StringPtr("S")
2759 variables.Platform_version_active_codenames = []string{"S", "T"}
2760 })
Colin Cross1c460562021-02-16 17:55:47 -08002761 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002762 apex {
2763 name: "myapex",
2764 key: "myapex.key",
2765 native_shared_libs: ["libfoo"],
2766 min_sdk_version: "S",
2767 }
2768 apex_key {
2769 name: "myapex.key",
2770 public_key: "testkey.avbpubkey",
2771 private_key: "testkey.pem",
2772 }
2773 cc_library {
2774 name: "libfoo",
2775 shared_libs: ["libbar"],
2776 apex_available: ["myapex"],
2777 min_sdk_version: "S",
2778 }
2779 cc_library {
2780 name: "libbar",
2781 stubs: {
2782 symbol_file: "libbar.map.txt",
2783 versions: ["30", "S", "T"],
2784 },
2785 }
2786 `, withSAsActiveCodeNames)
2787
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002788 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002789 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2790 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002791 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002792}
2793
Jiyong Park7c2ee712018-12-07 00:42:25 +09002794func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002795 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002796 apex {
2797 name: "myapex",
2798 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002799 native_shared_libs: ["mylib"],
2800 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002801 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002802 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002803 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002804 }
2805
2806 apex_key {
2807 name: "myapex.key",
2808 public_key: "testkey.avbpubkey",
2809 private_key: "testkey.pem",
2810 }
2811
2812 prebuilt_etc {
2813 name: "myetc",
2814 src: "myprebuilt",
2815 sub_dir: "foo/bar",
2816 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002817
2818 cc_library {
2819 name: "mylib",
2820 srcs: ["mylib.cpp"],
2821 relative_install_path: "foo/bar",
2822 system_shared_libs: [],
2823 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002824 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002825 }
2826
2827 cc_binary {
2828 name: "mybin",
2829 srcs: ["mylib.cpp"],
2830 relative_install_path: "foo/bar",
2831 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002832 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002833 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002834 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002835 `)
2836
Sundong Ahnabb64432019-10-22 13:58:29 +09002837 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002838 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002839
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002840 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002841 ensureContains(t, cmd, "/etc ")
2842 ensureContains(t, cmd, "/etc/foo ")
2843 ensureContains(t, cmd, "/etc/foo/bar ")
2844 ensureContains(t, cmd, "/lib64 ")
2845 ensureContains(t, cmd, "/lib64/foo ")
2846 ensureContains(t, cmd, "/lib64/foo/bar ")
2847 ensureContains(t, cmd, "/lib ")
2848 ensureContains(t, cmd, "/lib/foo ")
2849 ensureContains(t, cmd, "/lib/foo/bar ")
2850 ensureContains(t, cmd, "/bin ")
2851 ensureContains(t, cmd, "/bin/foo ")
2852 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002853}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002854
Jooyung Han35155c42020-02-06 17:33:20 +09002855func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002856 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002857 apex {
2858 name: "myapex",
2859 key: "myapex.key",
2860 multilib: {
2861 both: {
2862 native_shared_libs: ["mylib"],
2863 binaries: ["mybin"],
2864 },
2865 },
2866 compile_multilib: "both",
2867 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002868 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002869 }
2870
2871 apex_key {
2872 name: "myapex.key",
2873 public_key: "testkey.avbpubkey",
2874 private_key: "testkey.pem",
2875 }
2876
2877 cc_library {
2878 name: "mylib",
2879 relative_install_path: "foo/bar",
2880 system_shared_libs: [],
2881 stl: "none",
2882 apex_available: [ "myapex" ],
2883 native_bridge_supported: true,
2884 }
2885
2886 cc_binary {
2887 name: "mybin",
2888 relative_install_path: "foo/bar",
2889 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002890 stl: "none",
2891 apex_available: [ "myapex" ],
2892 native_bridge_supported: true,
2893 compile_multilib: "both", // default is "first" for binary
2894 multilib: {
2895 lib64: {
2896 suffix: "64",
2897 },
2898 },
2899 }
2900 `, withNativeBridgeEnabled)
2901 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2902 "bin/foo/bar/mybin",
2903 "bin/foo/bar/mybin64",
2904 "bin/arm/foo/bar/mybin",
2905 "bin/arm64/foo/bar/mybin64",
2906 "lib/foo/bar/mylib.so",
2907 "lib/arm/foo/bar/mylib.so",
2908 "lib64/foo/bar/mylib.so",
2909 "lib64/arm64/foo/bar/mylib.so",
2910 })
2911}
2912
Jooyung Han85d61762020-06-24 23:50:26 +09002913func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002914 result := android.GroupFixturePreparers(
2915 prepareForApexTest,
2916 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2917 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002918 apex {
2919 name: "myapex",
2920 key: "myapex.key",
2921 binaries: ["mybin"],
2922 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002923 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002924 }
2925 apex_key {
2926 name: "myapex.key",
2927 public_key: "testkey.avbpubkey",
2928 private_key: "testkey.pem",
2929 }
2930 cc_binary {
2931 name: "mybin",
2932 vendor: true,
2933 shared_libs: ["libfoo"],
2934 }
2935 cc_library {
2936 name: "libfoo",
2937 proprietary: true,
2938 }
2939 `)
2940
Colin Crossc68db4b2021-11-11 18:59:15 -08002941 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002942 "bin/mybin",
2943 "lib64/libfoo.so",
2944 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2945 "lib64/libc++.so",
2946 })
2947
Colin Crossc68db4b2021-11-11 18:59:15 -08002948 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2949 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002950 name := apexBundle.BaseModuleName()
2951 prefix := "TARGET_"
2952 var builder strings.Builder
2953 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002954 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002955 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002956 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002957
Colin Crossc68db4b2021-11-11 18:59:15 -08002958 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002959 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2960 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002961}
2962
Jooyung Hanc5a96762022-02-04 11:54:50 +09002963func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2964 testApexError(t, `Trying to include a VNDK library`, `
2965 apex {
2966 name: "myapex",
2967 key: "myapex.key",
2968 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2969 vendor: true,
2970 use_vndk_as_stable: true,
2971 updatable: false,
2972 }
2973 apex_key {
2974 name: "myapex.key",
2975 public_key: "testkey.avbpubkey",
2976 private_key: "testkey.pem",
2977 }`)
2978}
2979
Jooyung Handf78e212020-07-22 15:54:47 +09002980func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002981 // myapex myapex2
2982 // | |
2983 // mybin ------. mybin2
2984 // \ \ / |
2985 // (stable) .---\--------` |
2986 // \ / \ |
2987 // \ / \ /
2988 // libvndk libvendor
2989 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002990 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002991 apex {
2992 name: "myapex",
2993 key: "myapex.key",
2994 binaries: ["mybin"],
2995 vendor: true,
2996 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002997 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002998 }
2999 apex_key {
3000 name: "myapex.key",
3001 public_key: "testkey.avbpubkey",
3002 private_key: "testkey.pem",
3003 }
3004 cc_binary {
3005 name: "mybin",
3006 vendor: true,
3007 shared_libs: ["libvndk", "libvendor"],
3008 }
3009 cc_library {
3010 name: "libvndk",
3011 vndk: {
3012 enabled: true,
3013 },
3014 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003015 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09003016 }
3017 cc_library {
3018 name: "libvendor",
3019 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09003020 stl: "none",
3021 }
3022 apex {
3023 name: "myapex2",
3024 key: "myapex.key",
3025 binaries: ["mybin2"],
3026 vendor: true,
3027 use_vndk_as_stable: false,
3028 updatable: false,
3029 }
3030 cc_binary {
3031 name: "mybin2",
3032 vendor: true,
3033 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09003034 }
3035 `)
3036
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003037 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09003038
Jooyung Han91f92032022-02-04 12:36:33 +09003039 for _, tc := range []struct {
3040 name string
3041 apexName string
3042 moduleName string
3043 moduleVariant string
3044 libs []string
3045 contents []string
3046 requireVndkNamespace bool
3047 }{
3048 {
3049 name: "use_vndk_as_stable",
3050 apexName: "myapex",
3051 moduleName: "mybin",
3052 moduleVariant: vendorVariant + "_apex10000",
3053 libs: []string{
3054 // should link with vendor variants of VNDK libs(libvndk/libc++)
3055 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3056 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3057 // unstable Vendor libs as APEX variant
3058 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3059 },
3060 contents: []string{
3061 "bin/mybin",
3062 "lib64/libvendor.so",
3063 // VNDK libs (libvndk/libc++) are not included
3064 },
3065 requireVndkNamespace: true,
3066 },
3067 {
3068 name: "!use_vndk_as_stable",
3069 apexName: "myapex2",
3070 moduleName: "mybin2",
3071 moduleVariant: vendorVariant + "_myapex2",
3072 libs: []string{
3073 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3074 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3075 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3076 // unstable vendor libs have "merged" APEX variants
3077 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3078 },
3079 contents: []string{
3080 "bin/mybin2",
3081 "lib64/libvendor.so",
3082 // VNDK libs are included as well
3083 "lib64/libvndk.so",
3084 "lib64/libc++.so",
3085 },
3086 requireVndkNamespace: false,
3087 },
3088 } {
3089 t.Run(tc.name, func(t *testing.T) {
3090 // Check linked libs
3091 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3092 libs := names(ldRule.Args["libFlags"])
3093 for _, lib := range tc.libs {
3094 ensureListContains(t, libs, lib)
3095 }
3096 // Check apex contents
3097 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003098
Jooyung Han91f92032022-02-04 12:36:33 +09003099 // Check "requireNativeLibs"
3100 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
3101 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3102 if tc.requireVndkNamespace {
3103 ensureListContains(t, requireNativeLibs, ":vndk")
3104 } else {
3105 ensureListNotContains(t, requireNativeLibs, ":vndk")
3106 }
3107 })
3108 }
Jooyung Handf78e212020-07-22 15:54:47 +09003109}
3110
Justin Yun13decfb2021-03-08 19:25:55 +09003111func TestProductVariant(t *testing.T) {
3112 ctx := testApex(t, `
3113 apex {
3114 name: "myapex",
3115 key: "myapex.key",
3116 updatable: false,
3117 product_specific: true,
3118 binaries: ["foo"],
3119 }
3120
3121 apex_key {
3122 name: "myapex.key",
3123 public_key: "testkey.avbpubkey",
3124 private_key: "testkey.pem",
3125 }
3126
3127 cc_binary {
3128 name: "foo",
3129 product_available: true,
3130 apex_available: ["myapex"],
3131 srcs: ["foo.cpp"],
3132 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003133 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3134 variables.ProductVndkVersion = proptools.StringPtr("current")
3135 }),
3136 )
Justin Yun13decfb2021-03-08 19:25:55 +09003137
3138 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003139 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003140 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3141 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3142 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3143 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3144}
3145
Jooyung Han8e5685d2020-09-21 11:02:57 +09003146func TestApex_withPrebuiltFirmware(t *testing.T) {
3147 testCases := []struct {
3148 name string
3149 additionalProp string
3150 }{
3151 {"system apex with prebuilt_firmware", ""},
3152 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3153 }
3154 for _, tc := range testCases {
3155 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003156 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003157 apex {
3158 name: "myapex",
3159 key: "myapex.key",
3160 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003161 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003162 `+tc.additionalProp+`
3163 }
3164 apex_key {
3165 name: "myapex.key",
3166 public_key: "testkey.avbpubkey",
3167 private_key: "testkey.pem",
3168 }
3169 prebuilt_firmware {
3170 name: "myfirmware",
3171 src: "myfirmware.bin",
3172 filename_from_src: true,
3173 `+tc.additionalProp+`
3174 }
3175 `)
3176 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3177 "etc/firmware/myfirmware.bin",
3178 })
3179 })
3180 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003181}
3182
Jooyung Hanefb184e2020-06-25 17:14:25 +09003183func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003184 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003185 apex {
3186 name: "myapex",
3187 key: "myapex.key",
3188 vendor: true,
3189 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003190 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003191 }
3192
3193 apex_key {
3194 name: "myapex.key",
3195 public_key: "testkey.avbpubkey",
3196 private_key: "testkey.pem",
3197 }
3198
3199 cc_library {
3200 name: "mylib",
3201 vendor_available: true,
3202 }
3203 `)
3204
3205 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003206 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003207 name := apexBundle.BaseModuleName()
3208 prefix := "TARGET_"
3209 var builder strings.Builder
3210 data.Custom(&builder, name, prefix, "", data)
3211 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00003212 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003213}
3214
Jooyung Han2ed99d02020-06-24 23:26:26 +09003215func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003216 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003217 apex {
3218 name: "myapex",
3219 key: "myapex.key",
3220 vintf_fragments: ["fragment.xml"],
3221 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003222 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003223 }
3224 apex_key {
3225 name: "myapex.key",
3226 public_key: "testkey.avbpubkey",
3227 private_key: "testkey.pem",
3228 }
3229 cc_binary {
3230 name: "mybin",
3231 }
3232 `)
3233
3234 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003235 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003236 name := apexBundle.BaseModuleName()
3237 prefix := "TARGET_"
3238 var builder strings.Builder
3239 data.Custom(&builder, name, prefix, "", data)
3240 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003241 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003242 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003243}
3244
Jiyong Park16e91a02018-12-20 18:18:08 +09003245func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003246 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003247 apex {
3248 name: "myapex",
3249 key: "myapex.key",
3250 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003251 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003252 }
3253
3254 apex_key {
3255 name: "myapex.key",
3256 public_key: "testkey.avbpubkey",
3257 private_key: "testkey.pem",
3258 }
3259
3260 cc_library {
3261 name: "mylib",
3262 srcs: ["mylib.cpp"],
3263 system_shared_libs: [],
3264 stl: "none",
3265 stubs: {
3266 versions: ["1", "2", "3"],
3267 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003268 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003269 }
3270
3271 cc_binary {
3272 name: "not_in_apex",
3273 srcs: ["mylib.cpp"],
3274 static_libs: ["mylib"],
3275 static_executable: true,
3276 system_shared_libs: [],
3277 stl: "none",
3278 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003279 `)
3280
Colin Cross7113d202019-11-20 16:39:12 -08003281 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003282
3283 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003284 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003285}
Jiyong Park9335a262018-12-24 11:31:58 +09003286
3287func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003288 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003289 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003290 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003291 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003292 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003293 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003294 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003295 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003296 }
3297
3298 cc_library {
3299 name: "mylib",
3300 srcs: ["mylib.cpp"],
3301 system_shared_libs: [],
3302 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003303 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003304 }
3305
3306 apex_key {
3307 name: "myapex.key",
3308 public_key: "testkey.avbpubkey",
3309 private_key: "testkey.pem",
3310 }
3311
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003312 android_app_certificate {
3313 name: "myapex.certificate",
3314 certificate: "testkey",
3315 }
3316
3317 android_app_certificate {
3318 name: "myapex.certificate.override",
3319 certificate: "testkey.override",
3320 }
3321
Jiyong Park9335a262018-12-24 11:31:58 +09003322 `)
3323
3324 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003325 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003326
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003327 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3328 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003329 "vendor/foo/devkeys/testkey.avbpubkey")
3330 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003331 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3332 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003333 "vendor/foo/devkeys/testkey.pem")
3334 }
3335
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003336 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003337 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003338 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003339 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003340 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003341 }
3342}
Jiyong Park58e364a2019-01-19 19:24:06 +09003343
Jooyung Hanf121a652019-12-17 14:30:11 +09003344func TestCertificate(t *testing.T) {
3345 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003346 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003347 apex {
3348 name: "myapex",
3349 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003350 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003351 }
3352 apex_key {
3353 name: "myapex.key",
3354 public_key: "testkey.avbpubkey",
3355 private_key: "testkey.pem",
3356 }`)
3357 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3358 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3359 if actual := rule.Args["certificates"]; actual != expected {
3360 t.Errorf("certificates should be %q, not %q", expected, actual)
3361 }
3362 })
3363 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003364 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003365 apex {
3366 name: "myapex_keytest",
3367 key: "myapex.key",
3368 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003369 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003370 }
3371 apex_key {
3372 name: "myapex.key",
3373 public_key: "testkey.avbpubkey",
3374 private_key: "testkey.pem",
3375 }
3376 android_app_certificate {
3377 name: "myapex.certificate.override",
3378 certificate: "testkey.override",
3379 }`)
3380 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3381 expected := "testkey.override.x509.pem testkey.override.pk8"
3382 if actual := rule.Args["certificates"]; actual != expected {
3383 t.Errorf("certificates should be %q, not %q", expected, actual)
3384 }
3385 })
3386 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003387 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003388 apex {
3389 name: "myapex",
3390 key: "myapex.key",
3391 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003392 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003393 }
3394 apex_key {
3395 name: "myapex.key",
3396 public_key: "testkey.avbpubkey",
3397 private_key: "testkey.pem",
3398 }
3399 android_app_certificate {
3400 name: "myapex.certificate",
3401 certificate: "testkey",
3402 }`)
3403 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3404 expected := "testkey.x509.pem testkey.pk8"
3405 if actual := rule.Args["certificates"]; actual != expected {
3406 t.Errorf("certificates should be %q, not %q", expected, actual)
3407 }
3408 })
3409 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003410 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003411 apex {
3412 name: "myapex_keytest",
3413 key: "myapex.key",
3414 file_contexts: ":myapex-file_contexts",
3415 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003416 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003417 }
3418 apex_key {
3419 name: "myapex.key",
3420 public_key: "testkey.avbpubkey",
3421 private_key: "testkey.pem",
3422 }
3423 android_app_certificate {
3424 name: "myapex.certificate.override",
3425 certificate: "testkey.override",
3426 }`)
3427 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3428 expected := "testkey.override.x509.pem testkey.override.pk8"
3429 if actual := rule.Args["certificates"]; actual != expected {
3430 t.Errorf("certificates should be %q, not %q", expected, actual)
3431 }
3432 })
3433 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003434 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003435 apex {
3436 name: "myapex",
3437 key: "myapex.key",
3438 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003439 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003440 }
3441 apex_key {
3442 name: "myapex.key",
3443 public_key: "testkey.avbpubkey",
3444 private_key: "testkey.pem",
3445 }`)
3446 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3447 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3448 if actual := rule.Args["certificates"]; actual != expected {
3449 t.Errorf("certificates should be %q, not %q", expected, actual)
3450 }
3451 })
3452 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003453 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003454 apex {
3455 name: "myapex_keytest",
3456 key: "myapex.key",
3457 file_contexts: ":myapex-file_contexts",
3458 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003459 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003460 }
3461 apex_key {
3462 name: "myapex.key",
3463 public_key: "testkey.avbpubkey",
3464 private_key: "testkey.pem",
3465 }
3466 android_app_certificate {
3467 name: "myapex.certificate.override",
3468 certificate: "testkey.override",
3469 }`)
3470 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3471 expected := "testkey.override.x509.pem testkey.override.pk8"
3472 if actual := rule.Args["certificates"]; actual != expected {
3473 t.Errorf("certificates should be %q, not %q", expected, actual)
3474 }
3475 })
3476}
3477
Jiyong Park58e364a2019-01-19 19:24:06 +09003478func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003479 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003480 apex {
3481 name: "myapex",
3482 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003483 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003484 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003485 }
3486
3487 apex {
3488 name: "otherapex",
3489 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003490 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003491 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003492 }
3493
3494 apex_key {
3495 name: "myapex.key",
3496 public_key: "testkey.avbpubkey",
3497 private_key: "testkey.pem",
3498 }
3499
3500 cc_library {
3501 name: "mylib",
3502 srcs: ["mylib.cpp"],
3503 system_shared_libs: [],
3504 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003505 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003506 "myapex",
3507 "otherapex",
3508 ],
Jooyung Han24282772020-03-21 23:20:55 +09003509 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003510 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003511 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003512 cc_library {
3513 name: "mylib2",
3514 srcs: ["mylib.cpp"],
3515 system_shared_libs: [],
3516 stl: "none",
3517 apex_available: [
3518 "myapex",
3519 "otherapex",
3520 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003521 static_libs: ["mylib3"],
3522 recovery_available: true,
3523 min_sdk_version: "29",
3524 }
3525 cc_library {
3526 name: "mylib3",
3527 srcs: ["mylib.cpp"],
3528 system_shared_libs: [],
3529 stl: "none",
3530 apex_available: [
3531 "myapex",
3532 "otherapex",
3533 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003534 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003535 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003536 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003537 `)
3538
Jooyung Hanc87a0592020-03-02 17:44:33 +09003539 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003540 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003541 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003542
Vinh Tranf9754732023-01-19 22:41:46 -05003543 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003544 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003545 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003546
Vinh Tranf9754732023-01-19 22:41:46 -05003547 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003548 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003549 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003550
Colin Crossaede88c2020-08-11 12:17:01 -07003551 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3552 // each variant defines additional macros to distinguish which apex variant it is built for
3553
3554 // non-APEX variant does not have __ANDROID_APEX__ defined
3555 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3556 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3557
Vinh Tranf9754732023-01-19 22:41:46 -05003558 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003559 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3560 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003561
Jooyung Hanc87a0592020-03-02 17:44:33 +09003562 // non-APEX variant does not have __ANDROID_APEX__ defined
3563 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3564 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3565
Vinh Tranf9754732023-01-19 22:41:46 -05003566 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003567 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003568 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003569}
Jiyong Park7e636d02019-01-28 16:16:54 +09003570
3571func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003572 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003573 apex {
3574 name: "myapex",
3575 key: "myapex.key",
3576 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003577 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003578 }
3579
3580 apex_key {
3581 name: "myapex.key",
3582 public_key: "testkey.avbpubkey",
3583 private_key: "testkey.pem",
3584 }
3585
3586 cc_library_headers {
3587 name: "mylib_headers",
3588 export_include_dirs: ["my_include"],
3589 system_shared_libs: [],
3590 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003591 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003592 }
3593
3594 cc_library {
3595 name: "mylib",
3596 srcs: ["mylib.cpp"],
3597 system_shared_libs: [],
3598 stl: "none",
3599 header_libs: ["mylib_headers"],
3600 export_header_lib_headers: ["mylib_headers"],
3601 stubs: {
3602 versions: ["1", "2", "3"],
3603 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003604 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003605 }
3606
3607 cc_library {
3608 name: "otherlib",
3609 srcs: ["mylib.cpp"],
3610 system_shared_libs: [],
3611 stl: "none",
3612 shared_libs: ["mylib"],
3613 }
3614 `)
3615
Colin Cross7113d202019-11-20 16:39:12 -08003616 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003617
3618 // Ensure that the include path of the header lib is exported to 'otherlib'
3619 ensureContains(t, cFlags, "-Imy_include")
3620}
Alex Light9670d332019-01-29 18:07:33 -08003621
Jiyong Park7cd10e32020-01-14 09:22:18 +09003622type fileInApex struct {
3623 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003624 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003625 isLink bool
3626}
3627
Jooyung Han1724d582022-12-21 10:17:44 +09003628func (f fileInApex) String() string {
3629 return f.src + ":" + f.path
3630}
3631
3632func (f fileInApex) match(expectation string) bool {
3633 parts := strings.Split(expectation, ":")
3634 if len(parts) == 1 {
3635 match, _ := path.Match(parts[0], f.path)
3636 return match
3637 }
3638 if len(parts) == 2 {
3639 matchSrc, _ := path.Match(parts[0], f.src)
3640 matchDst, _ := path.Match(parts[1], f.path)
3641 return matchSrc && matchDst
3642 }
3643 panic("invalid expected file specification: " + expectation)
3644}
3645
Jooyung Hana57af4a2020-01-23 05:36:59 +00003646func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003647 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003648 module := ctx.ModuleForTests(moduleName, variant)
3649 apexRule := module.MaybeRule("apexRule")
3650 apexDir := "/image.apex/"
3651 if apexRule.Rule == nil {
3652 apexRule = module.Rule("zipApexRule")
3653 apexDir = "/image.zipapex/"
3654 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003655 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003656 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003657 for _, cmd := range strings.Split(copyCmds, "&&") {
3658 cmd = strings.TrimSpace(cmd)
3659 if cmd == "" {
3660 continue
3661 }
3662 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003663 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003664 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003665 switch terms[0] {
3666 case "mkdir":
3667 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003668 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003669 t.Fatal("copyCmds contains invalid cp command", cmd)
3670 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003671 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003672 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003673 isLink = false
3674 case "ln":
3675 if len(terms) != 3 && len(terms) != 4 {
3676 // ln LINK TARGET or ln -s LINK TARGET
3677 t.Fatal("copyCmds contains invalid ln command", cmd)
3678 }
3679 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003680 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003681 isLink = true
3682 default:
3683 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3684 }
3685 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003686 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003687 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003688 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003689 }
Jooyung Han1724d582022-12-21 10:17:44 +09003690 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003691 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003692 }
3693 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003694 return ret
3695}
3696
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003697func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003698 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003699 var failed bool
3700 var surplus []string
3701 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003702 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003703 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003704 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003705 if file.match(expected) {
3706 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003707 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003708 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003709 }
3710 }
Jooyung Han1724d582022-12-21 10:17:44 +09003711 if !matchFound {
3712 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003713 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003714 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003715
Jooyung Han31c470b2019-10-18 16:26:59 +09003716 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003717 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003718 t.Log("surplus files", surplus)
3719 failed = true
3720 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003721
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003722 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003723 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003724 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003725 if !filesMatched[expected] {
3726 missing = append(missing, expected)
3727 }
3728 }
3729 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003730 t.Log("missing files", missing)
3731 failed = true
3732 }
3733 if failed {
3734 t.Fail()
3735 }
3736}
3737
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003738func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3739 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3740}
3741
3742func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3743 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3744 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3745 if deapexer.Output != nil {
3746 outputs = append(outputs, deapexer.Output.String())
3747 }
3748 for _, output := range deapexer.ImplicitOutputs {
3749 outputs = append(outputs, output.String())
3750 }
3751 actualFiles := make([]fileInApex, 0, len(outputs))
3752 for _, output := range outputs {
3753 dir := "/deapexer/"
3754 pos := strings.LastIndex(output, dir)
3755 if pos == -1 {
3756 t.Fatal("Unknown deapexer output ", output)
3757 }
3758 path := output[pos+len(dir):]
3759 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3760 }
3761 assertFileListEquals(t, files, actualFiles)
3762}
3763
Jooyung Han344d5432019-08-23 11:17:39 +09003764func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003765 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003766 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003767 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003768 "etc/llndk.libraries.29.txt",
3769 "etc/vndkcore.libraries.29.txt",
3770 "etc/vndksp.libraries.29.txt",
3771 "etc/vndkprivate.libraries.29.txt",
3772 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003773 }
3774 testCases := []struct {
3775 vndkVersion string
3776 expectedFiles []string
3777 }{
3778 {
3779 vndkVersion: "current",
3780 expectedFiles: append(commonFiles,
3781 "lib/libvndk.so",
3782 "lib/libvndksp.so",
3783 "lib64/libvndk.so",
3784 "lib64/libvndksp.so"),
3785 },
3786 {
3787 vndkVersion: "",
3788 expectedFiles: append(commonFiles,
3789 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3790 "lib/libvndksp.so",
3791 "lib64/libvndksp.so"),
3792 },
3793 }
3794 for _, tc := range testCases {
3795 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3796 ctx := testApex(t, `
3797 apex_vndk {
3798 name: "com.android.vndk.current",
3799 key: "com.android.vndk.current.key",
3800 updatable: false,
3801 }
3802
3803 apex_key {
3804 name: "com.android.vndk.current.key",
3805 public_key: "testkey.avbpubkey",
3806 private_key: "testkey.pem",
3807 }
3808
3809 cc_library {
3810 name: "libvndk",
3811 srcs: ["mylib.cpp"],
3812 vendor_available: true,
3813 product_available: true,
3814 vndk: {
3815 enabled: true,
3816 },
3817 system_shared_libs: [],
3818 stl: "none",
3819 apex_available: [ "com.android.vndk.current" ],
3820 }
3821
3822 cc_library {
3823 name: "libvndksp",
3824 srcs: ["mylib.cpp"],
3825 vendor_available: true,
3826 product_available: true,
3827 vndk: {
3828 enabled: true,
3829 support_system_process: true,
3830 },
3831 system_shared_libs: [],
3832 stl: "none",
3833 apex_available: [ "com.android.vndk.current" ],
3834 }
3835
3836 // VNDK-Ext should not cause any problems
3837
3838 cc_library {
3839 name: "libvndk.ext",
3840 srcs: ["mylib2.cpp"],
3841 vendor: true,
3842 vndk: {
3843 enabled: true,
3844 extends: "libvndk",
3845 },
3846 system_shared_libs: [],
3847 stl: "none",
3848 }
3849
3850 cc_library {
3851 name: "libvndksp.ext",
3852 srcs: ["mylib2.cpp"],
3853 vendor: true,
3854 vndk: {
3855 enabled: true,
3856 support_system_process: true,
3857 extends: "libvndksp",
3858 },
3859 system_shared_libs: [],
3860 stl: "none",
3861 }
3862 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3863 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3864 }))
3865 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3866 })
3867 }
Jooyung Han344d5432019-08-23 11:17:39 +09003868}
3869
3870func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003871 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003872 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003873 name: "com.android.vndk.current",
3874 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003875 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003876 }
3877
3878 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003879 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003880 public_key: "testkey.avbpubkey",
3881 private_key: "testkey.pem",
3882 }
3883
3884 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003885 name: "libvndk",
3886 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003887 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003888 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003889 vndk: {
3890 enabled: true,
3891 },
3892 system_shared_libs: [],
3893 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003894 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003895 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003896
3897 cc_prebuilt_library_shared {
3898 name: "libvndk.arm",
3899 srcs: ["libvndk.arm.so"],
3900 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003901 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003902 vndk: {
3903 enabled: true,
3904 },
3905 enabled: false,
3906 arch: {
3907 arm: {
3908 enabled: true,
3909 },
3910 },
3911 system_shared_libs: [],
3912 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003913 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003914 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003915 `+vndkLibrariesTxtFiles("current"),
3916 withFiles(map[string][]byte{
3917 "libvndk.so": nil,
3918 "libvndk.arm.so": nil,
3919 }))
Colin Cross2807f002021-03-02 10:15:29 -08003920 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003921 "lib/libvndk.so",
3922 "lib/libvndk.arm.so",
3923 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003924 "lib/libc++.so",
3925 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003926 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003927 })
Jooyung Han344d5432019-08-23 11:17:39 +09003928}
3929
Jooyung Han39edb6c2019-11-06 16:53:07 +09003930func vndkLibrariesTxtFiles(vers ...string) (result string) {
3931 for _, v := range vers {
3932 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003933 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003934 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003935 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003936 name: "` + txt + `.libraries.txt",
3937 }
3938 `
3939 }
3940 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003941 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003942 result += `
3943 prebuilt_etc {
3944 name: "` + txt + `.libraries.` + v + `.txt",
3945 src: "dummy.txt",
3946 }
3947 `
3948 }
3949 }
3950 }
3951 return
3952}
3953
Jooyung Han344d5432019-08-23 11:17:39 +09003954func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003955 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003956 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003957 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003958 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003959 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003960 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003961 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003962 }
3963
3964 apex_key {
3965 name: "myapex.key",
3966 public_key: "testkey.avbpubkey",
3967 private_key: "testkey.pem",
3968 }
3969
Jooyung Han31c470b2019-10-18 16:26:59 +09003970 vndk_prebuilt_shared {
3971 name: "libvndk27",
3972 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003973 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003974 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003975 vndk: {
3976 enabled: true,
3977 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003978 target_arch: "arm64",
3979 arch: {
3980 arm: {
3981 srcs: ["libvndk27_arm.so"],
3982 },
3983 arm64: {
3984 srcs: ["libvndk27_arm64.so"],
3985 },
3986 },
Colin Cross2807f002021-03-02 10:15:29 -08003987 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003988 }
3989
3990 vndk_prebuilt_shared {
3991 name: "libvndk27",
3992 version: "27",
3993 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003994 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003995 vndk: {
3996 enabled: true,
3997 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003998 target_arch: "x86_64",
3999 arch: {
4000 x86: {
4001 srcs: ["libvndk27_x86.so"],
4002 },
4003 x86_64: {
4004 srcs: ["libvndk27_x86_64.so"],
4005 },
4006 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09004007 }
4008 `+vndkLibrariesTxtFiles("27"),
4009 withFiles(map[string][]byte{
4010 "libvndk27_arm.so": nil,
4011 "libvndk27_arm64.so": nil,
4012 "libvndk27_x86.so": nil,
4013 "libvndk27_x86_64.so": nil,
4014 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004015
Colin Cross2807f002021-03-02 10:15:29 -08004016 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004017 "lib/libvndk27_arm.so",
4018 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004019 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004020 })
Jooyung Han344d5432019-08-23 11:17:39 +09004021}
4022
Jooyung Han90eee022019-10-01 20:02:42 +09004023func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004024 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004025 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004026 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09004027 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004028 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004029 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004030 }
4031 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004032 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004033 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004034 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004035 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004036 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004037 }
4038 apex_key {
4039 name: "myapex.key",
4040 public_key: "testkey.avbpubkey",
4041 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004042 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004043
4044 assertApexName := func(expected, moduleName string) {
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004045 module := ctx.ModuleForTests(moduleName, "android_common_image")
4046 apexManifestRule := module.Rule("apexManifestRule")
4047 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004048 }
4049
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004050 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004051 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004052}
4053
Jooyung Han344d5432019-08-23 11:17:39 +09004054func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004055 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004056 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004057 name: "com.android.vndk.current",
4058 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004059 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004060 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004061 }
4062
4063 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004064 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004065 public_key: "testkey.avbpubkey",
4066 private_key: "testkey.pem",
4067 }
4068
4069 cc_library {
4070 name: "libvndk",
4071 srcs: ["mylib.cpp"],
4072 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004073 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004074 native_bridge_supported: true,
4075 host_supported: true,
4076 vndk: {
4077 enabled: true,
4078 },
4079 system_shared_libs: [],
4080 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004081 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004082 }
Colin Cross2807f002021-03-02 10:15:29 -08004083 `+vndkLibrariesTxtFiles("current"),
4084 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004085
Colin Cross2807f002021-03-02 10:15:29 -08004086 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004087 "lib/libvndk.so",
4088 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004089 "lib/libc++.so",
4090 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004091 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004092 })
Jooyung Han344d5432019-08-23 11:17:39 +09004093}
4094
4095func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004096 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004097 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004098 name: "com.android.vndk.current",
4099 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004100 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004101 native_bridge_supported: true,
4102 }
4103
4104 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004105 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004106 public_key: "testkey.avbpubkey",
4107 private_key: "testkey.pem",
4108 }
4109
4110 cc_library {
4111 name: "libvndk",
4112 srcs: ["mylib.cpp"],
4113 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004114 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004115 native_bridge_supported: true,
4116 host_supported: true,
4117 vndk: {
4118 enabled: true,
4119 },
4120 system_shared_libs: [],
4121 stl: "none",
4122 }
4123 `)
4124}
4125
Jooyung Han31c470b2019-10-18 16:26:59 +09004126func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004127 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004128 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004129 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004130 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004131 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004132 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004133 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004134 }
4135
4136 apex_key {
4137 name: "myapex.key",
4138 public_key: "testkey.avbpubkey",
4139 private_key: "testkey.pem",
4140 }
4141
4142 vndk_prebuilt_shared {
4143 name: "libvndk27",
4144 version: "27",
4145 target_arch: "arm",
4146 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004147 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004148 vndk: {
4149 enabled: true,
4150 },
4151 arch: {
4152 arm: {
4153 srcs: ["libvndk27.so"],
4154 }
4155 },
4156 }
4157
4158 vndk_prebuilt_shared {
4159 name: "libvndk27",
4160 version: "27",
4161 target_arch: "arm",
4162 binder32bit: true,
4163 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004164 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004165 vndk: {
4166 enabled: true,
4167 },
4168 arch: {
4169 arm: {
4170 srcs: ["libvndk27binder32.so"],
4171 }
4172 },
Colin Cross2807f002021-03-02 10:15:29 -08004173 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004174 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004175 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004176 withFiles(map[string][]byte{
4177 "libvndk27.so": nil,
4178 "libvndk27binder32.so": nil,
4179 }),
4180 withBinder32bit,
4181 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004182 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004183 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4184 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004185 },
4186 }),
4187 )
4188
Colin Cross2807f002021-03-02 10:15:29 -08004189 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004190 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004191 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004192 })
4193}
4194
Jooyung Han45a96772020-06-15 14:59:42 +09004195func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004196 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004197 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004198 name: "com.android.vndk.current",
4199 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004200 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004201 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004202 }
4203
4204 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004205 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004206 public_key: "testkey.avbpubkey",
4207 private_key: "testkey.pem",
4208 }
4209
4210 cc_library {
4211 name: "libz",
4212 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004213 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004214 vndk: {
4215 enabled: true,
4216 },
4217 stubs: {
4218 symbol_file: "libz.map.txt",
4219 versions: ["30"],
4220 }
4221 }
4222 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4223 "libz.map.txt": nil,
4224 }))
4225
Colin Cross2807f002021-03-02 10:15:29 -08004226 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004227 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4228 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09004229 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
4230 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4231 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4232 "*/*",
4233 })
Jooyung Han45a96772020-06-15 14:59:42 +09004234}
4235
Jooyung Hane3f02812023-05-08 13:54:50 +09004236func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4237 ctx := testApex(t, "",
4238 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4239 variables.DeviceVndkVersion = proptools.StringPtr("27")
4240 }),
4241 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4242 cc.RegisterVendorSnapshotModules(ctx)
4243 }),
4244 withFiles(map[string][]byte{
4245 "vendor/foo/Android.bp": []byte(`
4246 apex {
4247 name: "myapex",
4248 binaries: ["foo"],
4249 key: "myapex.key",
4250 min_sdk_version: "27",
4251 vendor: true,
4252 }
4253
4254 cc_binary {
4255 name: "foo",
4256 vendor: true,
4257 srcs: ["abc.cpp"],
4258 shared_libs: [
4259 "libllndk",
4260 "libvndk",
4261 ],
4262 nocrt: true,
4263 system_shared_libs: [],
4264 min_sdk_version: "27",
4265 }
4266
4267 apex_key {
4268 name: "myapex.key",
4269 public_key: "testkey.avbpubkey",
4270 private_key: "testkey.pem",
4271 }
4272 `),
4273 // Simulate VNDK prebuilts with vendor_snapshot
4274 "prebuilts/vndk/Android.bp": []byte(`
4275 vndk_prebuilt_shared {
4276 name: "libllndk",
4277 version: "27",
4278 vendor_available: true,
4279 product_available: true,
4280 target_arch: "arm64",
4281 arch: {
4282 arm64: {
4283 srcs: ["libllndk.so"],
4284 },
4285 },
4286 }
4287
4288 vndk_prebuilt_shared {
4289 name: "libvndk",
4290 version: "27",
4291 vendor_available: true,
4292 product_available: true,
4293 target_arch: "arm64",
4294 arch: {
4295 arm64: {
4296 srcs: ["libvndk.so"],
4297 },
4298 },
4299 vndk: {
4300 enabled: true,
4301 },
4302 min_sdk_version: "27",
4303 }
4304
4305 vndk_prebuilt_shared {
4306 name: "libc++",
4307 version: "27",
4308 target_arch: "arm64",
4309 vendor_available: true,
4310 product_available: true,
4311 vndk: {
4312 enabled: true,
4313 support_system_process: true,
4314 },
4315 arch: {
4316 arm64: {
4317 srcs: ["libc++.so"],
4318 },
4319 },
4320 min_sdk_version: "apex_inherit",
4321 }
4322
4323 vendor_snapshot {
4324 name: "vendor_snapshot",
4325 version: "27",
4326 arch: {
4327 arm64: {
4328 vndk_libs: [
4329 "libc++",
4330 "libllndk",
4331 "libvndk",
4332 ],
4333 static_libs: [
4334 "libc++demangle",
4335 "libclang_rt.builtins",
4336 "libunwind",
4337 ],
4338 },
4339 }
4340 }
4341
4342 vendor_snapshot_static {
4343 name: "libclang_rt.builtins",
4344 version: "27",
4345 target_arch: "arm64",
4346 vendor: true,
4347 arch: {
4348 arm64: {
4349 src: "libclang_rt.builtins-aarch64-android.a",
4350 },
4351 },
4352 }
4353
4354 vendor_snapshot_static {
4355 name: "libc++demangle",
4356 version: "27",
4357 target_arch: "arm64",
4358 compile_multilib: "64",
4359 vendor: true,
4360 arch: {
4361 arm64: {
4362 src: "libc++demangle.a",
4363 },
4364 },
4365 min_sdk_version: "apex_inherit",
4366 }
4367
4368 vendor_snapshot_static {
4369 name: "libunwind",
4370 version: "27",
4371 target_arch: "arm64",
4372 compile_multilib: "64",
4373 vendor: true,
4374 arch: {
4375 arm64: {
4376 src: "libunwind.a",
4377 },
4378 },
4379 min_sdk_version: "apex_inherit",
4380 }
4381 `),
4382 }))
4383
4384 // Should embed the prebuilt VNDK libraries in the apex
4385 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4386 "bin/foo",
4387 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4388 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4389 })
4390
4391 // Should link foo with prebuilt libraries (shared/static)
4392 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4393 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4394 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4395 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4396 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4397
4398 // Should declare the LLNDK library as a "required" external dependency
4399 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4400 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4401 ensureListContains(t, requireNativeLibs, "libllndk.so")
4402}
4403
Jooyung Hane1633032019-08-01 17:41:43 +09004404func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004405 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004406 apex {
4407 name: "myapex_nodep",
4408 key: "myapex.key",
4409 native_shared_libs: ["lib_nodep"],
4410 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004411 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004412 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004413 }
4414
4415 apex {
4416 name: "myapex_dep",
4417 key: "myapex.key",
4418 native_shared_libs: ["lib_dep"],
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_provider",
4426 key: "myapex.key",
4427 native_shared_libs: ["libfoo"],
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_selfcontained",
4435 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004436 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004437 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_key {
4443 name: "myapex.key",
4444 public_key: "testkey.avbpubkey",
4445 private_key: "testkey.pem",
4446 }
4447
4448 cc_library {
4449 name: "lib_nodep",
4450 srcs: ["mylib.cpp"],
4451 system_shared_libs: [],
4452 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004453 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004454 }
4455
4456 cc_library {
4457 name: "lib_dep",
4458 srcs: ["mylib.cpp"],
4459 shared_libs: ["libfoo"],
4460 system_shared_libs: [],
4461 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004462 apex_available: [
4463 "myapex_dep",
4464 "myapex_provider",
4465 "myapex_selfcontained",
4466 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004467 }
4468
4469 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004470 name: "lib_dep_on_bar",
4471 srcs: ["mylib.cpp"],
4472 shared_libs: ["libbar"],
4473 system_shared_libs: [],
4474 stl: "none",
4475 apex_available: [
4476 "myapex_selfcontained",
4477 ],
4478 }
4479
4480
4481 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004482 name: "libfoo",
4483 srcs: ["mytest.cpp"],
4484 stubs: {
4485 versions: ["1"],
4486 },
4487 system_shared_libs: [],
4488 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004489 apex_available: [
4490 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004491 ],
4492 }
4493
4494 cc_library {
4495 name: "libbar",
4496 srcs: ["mytest.cpp"],
4497 stubs: {
4498 versions: ["1"],
4499 },
4500 system_shared_libs: [],
4501 stl: "none",
4502 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004503 "myapex_selfcontained",
4504 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004505 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004506
Jooyung Hane1633032019-08-01 17:41:43 +09004507 `)
4508
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004509 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004510 var provideNativeLibs, requireNativeLibs []string
4511
Sundong Ahnabb64432019-10-22 13:58:29 +09004512 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004513 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4514 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004515 ensureListEmpty(t, provideNativeLibs)
4516 ensureListEmpty(t, requireNativeLibs)
4517
Sundong Ahnabb64432019-10-22 13:58:29 +09004518 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004519 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4520 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004521 ensureListEmpty(t, provideNativeLibs)
4522 ensureListContains(t, requireNativeLibs, "libfoo.so")
4523
Sundong Ahnabb64432019-10-22 13:58:29 +09004524 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004525 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4526 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004527 ensureListContains(t, provideNativeLibs, "libfoo.so")
4528 ensureListEmpty(t, requireNativeLibs)
4529
Sundong Ahnabb64432019-10-22 13:58:29 +09004530 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004531 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4532 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004533 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004534 ensureListEmpty(t, requireNativeLibs)
4535}
4536
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004537func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4538 ctx := testApex(t, `
4539 apex {
4540 name: "myapex",
4541 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004542 native_shared_libs: ["mylib"],
4543 updatable: false,
4544 }
4545
4546 apex_key {
4547 name: "myapex.key",
4548 public_key: "testkey.avbpubkey",
4549 private_key: "testkey.pem",
4550 }
4551
4552 cc_library {
4553 name: "mylib",
4554 srcs: ["mylib.cpp"],
4555 system_shared_libs: [],
4556 stl: "none",
4557 apex_available: [
4558 "//apex_available:platform",
4559 "myapex",
4560 ],
4561 }
4562 `, android.FixtureMergeEnv(map[string]string{
4563 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4564 }))
4565
Jooyung Han63dff462023-02-09 00:11:27 +00004566 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004567 apexManifestRule := module.Rule("apexManifestRule")
4568 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4569}
4570
Vinh Tran8f5310f2022-10-07 18:16:47 -04004571func TestCompileMultilibProp(t *testing.T) {
4572 testCases := []struct {
4573 compileMultiLibProp string
4574 containedLibs []string
4575 notContainedLibs []string
4576 }{
4577 {
4578 containedLibs: []string{
4579 "image.apex/lib64/mylib.so",
4580 "image.apex/lib/mylib.so",
4581 },
4582 compileMultiLibProp: `compile_multilib: "both",`,
4583 },
4584 {
4585 containedLibs: []string{"image.apex/lib64/mylib.so"},
4586 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4587 compileMultiLibProp: `compile_multilib: "first",`,
4588 },
4589 {
4590 containedLibs: []string{"image.apex/lib64/mylib.so"},
4591 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4592 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4593 },
4594 {
4595 containedLibs: []string{"image.apex/lib64/mylib.so"},
4596 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4597 compileMultiLibProp: `compile_multilib: "64",`,
4598 },
4599 {
4600 containedLibs: []string{"image.apex/lib/mylib.so"},
4601 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4602 compileMultiLibProp: `compile_multilib: "32",`,
4603 },
4604 }
4605 for _, testCase := range testCases {
4606 ctx := testApex(t, fmt.Sprintf(`
4607 apex {
4608 name: "myapex",
4609 key: "myapex.key",
4610 %s
4611 native_shared_libs: ["mylib"],
4612 updatable: false,
4613 }
4614 apex_key {
4615 name: "myapex.key",
4616 public_key: "testkey.avbpubkey",
4617 private_key: "testkey.pem",
4618 }
4619 cc_library {
4620 name: "mylib",
4621 srcs: ["mylib.cpp"],
4622 apex_available: [
4623 "//apex_available:platform",
4624 "myapex",
4625 ],
4626 }
4627 `, testCase.compileMultiLibProp),
4628 )
4629 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4630 apexRule := module.Rule("apexRule")
4631 copyCmds := apexRule.Args["copy_commands"]
4632 for _, containedLib := range testCase.containedLibs {
4633 ensureContains(t, copyCmds, containedLib)
4634 }
4635 for _, notContainedLib := range testCase.notContainedLibs {
4636 ensureNotContains(t, copyCmds, notContainedLib)
4637 }
4638 }
4639}
4640
Alex Light0851b882019-02-07 13:20:53 -08004641func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004642 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004643 apex {
4644 name: "myapex",
4645 key: "myapex.key",
4646 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004647 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004648 }
4649
4650 apex_key {
4651 name: "myapex.key",
4652 public_key: "testkey.avbpubkey",
4653 private_key: "testkey.pem",
4654 }
4655
4656 cc_library {
4657 name: "mylib_common",
4658 srcs: ["mylib.cpp"],
4659 system_shared_libs: [],
4660 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004661 apex_available: [
4662 "//apex_available:platform",
4663 "myapex",
4664 ],
Alex Light0851b882019-02-07 13:20:53 -08004665 }
4666 `)
4667
Sundong Ahnabb64432019-10-22 13:58:29 +09004668 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004669 apexRule := module.Rule("apexRule")
4670 copyCmds := apexRule.Args["copy_commands"]
4671
4672 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4673 t.Log("Apex was a test apex!")
4674 t.Fail()
4675 }
4676 // Ensure that main rule creates an output
4677 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4678
4679 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004680 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004681
4682 // Ensure that both direct and indirect deps are copied into apex
4683 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4684
Colin Cross7113d202019-11-20 16:39:12 -08004685 // Ensure that the platform variant ends with _shared
4686 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004687
Colin Cross56a83212020-09-15 18:30:11 -07004688 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004689 t.Log("Found mylib_common not in any apex!")
4690 t.Fail()
4691 }
4692}
4693
4694func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004695 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004696 apex_test {
4697 name: "myapex",
4698 key: "myapex.key",
4699 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004700 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004701 }
4702
4703 apex_key {
4704 name: "myapex.key",
4705 public_key: "testkey.avbpubkey",
4706 private_key: "testkey.pem",
4707 }
4708
4709 cc_library {
4710 name: "mylib_common_test",
4711 srcs: ["mylib.cpp"],
4712 system_shared_libs: [],
4713 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004714 // TODO: remove //apex_available:platform
4715 apex_available: [
4716 "//apex_available:platform",
4717 "myapex",
4718 ],
Alex Light0851b882019-02-07 13:20:53 -08004719 }
4720 `)
4721
Sundong Ahnabb64432019-10-22 13:58:29 +09004722 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004723 apexRule := module.Rule("apexRule")
4724 copyCmds := apexRule.Args["copy_commands"]
4725
4726 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4727 t.Log("Apex was not a test apex!")
4728 t.Fail()
4729 }
4730 // Ensure that main rule creates an output
4731 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4732
4733 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004734 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004735
4736 // Ensure that both direct and indirect deps are copied into apex
4737 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4738
Colin Cross7113d202019-11-20 16:39:12 -08004739 // Ensure that the platform variant ends with _shared
4740 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004741}
4742
Alex Light9670d332019-01-29 18:07:33 -08004743func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004744 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004745 apex {
4746 name: "myapex",
4747 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004748 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004749 multilib: {
4750 first: {
4751 native_shared_libs: ["mylib_common"],
4752 }
4753 },
4754 target: {
4755 android: {
4756 multilib: {
4757 first: {
4758 native_shared_libs: ["mylib"],
4759 }
4760 }
4761 },
4762 host: {
4763 multilib: {
4764 first: {
4765 native_shared_libs: ["mylib2"],
4766 }
4767 }
4768 }
4769 }
4770 }
4771
4772 apex_key {
4773 name: "myapex.key",
4774 public_key: "testkey.avbpubkey",
4775 private_key: "testkey.pem",
4776 }
4777
4778 cc_library {
4779 name: "mylib",
4780 srcs: ["mylib.cpp"],
4781 system_shared_libs: [],
4782 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004783 // TODO: remove //apex_available:platform
4784 apex_available: [
4785 "//apex_available:platform",
4786 "myapex",
4787 ],
Alex Light9670d332019-01-29 18:07:33 -08004788 }
4789
4790 cc_library {
4791 name: "mylib_common",
4792 srcs: ["mylib.cpp"],
4793 system_shared_libs: [],
4794 stl: "none",
4795 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004796 // TODO: remove //apex_available:platform
4797 apex_available: [
4798 "//apex_available:platform",
4799 "myapex",
4800 ],
Alex Light9670d332019-01-29 18:07:33 -08004801 }
4802
4803 cc_library {
4804 name: "mylib2",
4805 srcs: ["mylib.cpp"],
4806 system_shared_libs: [],
4807 stl: "none",
4808 compile_multilib: "first",
4809 }
4810 `)
4811
Sundong Ahnabb64432019-10-22 13:58:29 +09004812 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004813 copyCmds := apexRule.Args["copy_commands"]
4814
4815 // Ensure that main rule creates an output
4816 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4817
4818 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004819 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4820 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4821 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004822
4823 // Ensure that both direct and indirect deps are copied into apex
4824 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4825 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4826 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4827
Colin Cross7113d202019-11-20 16:39:12 -08004828 // Ensure that the platform variant ends with _shared
4829 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4830 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4831 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004832}
Jiyong Park04480cf2019-02-06 00:16:29 +09004833
Jiyong Park59140302020-12-14 18:44:04 +09004834func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004835 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004836 apex {
4837 name: "myapex",
4838 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004839 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004840 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004841 arch: {
4842 arm64: {
4843 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004844 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004845 },
4846 x86_64: {
4847 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004848 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004849 },
4850 }
4851 }
4852
4853 apex_key {
4854 name: "myapex.key",
4855 public_key: "testkey.avbpubkey",
4856 private_key: "testkey.pem",
4857 }
4858
4859 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004860 name: "mylib.generic",
4861 srcs: ["mylib.cpp"],
4862 system_shared_libs: [],
4863 stl: "none",
4864 // TODO: remove //apex_available:platform
4865 apex_available: [
4866 "//apex_available:platform",
4867 "myapex",
4868 ],
4869 }
4870
4871 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004872 name: "mylib.arm64",
4873 srcs: ["mylib.cpp"],
4874 system_shared_libs: [],
4875 stl: "none",
4876 // TODO: remove //apex_available:platform
4877 apex_available: [
4878 "//apex_available:platform",
4879 "myapex",
4880 ],
4881 }
4882
4883 cc_library {
4884 name: "mylib.x64",
4885 srcs: ["mylib.cpp"],
4886 system_shared_libs: [],
4887 stl: "none",
4888 // TODO: remove //apex_available:platform
4889 apex_available: [
4890 "//apex_available:platform",
4891 "myapex",
4892 ],
4893 }
4894 `)
4895
4896 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4897 copyCmds := apexRule.Args["copy_commands"]
4898
4899 // Ensure that apex variant is created for the direct dep
4900 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004901 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004902 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4903
4904 // Ensure that both direct and indirect deps are copied into apex
4905 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4906 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4907}
4908
Jiyong Park04480cf2019-02-06 00:16:29 +09004909func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004910 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004911 apex {
4912 name: "myapex",
4913 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004914 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004915 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004916 }
4917
4918 apex_key {
4919 name: "myapex.key",
4920 public_key: "testkey.avbpubkey",
4921 private_key: "testkey.pem",
4922 }
4923
4924 sh_binary {
4925 name: "myscript",
4926 src: "mylib.cpp",
4927 filename: "myscript.sh",
4928 sub_dir: "script",
4929 }
4930 `)
4931
Sundong Ahnabb64432019-10-22 13:58:29 +09004932 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004933 copyCmds := apexRule.Args["copy_commands"]
4934
4935 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4936}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004937
Jooyung Han91df2082019-11-20 01:49:42 +09004938func TestApexInVariousPartition(t *testing.T) {
4939 testcases := []struct {
4940 propName, parition, flattenedPartition string
4941 }{
4942 {"", "system", "system_ext"},
4943 {"product_specific: true", "product", "product"},
4944 {"soc_specific: true", "vendor", "vendor"},
4945 {"proprietary: true", "vendor", "vendor"},
4946 {"vendor: true", "vendor", "vendor"},
4947 {"system_ext_specific: true", "system_ext", "system_ext"},
4948 }
4949 for _, tc := range testcases {
4950 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004951 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004952 apex {
4953 name: "myapex",
4954 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004955 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004956 `+tc.propName+`
4957 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004958
Jooyung Han91df2082019-11-20 01:49:42 +09004959 apex_key {
4960 name: "myapex.key",
4961 public_key: "testkey.avbpubkey",
4962 private_key: "testkey.pem",
4963 }
4964 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004965
Jooyung Han91df2082019-11-20 01:49:42 +09004966 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004967 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4968 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004969 if actual != expected {
4970 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4971 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004972
Jooyung Han91df2082019-11-20 01:49:42 +09004973 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004974 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4975 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004976 if actual != expected {
4977 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4978 }
4979 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004980 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004981}
Jiyong Park67882562019-03-21 01:11:21 +09004982
Jooyung Han580eb4f2020-06-24 19:33:06 +09004983func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004984 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004985 apex {
4986 name: "myapex",
4987 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004988 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004989 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004990
Jooyung Han580eb4f2020-06-24 19:33:06 +09004991 apex_key {
4992 name: "myapex.key",
4993 public_key: "testkey.avbpubkey",
4994 private_key: "testkey.pem",
4995 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004996 `)
4997 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004998 rule := module.Output("file_contexts")
4999 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
5000}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005001
Jooyung Han580eb4f2020-06-24 19:33:06 +09005002func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005003 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005004 apex {
5005 name: "myapex",
5006 key: "myapex.key",
5007 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005008 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005009 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005010
Jooyung Han580eb4f2020-06-24 19:33:06 +09005011 apex_key {
5012 name: "myapex.key",
5013 public_key: "testkey.avbpubkey",
5014 private_key: "testkey.pem",
5015 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005016 `, withFiles(map[string][]byte{
5017 "my_own_file_contexts": nil,
5018 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005019}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005020
Jooyung Han580eb4f2020-06-24 19:33:06 +09005021func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005022 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005023 apex {
5024 name: "myapex",
5025 key: "myapex.key",
5026 product_specific: true,
5027 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005028 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005029 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005030
Jooyung Han580eb4f2020-06-24 19:33:06 +09005031 apex_key {
5032 name: "myapex.key",
5033 public_key: "testkey.avbpubkey",
5034 private_key: "testkey.pem",
5035 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005036 `)
5037
Colin Cross1c460562021-02-16 17:55:47 -08005038 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005039 apex {
5040 name: "myapex",
5041 key: "myapex.key",
5042 product_specific: true,
5043 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005044 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005045 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005046
Jooyung Han580eb4f2020-06-24 19:33:06 +09005047 apex_key {
5048 name: "myapex.key",
5049 public_key: "testkey.avbpubkey",
5050 private_key: "testkey.pem",
5051 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005052 `, withFiles(map[string][]byte{
5053 "product_specific_file_contexts": nil,
5054 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005055 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5056 rule := module.Output("file_contexts")
5057 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5058}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005059
Jooyung Han580eb4f2020-06-24 19:33:06 +09005060func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005061 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005062 apex {
5063 name: "myapex",
5064 key: "myapex.key",
5065 product_specific: true,
5066 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005067 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005068 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005069
Jooyung Han580eb4f2020-06-24 19:33:06 +09005070 apex_key {
5071 name: "myapex.key",
5072 public_key: "testkey.avbpubkey",
5073 private_key: "testkey.pem",
5074 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005075
Jooyung Han580eb4f2020-06-24 19:33:06 +09005076 filegroup {
5077 name: "my-file-contexts",
5078 srcs: ["product_specific_file_contexts"],
5079 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005080 `, withFiles(map[string][]byte{
5081 "product_specific_file_contexts": nil,
5082 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005083 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5084 rule := module.Output("file_contexts")
5085 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005086}
5087
Jiyong Park67882562019-03-21 01:11:21 +09005088func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005089 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005090 apex_key {
5091 name: "myapex.key",
5092 public_key: ":my.avbpubkey",
5093 private_key: ":my.pem",
5094 product_specific: true,
5095 }
5096
5097 filegroup {
5098 name: "my.avbpubkey",
5099 srcs: ["testkey2.avbpubkey"],
5100 }
5101
5102 filegroup {
5103 name: "my.pem",
5104 srcs: ["testkey2.pem"],
5105 }
5106 `)
5107
5108 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5109 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005110 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005111 if actual_pubkey != expected_pubkey {
5112 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5113 }
5114 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005115 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005116 if actual_privkey != expected_privkey {
5117 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5118 }
5119}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005120
5121func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005122 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005123 prebuilt_apex {
5124 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005125 arch: {
5126 arm64: {
5127 src: "myapex-arm64.apex",
5128 },
5129 arm: {
5130 src: "myapex-arm.apex",
5131 },
5132 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005133 }
5134 `)
5135
Wei Li340ee8e2022-03-18 17:33:24 -07005136 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5137 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005138
Jiyong Parkc95714e2019-03-29 14:23:10 +09005139 expectedInput := "myapex-arm64.apex"
5140 if prebuilt.inputApex.String() != expectedInput {
5141 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5142 }
Wei Li340ee8e2022-03-18 17:33:24 -07005143 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5144 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5145 rule := testingModule.Rule("genProvenanceMetaData")
5146 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5147 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5148 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5149 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005150
5151 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5152 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005153}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005154
Paul Duffinc0609c62021-03-01 17:27:16 +00005155func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005156 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005157 prebuilt_apex {
5158 name: "myapex",
5159 }
5160 `)
5161}
5162
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005163func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005164 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005165 prebuilt_apex {
5166 name: "myapex",
5167 src: "myapex-arm.apex",
5168 filename: "notmyapex.apex",
5169 }
5170 `)
5171
Wei Li340ee8e2022-03-18 17:33:24 -07005172 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5173 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005174
5175 expected := "notmyapex.apex"
5176 if p.installFilename != expected {
5177 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5178 }
Wei Li340ee8e2022-03-18 17:33:24 -07005179 rule := testingModule.Rule("genProvenanceMetaData")
5180 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5181 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5182 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5183 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005184}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005185
Samiul Islam7c02e262021-09-08 17:48:28 +01005186func TestApexSetFilenameOverride(t *testing.T) {
5187 testApex(t, `
5188 apex_set {
5189 name: "com.company.android.myapex",
5190 apex_name: "com.android.myapex",
5191 set: "company-myapex.apks",
5192 filename: "com.company.android.myapex.apex"
5193 }
5194 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5195
5196 testApex(t, `
5197 apex_set {
5198 name: "com.company.android.myapex",
5199 apex_name: "com.android.myapex",
5200 set: "company-myapex.apks",
5201 filename: "com.company.android.myapex.capex"
5202 }
5203 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5204
5205 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5206 apex_set {
5207 name: "com.company.android.myapex",
5208 apex_name: "com.android.myapex",
5209 set: "company-myapex.apks",
5210 filename: "some-random-suffix"
5211 }
5212 `)
5213}
5214
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005215func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005216 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005217 prebuilt_apex {
5218 name: "myapex.prebuilt",
5219 src: "myapex-arm.apex",
5220 overrides: [
5221 "myapex",
5222 ],
5223 }
5224 `)
5225
Wei Li340ee8e2022-03-18 17:33:24 -07005226 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5227 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005228
5229 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005230 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005231 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005232 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005233 }
Wei Li340ee8e2022-03-18 17:33:24 -07005234 rule := testingModule.Rule("genProvenanceMetaData")
5235 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5236 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5237 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5238 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005239}
5240
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005241func TestPrebuiltApexName(t *testing.T) {
5242 testApex(t, `
5243 prebuilt_apex {
5244 name: "com.company.android.myapex",
5245 apex_name: "com.android.myapex",
5246 src: "company-myapex-arm.apex",
5247 }
5248 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5249
5250 testApex(t, `
5251 apex_set {
5252 name: "com.company.android.myapex",
5253 apex_name: "com.android.myapex",
5254 set: "company-myapex.apks",
5255 }
5256 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5257}
5258
5259func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5260 _ = android.GroupFixturePreparers(
5261 java.PrepareForTestWithJavaDefaultModules,
5262 PrepareForTestWithApexBuildComponents,
5263 android.FixtureWithRootAndroidBp(`
5264 platform_bootclasspath {
5265 name: "platform-bootclasspath",
5266 fragments: [
5267 {
5268 apex: "com.android.art",
5269 module: "art-bootclasspath-fragment",
5270 },
5271 ],
5272 }
5273
5274 prebuilt_apex {
5275 name: "com.company.android.art",
5276 apex_name: "com.android.art",
5277 src: "com.company.android.art-arm.apex",
5278 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5279 }
5280
5281 prebuilt_bootclasspath_fragment {
5282 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005283 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005284 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005285 hidden_api: {
5286 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5287 metadata: "my-bootclasspath-fragment/metadata.csv",
5288 index: "my-bootclasspath-fragment/index.csv",
5289 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5290 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5291 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005292 }
5293
5294 java_import {
5295 name: "core-oj",
5296 jars: ["prebuilt.jar"],
5297 }
5298 `),
5299 ).RunTest(t)
5300}
5301
Paul Duffin092153d2021-01-26 11:42:39 +00005302// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5303// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005304func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005305 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005306
Paul Duffin89886cb2021-02-05 16:44:03 +00005307 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005308 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005309 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005310 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005311 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005312 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005313 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5314 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5315 android.NormalizePathForTesting(dexJarBuildPath))
5316 }
5317
5318 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005319 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005320 // Make sure the import has been given the correct path to the dex jar.
5321 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5322 dexJarBuildPath := p.DexJarInstallPath()
5323 stem := android.RemoveOptionalPrebuiltPrefix(name)
5324 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5325 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5326 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005327 }
5328
Paul Duffin39853512021-02-26 11:09:39 +00005329 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005330 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005331 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005332 android.AssertArrayString(t, "Check if there is no source variant",
5333 []string{"android_common"},
5334 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005335 }
5336
5337 t.Run("prebuilt only", func(t *testing.T) {
5338 bp := `
5339 prebuilt_apex {
5340 name: "myapex",
5341 arch: {
5342 arm64: {
5343 src: "myapex-arm64.apex",
5344 },
5345 arm: {
5346 src: "myapex-arm.apex",
5347 },
5348 },
Paul Duffin39853512021-02-26 11:09:39 +00005349 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005350 }
5351
5352 java_import {
5353 name: "libfoo",
5354 jars: ["libfoo.jar"],
5355 }
Paul Duffin39853512021-02-26 11:09:39 +00005356
5357 java_sdk_library_import {
5358 name: "libbar",
5359 public: {
5360 jars: ["libbar.jar"],
5361 },
5362 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005363 `
5364
5365 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5366 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5367
Martin Stjernholm44825602021-09-17 01:44:12 +01005368 deapexerName := deapexerModuleName("myapex")
5369 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5370
Paul Duffinf6932af2021-02-26 18:21:56 +00005371 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005372 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005373 rule := deapexer.Rule("deapexer")
5374 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5375 t.Errorf("expected: %q, found: %q", expected, actual)
5376 }
5377
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005378 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005379 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005380 rule = prebuiltApex.Rule("android/soong/android.Cp")
5381 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5382 t.Errorf("expected: %q, found: %q", expected, actual)
5383 }
5384
Paul Duffin89886cb2021-02-05 16:44:03 +00005385 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005386 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005387
5388 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005389 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005390 })
5391
5392 t.Run("prebuilt with source preferred", func(t *testing.T) {
5393
5394 bp := `
5395 prebuilt_apex {
5396 name: "myapex",
5397 arch: {
5398 arm64: {
5399 src: "myapex-arm64.apex",
5400 },
5401 arm: {
5402 src: "myapex-arm.apex",
5403 },
5404 },
Paul Duffin39853512021-02-26 11:09:39 +00005405 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005406 }
5407
5408 java_import {
5409 name: "libfoo",
5410 jars: ["libfoo.jar"],
5411 }
5412
5413 java_library {
5414 name: "libfoo",
5415 }
Paul Duffin39853512021-02-26 11:09:39 +00005416
5417 java_sdk_library_import {
5418 name: "libbar",
5419 public: {
5420 jars: ["libbar.jar"],
5421 },
5422 }
5423
5424 java_sdk_library {
5425 name: "libbar",
5426 srcs: ["foo/bar/MyClass.java"],
5427 unsafe_ignore_missing_latest_api: true,
5428 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005429 `
5430
5431 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5432 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5433
Paul Duffin89886cb2021-02-05 16:44:03 +00005434 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005435 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005436 ensureNoSourceVariant(t, ctx, "libfoo")
5437
5438 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005439 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005440 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005441 })
5442
5443 t.Run("prebuilt preferred with source", func(t *testing.T) {
5444 bp := `
5445 prebuilt_apex {
5446 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005447 arch: {
5448 arm64: {
5449 src: "myapex-arm64.apex",
5450 },
5451 arm: {
5452 src: "myapex-arm.apex",
5453 },
5454 },
Paul Duffin39853512021-02-26 11:09:39 +00005455 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005456 }
5457
5458 java_import {
5459 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005460 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005461 jars: ["libfoo.jar"],
5462 }
5463
5464 java_library {
5465 name: "libfoo",
5466 }
Paul Duffin39853512021-02-26 11:09:39 +00005467
5468 java_sdk_library_import {
5469 name: "libbar",
5470 prefer: true,
5471 public: {
5472 jars: ["libbar.jar"],
5473 },
5474 }
5475
5476 java_sdk_library {
5477 name: "libbar",
5478 srcs: ["foo/bar/MyClass.java"],
5479 unsafe_ignore_missing_latest_api: true,
5480 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005481 `
5482
5483 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5484 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5485
Paul Duffin89886cb2021-02-05 16:44:03 +00005486 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005487 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005488 ensureNoSourceVariant(t, ctx, "libfoo")
5489
5490 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005491 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005492 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005493 })
5494}
5495
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005496func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005497 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005498 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005499 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5500 // is disabled.
5501 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5502 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005503
Paul Duffin37856732021-02-26 14:24:15 +00005504 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5505 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005506 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005507 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005508 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005509 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005510 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005511 foundLibfooJar = true
5512 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005513 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005514 }
5515 }
5516 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005517 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 +00005518 }
5519 }
5520
Paul Duffin40a3f652021-07-19 13:11:24 +01005521 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005522 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005523 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005524 var rule android.TestingBuildParams
5525
5526 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5527 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005528 }
5529
Paul Duffin40a3f652021-07-19 13:11:24 +01005530 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5531 t.Helper()
5532 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5533 var rule android.TestingBuildParams
5534
5535 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5536 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5537 }
5538
Paul Duffin89f570a2021-06-16 01:42:33 +01005539 fragment := java.ApexVariantReference{
5540 Apex: proptools.StringPtr("myapex"),
5541 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5542 }
5543
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005544 t.Run("prebuilt only", func(t *testing.T) {
5545 bp := `
5546 prebuilt_apex {
5547 name: "myapex",
5548 arch: {
5549 arm64: {
5550 src: "myapex-arm64.apex",
5551 },
5552 arm: {
5553 src: "myapex-arm.apex",
5554 },
5555 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005556 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5557 }
5558
5559 prebuilt_bootclasspath_fragment {
5560 name: "my-bootclasspath-fragment",
5561 contents: ["libfoo", "libbar"],
5562 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005563 hidden_api: {
5564 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5565 metadata: "my-bootclasspath-fragment/metadata.csv",
5566 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005567 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5568 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5569 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005570 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005571 }
5572
5573 java_import {
5574 name: "libfoo",
5575 jars: ["libfoo.jar"],
5576 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005577 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005578 }
Paul Duffin37856732021-02-26 14:24:15 +00005579
5580 java_sdk_library_import {
5581 name: "libbar",
5582 public: {
5583 jars: ["libbar.jar"],
5584 },
5585 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005586 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005587 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005588 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005589 `
5590
Paul Duffin89f570a2021-06-16 01:42:33 +01005591 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005592 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5593 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005594
Paul Duffin537ea3d2021-05-14 10:38:00 +01005595 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005596 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005597 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005598 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005599 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5600 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005601 })
5602
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005603 t.Run("apex_set only", func(t *testing.T) {
5604 bp := `
5605 apex_set {
5606 name: "myapex",
5607 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005608 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005609 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005610 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5611 }
5612
5613 java_import {
5614 name: "myjavalib",
5615 jars: ["myjavalib.jar"],
5616 apex_available: ["myapex"],
5617 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005618 }
5619
5620 prebuilt_bootclasspath_fragment {
5621 name: "my-bootclasspath-fragment",
5622 contents: ["libfoo", "libbar"],
5623 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005624 hidden_api: {
5625 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5626 metadata: "my-bootclasspath-fragment/metadata.csv",
5627 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005628 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5629 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5630 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005631 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005632 }
5633
Liz Kammer2dc72442023-04-20 10:10:48 -04005634 prebuilt_systemserverclasspath_fragment {
5635 name: "my-systemserverclasspath-fragment",
5636 contents: ["libbaz"],
5637 apex_available: ["myapex"],
5638 }
5639
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005640 java_import {
5641 name: "libfoo",
5642 jars: ["libfoo.jar"],
5643 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005644 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005645 }
5646
5647 java_sdk_library_import {
5648 name: "libbar",
5649 public: {
5650 jars: ["libbar.jar"],
5651 },
5652 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005653 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005654 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005655 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005656
5657 java_sdk_library_import {
5658 name: "libbaz",
5659 public: {
5660 jars: ["libbaz.jar"],
5661 },
5662 apex_available: ["myapex"],
5663 shared_library: false,
5664 permitted_packages: ["baz"],
5665 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005666 `
5667
Paul Duffin89f570a2021-06-16 01:42:33 +01005668 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005669 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5670 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5671
Paul Duffin537ea3d2021-05-14 10:38:00 +01005672 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005673 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005674 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005675 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005676 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5677 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005678
5679 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5680
5681 overrideNames := []string{
5682 "",
5683 "myjavalib.myapex",
5684 "libfoo.myapex",
5685 "libbar.myapex",
5686 "libbaz.myapex",
5687 }
5688 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5689 for i, e := range mkEntries {
5690 g := e.OverrideName
5691 if w := overrideNames[i]; w != g {
5692 t.Errorf("Expected override name %q, got %q", w, g)
5693 }
5694 }
5695
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005696 })
5697
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005698 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5699 bp := `
5700 prebuilt_apex {
5701 name: "myapex",
5702 arch: {
5703 arm64: {
5704 src: "myapex-arm64.apex",
5705 },
5706 arm: {
5707 src: "myapex-arm.apex",
5708 },
5709 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005710 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5711 }
5712
5713 prebuilt_bootclasspath_fragment {
5714 name: "my-bootclasspath-fragment",
5715 contents: ["libfoo", "libbar"],
5716 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005717 hidden_api: {
5718 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5719 metadata: "my-bootclasspath-fragment/metadata.csv",
5720 index: "my-bootclasspath-fragment/index.csv",
5721 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5722 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5723 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005724 }
5725
5726 java_import {
5727 name: "libfoo",
5728 jars: ["libfoo.jar"],
5729 apex_available: ["myapex"],
5730 }
5731
5732 java_library {
5733 name: "libfoo",
5734 srcs: ["foo/bar/MyClass.java"],
5735 apex_available: ["myapex"],
5736 }
Paul Duffin37856732021-02-26 14:24:15 +00005737
5738 java_sdk_library_import {
5739 name: "libbar",
5740 public: {
5741 jars: ["libbar.jar"],
5742 },
5743 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005744 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005745 }
5746
5747 java_sdk_library {
5748 name: "libbar",
5749 srcs: ["foo/bar/MyClass.java"],
5750 unsafe_ignore_missing_latest_api: true,
5751 apex_available: ["myapex"],
5752 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005753 `
5754
5755 // In this test the source (java_library) libfoo is active since the
5756 // prebuilt (java_import) defaults to prefer:false. However the
5757 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5758 // find the dex boot jar in it. We either need to disable the source libfoo
5759 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005760 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005761 // dexbootjar check is skipped if AllowMissingDependencies is true
5762 preparerAllowMissingDeps := android.GroupFixturePreparers(
5763 preparer,
5764 android.PrepareForTestWithAllowMissingDependencies,
5765 )
5766 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005767 })
5768
5769 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5770 bp := `
5771 prebuilt_apex {
5772 name: "myapex",
5773 arch: {
5774 arm64: {
5775 src: "myapex-arm64.apex",
5776 },
5777 arm: {
5778 src: "myapex-arm.apex",
5779 },
5780 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005781 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5782 }
5783
5784 prebuilt_bootclasspath_fragment {
5785 name: "my-bootclasspath-fragment",
5786 contents: ["libfoo", "libbar"],
5787 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005788 hidden_api: {
5789 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5790 metadata: "my-bootclasspath-fragment/metadata.csv",
5791 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005792 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5793 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5794 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005795 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005796 }
5797
5798 java_import {
5799 name: "libfoo",
5800 prefer: true,
5801 jars: ["libfoo.jar"],
5802 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005803 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005804 }
5805
5806 java_library {
5807 name: "libfoo",
5808 srcs: ["foo/bar/MyClass.java"],
5809 apex_available: ["myapex"],
5810 }
Paul Duffin37856732021-02-26 14:24:15 +00005811
5812 java_sdk_library_import {
5813 name: "libbar",
5814 prefer: true,
5815 public: {
5816 jars: ["libbar.jar"],
5817 },
5818 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005819 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005820 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005821 }
5822
5823 java_sdk_library {
5824 name: "libbar",
5825 srcs: ["foo/bar/MyClass.java"],
5826 unsafe_ignore_missing_latest_api: true,
5827 apex_available: ["myapex"],
5828 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005829 `
5830
Paul Duffin89f570a2021-06-16 01:42:33 +01005831 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005832 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5833 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005834
Paul Duffin537ea3d2021-05-14 10:38:00 +01005835 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005836 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005837 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005838 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005839 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5840 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005841 })
5842
5843 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5844 bp := `
5845 apex {
5846 name: "myapex",
5847 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005848 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005849 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005850 }
5851
5852 apex_key {
5853 name: "myapex.key",
5854 public_key: "testkey.avbpubkey",
5855 private_key: "testkey.pem",
5856 }
5857
5858 prebuilt_apex {
5859 name: "myapex",
5860 arch: {
5861 arm64: {
5862 src: "myapex-arm64.apex",
5863 },
5864 arm: {
5865 src: "myapex-arm.apex",
5866 },
5867 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005868 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5869 }
5870
5871 prebuilt_bootclasspath_fragment {
5872 name: "my-bootclasspath-fragment",
5873 contents: ["libfoo", "libbar"],
5874 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005875 hidden_api: {
5876 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5877 metadata: "my-bootclasspath-fragment/metadata.csv",
5878 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005879 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5880 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5881 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005882 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005883 }
5884
5885 java_import {
5886 name: "libfoo",
5887 jars: ["libfoo.jar"],
5888 apex_available: ["myapex"],
5889 }
5890
5891 java_library {
5892 name: "libfoo",
5893 srcs: ["foo/bar/MyClass.java"],
5894 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005895 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005896 }
Paul Duffin37856732021-02-26 14:24:15 +00005897
5898 java_sdk_library_import {
5899 name: "libbar",
5900 public: {
5901 jars: ["libbar.jar"],
5902 },
5903 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005904 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005905 }
5906
5907 java_sdk_library {
5908 name: "libbar",
5909 srcs: ["foo/bar/MyClass.java"],
5910 unsafe_ignore_missing_latest_api: true,
5911 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005912 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005913 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005914 `
5915
Paul Duffin89f570a2021-06-16 01:42:33 +01005916 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005917 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5918 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005919
Paul Duffin537ea3d2021-05-14 10:38:00 +01005920 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005921 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005922 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005923 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005924 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5925 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005926 })
5927
5928 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5929 bp := `
5930 apex {
5931 name: "myapex",
5932 enabled: false,
5933 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005934 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005935 }
5936
5937 apex_key {
5938 name: "myapex.key",
5939 public_key: "testkey.avbpubkey",
5940 private_key: "testkey.pem",
5941 }
5942
5943 prebuilt_apex {
5944 name: "myapex",
5945 arch: {
5946 arm64: {
5947 src: "myapex-arm64.apex",
5948 },
5949 arm: {
5950 src: "myapex-arm.apex",
5951 },
5952 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005953 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5954 }
5955
5956 prebuilt_bootclasspath_fragment {
5957 name: "my-bootclasspath-fragment",
5958 contents: ["libfoo", "libbar"],
5959 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005960 hidden_api: {
5961 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5962 metadata: "my-bootclasspath-fragment/metadata.csv",
5963 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005964 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5965 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5966 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005967 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005968 }
5969
5970 java_import {
5971 name: "libfoo",
5972 prefer: true,
5973 jars: ["libfoo.jar"],
5974 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005975 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005976 }
5977
5978 java_library {
5979 name: "libfoo",
5980 srcs: ["foo/bar/MyClass.java"],
5981 apex_available: ["myapex"],
5982 }
Paul Duffin37856732021-02-26 14:24:15 +00005983
5984 java_sdk_library_import {
5985 name: "libbar",
5986 prefer: true,
5987 public: {
5988 jars: ["libbar.jar"],
5989 },
5990 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005991 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005992 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005993 }
5994
5995 java_sdk_library {
5996 name: "libbar",
5997 srcs: ["foo/bar/MyClass.java"],
5998 unsafe_ignore_missing_latest_api: true,
5999 apex_available: ["myapex"],
6000 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006001 `
6002
Paul Duffin89f570a2021-06-16 01:42:33 +01006003 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01006004 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6005 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006006
Paul Duffin537ea3d2021-05-14 10:38:00 +01006007 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006008 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006009 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006010 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006011 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
6012 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006013 })
6014}
6015
Roland Levillain630846d2019-06-26 12:48:34 +01006016func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006017 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006018 apex_test {
6019 name: "myapex",
6020 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006021 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006022 tests: [
6023 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006024 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006025 ],
6026 }
6027
6028 apex_key {
6029 name: "myapex.key",
6030 public_key: "testkey.avbpubkey",
6031 private_key: "testkey.pem",
6032 }
6033
Liz Kammer1c14a212020-05-12 15:26:55 -07006034 filegroup {
6035 name: "fg",
6036 srcs: [
6037 "baz",
6038 "bar/baz"
6039 ],
6040 }
6041
Roland Levillain630846d2019-06-26 12:48:34 +01006042 cc_test {
6043 name: "mytest",
6044 gtest: false,
6045 srcs: ["mytest.cpp"],
6046 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006047 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006048 system_shared_libs: [],
6049 static_executable: true,
6050 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006051 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006052 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006053
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006054 cc_library {
6055 name: "mylib",
6056 srcs: ["mylib.cpp"],
6057 system_shared_libs: [],
6058 stl: "none",
6059 }
6060
Liz Kammer5bd365f2020-05-27 15:15:11 -07006061 filegroup {
6062 name: "fg2",
6063 srcs: [
6064 "testdata/baz"
6065 ],
6066 }
6067
Roland Levillain9b5fde92019-06-28 15:41:19 +01006068 cc_test {
6069 name: "mytests",
6070 gtest: false,
6071 srcs: [
6072 "mytest1.cpp",
6073 "mytest2.cpp",
6074 "mytest3.cpp",
6075 ],
6076 test_per_src: true,
6077 relative_install_path: "test",
6078 system_shared_libs: [],
6079 static_executable: true,
6080 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006081 data: [
6082 ":fg",
6083 ":fg2",
6084 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006085 }
Roland Levillain630846d2019-06-26 12:48:34 +01006086 `)
6087
Sundong Ahnabb64432019-10-22 13:58:29 +09006088 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006089 copyCmds := apexRule.Args["copy_commands"]
6090
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006091 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006092 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006093 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006094
Liz Kammer1c14a212020-05-12 15:26:55 -07006095 //Ensure that test data are copied into apex.
6096 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6097 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6098
Roland Levillain9b5fde92019-06-28 15:41:19 +01006099 // Ensure that test deps built with `test_per_src` are copied into apex.
6100 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6101 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6102 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006103
6104 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07006105 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006106 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006107 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006108 prefix := "TARGET_"
6109 var builder strings.Builder
6110 data.Custom(&builder, name, prefix, "", data)
6111 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006112 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6113 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6114 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6115 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
6116 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
6117 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006118 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07006119
6120 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006121 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006122 data.Custom(&builder, name, prefix, "", data)
6123 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07006124 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
6125 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006126}
6127
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006128func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006129 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006130 apex {
6131 name: "myapex",
6132 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006133 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006134 }
6135 apex_key {
6136 name: "myapex.key",
6137 public_key: "testkey.avbpubkey",
6138 private_key: "testkey.pem",
6139 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00006140 `,
6141 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6142 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
6143 }),
6144 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006145 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00006146 ensureListContains(t, ab.makeModulesToInstall, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07006147 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006148 var builder strings.Builder
6149 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
6150 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006151 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex myapex.flattened\n")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09006152}
6153
Jooyung Hand48f3c32019-08-23 11:18:57 +09006154func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6155 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6156 apex {
6157 name: "myapex",
6158 key: "myapex.key",
6159 native_shared_libs: ["libfoo"],
6160 }
6161
6162 apex_key {
6163 name: "myapex.key",
6164 public_key: "testkey.avbpubkey",
6165 private_key: "testkey.pem",
6166 }
6167
6168 cc_library {
6169 name: "libfoo",
6170 stl: "none",
6171 system_shared_libs: [],
6172 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006173 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006174 }
6175 `)
6176 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6177 apex {
6178 name: "myapex",
6179 key: "myapex.key",
6180 java_libs: ["myjar"],
6181 }
6182
6183 apex_key {
6184 name: "myapex.key",
6185 public_key: "testkey.avbpubkey",
6186 private_key: "testkey.pem",
6187 }
6188
6189 java_library {
6190 name: "myjar",
6191 srcs: ["foo/bar/MyClass.java"],
6192 sdk_version: "none",
6193 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006194 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006195 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006196 }
6197 `)
6198}
6199
Bill Peckhama41a6962021-01-11 10:58:54 -08006200func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006201 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006202 apex {
6203 name: "myapex",
6204 key: "myapex.key",
6205 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006206 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006207 }
6208
6209 apex_key {
6210 name: "myapex.key",
6211 public_key: "testkey.avbpubkey",
6212 private_key: "testkey.pem",
6213 }
6214
6215 java_import {
6216 name: "myjavaimport",
6217 apex_available: ["myapex"],
6218 jars: ["my.jar"],
6219 compile_dex: true,
6220 }
6221 `)
6222
6223 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6224 apexRule := module.Rule("apexRule")
6225 copyCmds := apexRule.Args["copy_commands"]
6226 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6227}
6228
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006229func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006230 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006231 apex {
6232 name: "myapex",
6233 key: "myapex.key",
6234 apps: [
6235 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006236 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006237 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006238 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006239 }
6240
6241 apex_key {
6242 name: "myapex.key",
6243 public_key: "testkey.avbpubkey",
6244 private_key: "testkey.pem",
6245 }
6246
6247 android_app {
6248 name: "AppFoo",
6249 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006250 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006251 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006252 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006253 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006254 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006255 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006256
6257 android_app {
6258 name: "AppFooPriv",
6259 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006260 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006261 system_modules: "none",
6262 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006263 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006264 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006265 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006266 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006267
6268 cc_library_shared {
6269 name: "libjni",
6270 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006271 shared_libs: ["libfoo"],
6272 stl: "none",
6273 system_shared_libs: [],
6274 apex_available: [ "myapex" ],
6275 sdk_version: "current",
6276 }
6277
6278 cc_library_shared {
6279 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006280 stl: "none",
6281 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006282 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006283 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006284 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006285 `)
6286
Sundong Ahnabb64432019-10-22 13:58:29 +09006287 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006288 apexRule := module.Rule("apexRule")
6289 copyCmds := apexRule.Args["copy_commands"]
6290
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006291 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6292 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006293 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006294
Colin Crossaede88c2020-08-11 12:17:01 -07006295 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006296 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006297 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006298 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006299 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006300 // JNI libraries including transitive deps are
6301 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006302 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006303 // ... embedded inside APK (jnilibs.zip)
6304 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6305 // ... and not directly inside the APEX
6306 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6307 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006308
6309 apexBundle := module.Module().(*apexBundle)
6310 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6311 var builder strings.Builder
6312 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6313 androidMk := builder.String()
6314 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6315 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6316 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6317 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6318 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6319 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 +01006320}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006321
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006322func TestApexWithAppImportBuildId(t *testing.T) {
6323 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6324 for _, id := range invalidBuildIds {
6325 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6326 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6327 variables.BuildId = proptools.StringPtr(id)
6328 })
6329 testApexError(t, message, `apex {
6330 name: "myapex",
6331 key: "myapex.key",
6332 apps: ["AppFooPrebuilt"],
6333 updatable: false,
6334 }
6335
6336 apex_key {
6337 name: "myapex.key",
6338 public_key: "testkey.avbpubkey",
6339 private_key: "testkey.pem",
6340 }
6341
6342 android_app_import {
6343 name: "AppFooPrebuilt",
6344 apk: "PrebuiltAppFoo.apk",
6345 presigned: true,
6346 apex_available: ["myapex"],
6347 }
6348 `, fixture)
6349 }
6350}
6351
Dario Frenicde2a032019-10-27 00:29:22 +01006352func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006353 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006354 apex {
6355 name: "myapex",
6356 key: "myapex.key",
6357 apps: [
6358 "AppFooPrebuilt",
6359 "AppFooPrivPrebuilt",
6360 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006361 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006362 }
6363
6364 apex_key {
6365 name: "myapex.key",
6366 public_key: "testkey.avbpubkey",
6367 private_key: "testkey.pem",
6368 }
6369
6370 android_app_import {
6371 name: "AppFooPrebuilt",
6372 apk: "PrebuiltAppFoo.apk",
6373 presigned: true,
6374 dex_preopt: {
6375 enabled: false,
6376 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006377 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006378 }
6379
6380 android_app_import {
6381 name: "AppFooPrivPrebuilt",
6382 apk: "PrebuiltAppFooPriv.apk",
6383 privileged: true,
6384 presigned: true,
6385 dex_preopt: {
6386 enabled: false,
6387 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006388 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006389 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006390 }
6391 `)
6392
Sundong Ahnabb64432019-10-22 13:58:29 +09006393 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01006394 apexRule := module.Rule("apexRule")
6395 copyCmds := apexRule.Args["copy_commands"]
6396
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006397 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6398 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006399}
6400
6401func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006402 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006403 apex {
6404 name: "myapex",
6405 key: "myapex.key",
6406 apps: [
6407 "AppFoo",
6408 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006409 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006410 }
6411
6412 apex_key {
6413 name: "myapex.key",
6414 public_key: "testkey.avbpubkey",
6415 private_key: "testkey.pem",
6416 }
6417
6418 android_app {
6419 name: "AppFoo",
6420 srcs: ["foo/bar/MyClass.java"],
6421 sdk_version: "none",
6422 system_modules: "none",
6423 apex_available: [ "myapex" ],
6424 }
6425
6426 android_app_import {
6427 name: "AppFoo",
6428 apk: "AppFooPrebuilt.apk",
6429 filename: "AppFooPrebuilt.apk",
6430 presigned: true,
6431 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006432 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006433 }
6434 `, withFiles(map[string][]byte{
6435 "AppFooPrebuilt.apk": nil,
6436 }))
6437
6438 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006439 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006440 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006441}
6442
Dario Freni6f3937c2019-12-20 22:58:03 +00006443func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006444 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006445 apex {
6446 name: "myapex",
6447 key: "myapex.key",
6448 apps: [
6449 "TesterHelpAppFoo",
6450 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006451 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006452 }
6453
6454 apex_key {
6455 name: "myapex.key",
6456 public_key: "testkey.avbpubkey",
6457 private_key: "testkey.pem",
6458 }
6459
6460 android_test_helper_app {
6461 name: "TesterHelpAppFoo",
6462 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006463 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006464 }
6465
6466 `)
6467
6468 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6469 apexRule := module.Rule("apexRule")
6470 copyCmds := apexRule.Args["copy_commands"]
6471
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006472 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006473}
6474
Jooyung Han18020ea2019-11-13 10:50:48 +09006475func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6476 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006477 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006478 apex {
6479 name: "myapex",
6480 key: "myapex.key",
6481 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006482 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006483 }
6484
6485 apex_key {
6486 name: "myapex.key",
6487 public_key: "testkey.avbpubkey",
6488 private_key: "testkey.pem",
6489 }
6490
6491 apex {
6492 name: "otherapex",
6493 key: "myapex.key",
6494 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006495 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006496 }
6497
6498 cc_defaults {
6499 name: "libfoo-defaults",
6500 apex_available: ["otherapex"],
6501 }
6502
6503 cc_library {
6504 name: "libfoo",
6505 defaults: ["libfoo-defaults"],
6506 stl: "none",
6507 system_shared_libs: [],
6508 }`)
6509}
6510
Paul Duffine52e66f2020-03-30 17:54:29 +01006511func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006512 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006513 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006514 apex {
6515 name: "myapex",
6516 key: "myapex.key",
6517 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006518 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006519 }
6520
6521 apex_key {
6522 name: "myapex.key",
6523 public_key: "testkey.avbpubkey",
6524 private_key: "testkey.pem",
6525 }
6526
6527 apex {
6528 name: "otherapex",
6529 key: "otherapex.key",
6530 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006531 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006532 }
6533
6534 apex_key {
6535 name: "otherapex.key",
6536 public_key: "testkey.avbpubkey",
6537 private_key: "testkey.pem",
6538 }
6539
6540 cc_library {
6541 name: "libfoo",
6542 stl: "none",
6543 system_shared_libs: [],
6544 apex_available: ["otherapex"],
6545 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006546}
Jiyong Park127b40b2019-09-30 16:04:35 +09006547
Paul Duffine52e66f2020-03-30 17:54:29 +01006548func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006549 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006550 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006551.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006552.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006553.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006554.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006555.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006556.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006557 apex {
6558 name: "myapex",
6559 key: "myapex.key",
6560 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006561 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006562 }
6563
6564 apex_key {
6565 name: "myapex.key",
6566 public_key: "testkey.avbpubkey",
6567 private_key: "testkey.pem",
6568 }
6569
Jiyong Park127b40b2019-09-30 16:04:35 +09006570 cc_library {
6571 name: "libfoo",
6572 stl: "none",
6573 shared_libs: ["libbar"],
6574 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006575 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006576 }
6577
6578 cc_library {
6579 name: "libbar",
6580 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006581 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006582 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006583 apex_available: ["myapex"],
6584 }
6585
6586 cc_library {
6587 name: "libbaz",
6588 stl: "none",
6589 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006590 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006591}
Jiyong Park127b40b2019-09-30 16:04:35 +09006592
Liz Kammer5f108fa2023-05-11 14:33:17 -04006593func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6594 testApex(t, `
6595 apex {
6596 name: "myapex",
6597 key: "myapex.key",
6598 native_shared_libs: ["libfoo"],
6599 updatable: false,
6600 }
6601
6602 apex_key {
6603 name: "myapex.key",
6604 public_key: "testkey.avbpubkey",
6605 private_key: "testkey.pem",
6606 }
6607
6608 cc_library {
6609 name: "libfoo",
6610 stl: "none",
6611 static_libs: ["libbar"],
6612 system_shared_libs: [],
6613 apex_available: ["myapex"],
6614 }
6615
6616 cc_library {
6617 name: "libbar",
6618 stl: "none",
6619 shared_libs: ["libbaz"],
6620 system_shared_libs: [],
6621 apex_available: ["myapex"],
6622 }
6623
6624 cc_library {
6625 name: "libbaz",
6626 stl: "none",
6627 system_shared_libs: [],
6628 }`)
6629
6630 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6631 apex {
6632 name: "myapex",
6633 key: "myapex.key",
6634 native_shared_libs: ["libfoo"],
6635 updatable: false,
6636 }
6637
6638 apex_key {
6639 name: "myapex.key",
6640 public_key: "testkey.avbpubkey",
6641 private_key: "testkey.pem",
6642 }
6643
6644 cc_library {
6645 name: "libfoo",
6646 stl: "none",
6647 static_libs: ["libbar"],
6648 system_shared_libs: [],
6649 apex_available: ["myapex"],
6650 }
6651
6652 cc_library {
6653 name: "libbar",
6654 stl: "none",
6655 system_shared_libs: [],
6656 }`)
6657}
6658
Paul Duffine52e66f2020-03-30 17:54:29 +01006659func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006660 testApexError(t, "\"otherapex\" is not a valid module name", `
6661 apex {
6662 name: "myapex",
6663 key: "myapex.key",
6664 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006665 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006666 }
6667
6668 apex_key {
6669 name: "myapex.key",
6670 public_key: "testkey.avbpubkey",
6671 private_key: "testkey.pem",
6672 }
6673
6674 cc_library {
6675 name: "libfoo",
6676 stl: "none",
6677 system_shared_libs: [],
6678 apex_available: ["otherapex"],
6679 }`)
6680
Paul Duffine52e66f2020-03-30 17:54:29 +01006681 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006682 apex {
6683 name: "myapex",
6684 key: "myapex.key",
6685 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006686 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006687 }
6688
6689 apex_key {
6690 name: "myapex.key",
6691 public_key: "testkey.avbpubkey",
6692 private_key: "testkey.pem",
6693 }
6694
6695 cc_library {
6696 name: "libfoo",
6697 stl: "none",
6698 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006699 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006700 apex_available: ["myapex"],
6701 }
6702
6703 cc_library {
6704 name: "libbar",
6705 stl: "none",
6706 system_shared_libs: [],
6707 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006708 }
6709
6710 cc_library {
6711 name: "libbaz",
6712 stl: "none",
6713 system_shared_libs: [],
6714 stubs: {
6715 versions: ["10", "20", "30"],
6716 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006717 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006718}
Jiyong Park127b40b2019-09-30 16:04:35 +09006719
Sam Delmericoca816532023-06-02 14:09:50 -04006720func TestApexAvailable_ApexAvailableName(t *testing.T) {
6721 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6722 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6723 apex {
6724 name: "myapex_sminus",
6725 key: "myapex.key",
6726 apps: ["AppFoo"],
6727 apex_available_name: "myapex",
6728 updatable: false,
6729 }
6730 apex {
6731 name: "myapex",
6732 key: "myapex.key",
6733 apps: ["AppFoo"],
6734 updatable: false,
6735 }
6736 apex_key {
6737 name: "myapex.key",
6738 public_key: "testkey.avbpubkey",
6739 private_key: "testkey.pem",
6740 }
6741 android_app {
6742 name: "AppFoo",
6743 srcs: ["foo/bar/MyClass.java"],
6744 sdk_version: "none",
6745 system_modules: "none",
6746 apex_available: [ "myapex_sminus" ],
6747 }`,
6748 android.FixtureMergeMockFs(android.MockFS{
6749 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6750 }),
6751 )
6752 })
6753
6754 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6755 testApex(t, `
6756 apex {
6757 name: "myapex_sminus",
6758 key: "myapex.key",
6759 apps: ["AppFoo"],
6760 apex_available_name: "myapex",
6761 updatable: false,
6762 }
6763 apex {
6764 name: "myapex",
6765 key: "myapex.key",
6766 apps: ["AppFoo"],
6767 updatable: false,
6768 }
6769 apex_key {
6770 name: "myapex.key",
6771 public_key: "testkey.avbpubkey",
6772 private_key: "testkey.pem",
6773 }
6774 android_app {
6775 name: "AppFoo",
6776 srcs: ["foo/bar/MyClass.java"],
6777 sdk_version: "none",
6778 system_modules: "none",
6779 apex_available: [ "myapex" ],
6780 }`,
6781 android.FixtureMergeMockFs(android.MockFS{
6782 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6783 }),
6784 )
6785 })
6786
6787 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6788 testApex(t, `
6789 override_apex {
6790 name: "myoverrideapex_sminus",
6791 base: "myapex_sminus",
6792 key: "myapex.key",
6793 apps: ["AppFooOverride"],
6794 }
6795 override_apex {
6796 name: "myoverrideapex",
6797 base: "myapex",
6798 key: "myapex.key",
6799 apps: ["AppFooOverride"],
6800 }
6801 apex {
6802 name: "myapex_sminus",
6803 key: "myapex.key",
6804 apps: ["AppFoo"],
6805 apex_available_name: "myapex",
6806 updatable: false,
6807 }
6808 apex {
6809 name: "myapex",
6810 key: "myapex.key",
6811 apps: ["AppFoo"],
6812 updatable: false,
6813 }
6814 apex_key {
6815 name: "myapex.key",
6816 public_key: "testkey.avbpubkey",
6817 private_key: "testkey.pem",
6818 }
6819 android_app {
6820 name: "AppFooOverride",
6821 srcs: ["foo/bar/MyClass.java"],
6822 sdk_version: "none",
6823 system_modules: "none",
6824 apex_available: [ "myapex" ],
6825 }
6826 android_app {
6827 name: "AppFoo",
6828 srcs: ["foo/bar/MyClass.java"],
6829 sdk_version: "none",
6830 system_modules: "none",
6831 apex_available: [ "myapex" ],
6832 }`,
6833 android.FixtureMergeMockFs(android.MockFS{
6834 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6835 }),
6836 )
6837 })
6838}
6839
6840func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6841 context := android.GroupFixturePreparers(
6842 android.PrepareForIntegrationTestWithAndroid,
6843 PrepareForTestWithApexBuildComponents,
6844 java.PrepareForTestWithDexpreopt,
6845 android.FixtureMergeMockFs(android.MockFS{
6846 "system/sepolicy/apex/myapex-file_contexts": nil,
6847 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6848 }),
6849 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6850 variables.BuildId = proptools.StringPtr("buildid")
6851 }),
6852 )
6853 context.RunTestWithBp(t, `
6854 override_apex {
6855 name: "myoverrideapex_sminus",
6856 base: "myapex_sminus",
6857 }
6858 override_apex {
6859 name: "myoverrideapex",
6860 base: "myapex",
6861 }
6862 apex {
6863 name: "myapex",
6864 key: "myapex.key",
6865 apps: ["AppFoo"],
6866 updatable: false,
6867 }
6868 apex {
6869 name: "myapex_sminus",
6870 apex_available_name: "myapex",
6871 key: "myapex.key",
6872 apps: ["AppFoo_sminus"],
6873 updatable: false,
6874 }
6875 apex_key {
6876 name: "myapex.key",
6877 public_key: "testkey.avbpubkey",
6878 private_key: "testkey.pem",
6879 }
6880 android_app {
6881 name: "AppFoo",
6882 srcs: ["foo/bar/MyClass.java"],
6883 sdk_version: "none",
6884 system_modules: "none",
6885 apex_available: [ "myapex" ],
6886 }
6887 android_app {
6888 name: "AppFoo_sminus",
6889 srcs: ["foo/bar/MyClass.java"],
6890 sdk_version: "none",
6891 min_sdk_version: "29",
6892 system_modules: "none",
6893 apex_available: [ "myapex" ],
6894 }`)
6895}
6896
Jiyong Park89e850a2020-04-07 16:37:39 +09006897func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006898 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006899 apex {
6900 name: "myapex",
6901 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006902 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006903 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006904 }
6905
6906 apex_key {
6907 name: "myapex.key",
6908 public_key: "testkey.avbpubkey",
6909 private_key: "testkey.pem",
6910 }
6911
6912 cc_library {
6913 name: "libfoo",
6914 stl: "none",
6915 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006916 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006917 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006918 }
6919
6920 cc_library {
6921 name: "libfoo2",
6922 stl: "none",
6923 system_shared_libs: [],
6924 shared_libs: ["libbaz"],
6925 apex_available: ["//apex_available:platform"],
6926 }
6927
6928 cc_library {
6929 name: "libbar",
6930 stl: "none",
6931 system_shared_libs: [],
6932 apex_available: ["myapex"],
6933 }
6934
6935 cc_library {
6936 name: "libbaz",
6937 stl: "none",
6938 system_shared_libs: [],
6939 apex_available: ["myapex"],
6940 stubs: {
6941 versions: ["1"],
6942 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006943 }`)
6944
Jiyong Park89e850a2020-04-07 16:37:39 +09006945 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6946 // because it depends on libbar which isn't available to platform
6947 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6948 if libfoo.NotAvailableForPlatform() != true {
6949 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6950 }
6951
6952 // libfoo2 however can be available to platform because it depends on libbaz which provides
6953 // stubs
6954 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6955 if libfoo2.NotAvailableForPlatform() == true {
6956 t.Errorf("%q should be available to platform", libfoo2.String())
6957 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006958}
Jiyong Parka90ca002019-10-07 15:47:24 +09006959
Paul Duffine52e66f2020-03-30 17:54:29 +01006960func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006961 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006962 apex {
6963 name: "myapex",
6964 key: "myapex.key",
6965 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006966 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006967 }
6968
6969 apex_key {
6970 name: "myapex.key",
6971 public_key: "testkey.avbpubkey",
6972 private_key: "testkey.pem",
6973 }
6974
6975 cc_library {
6976 name: "libfoo",
6977 stl: "none",
6978 system_shared_libs: [],
6979 apex_available: ["myapex"],
6980 static: {
6981 apex_available: ["//apex_available:platform"],
6982 },
6983 }`)
6984
Jiyong Park89e850a2020-04-07 16:37:39 +09006985 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6986 if libfooShared.NotAvailableForPlatform() != true {
6987 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6988 }
6989 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6990 if libfooStatic.NotAvailableForPlatform() != false {
6991 t.Errorf("%q should be available to platform", libfooStatic.String())
6992 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006993}
6994
Jiyong Park5d790c32019-11-15 18:40:32 +09006995func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006996 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006997 apex {
6998 name: "myapex",
6999 key: "myapex.key",
7000 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007001 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007002 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007003 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007004 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007005 }
7006
7007 override_apex {
7008 name: "override_myapex",
7009 base: "myapex",
7010 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007011 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007012 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007013 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007014 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007015 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007016 key: "mynewapex.key",
7017 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007018 }
7019
7020 apex_key {
7021 name: "myapex.key",
7022 public_key: "testkey.avbpubkey",
7023 private_key: "testkey.pem",
7024 }
7025
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007026 apex_key {
7027 name: "mynewapex.key",
7028 public_key: "testkey2.avbpubkey",
7029 private_key: "testkey2.pem",
7030 }
7031
7032 android_app_certificate {
7033 name: "myapex.certificate",
7034 certificate: "testkey",
7035 }
7036
Jiyong Park5d790c32019-11-15 18:40:32 +09007037 android_app {
7038 name: "app",
7039 srcs: ["foo/bar/MyClass.java"],
7040 package_name: "foo",
7041 sdk_version: "none",
7042 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007043 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007044 }
7045
7046 override_android_app {
7047 name: "override_app",
7048 base: "app",
7049 package_name: "bar",
7050 }
markchien7c803b82021-08-26 22:10:06 +08007051
7052 bpf {
7053 name: "bpf",
7054 srcs: ["bpf.c"],
7055 }
7056
7057 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007058 name: "overrideBpf",
7059 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007060 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007061
7062 prebuilt_etc {
7063 name: "myetc",
7064 src: "myprebuilt",
7065 }
7066
7067 prebuilt_etc {
7068 name: "override_myetc",
7069 src: "override_myprebuilt",
7070 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007071 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007072
Jiyong Park317645e2019-12-05 13:20:58 +09007073 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
7074 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
7075 if originalVariant.GetOverriddenBy() != "" {
7076 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7077 }
7078 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7079 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7080 }
7081
Jiyong Park5d790c32019-11-15 18:40:32 +09007082 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
7083 apexRule := module.Rule("apexRule")
7084 copyCmds := apexRule.Args["copy_commands"]
7085
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007086 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7087 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007088
markchien7c803b82021-08-26 22:10:06 +08007089 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007090 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007091
Daniel Norman5a3ce132021-08-26 15:44:43 -07007092 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7093 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7094
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007095 apexBundle := module.Module().(*apexBundle)
7096 name := apexBundle.Name()
7097 if name != "override_myapex" {
7098 t.Errorf("name should be \"override_myapex\", but was %q", name)
7099 }
7100
Baligh Uddin004d7172020-02-19 21:29:28 -08007101 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7102 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7103 }
7104
Jiyong Park20bacab2020-03-03 11:45:41 +09007105 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007106 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007107 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7108
7109 signApkRule := module.Rule("signapk")
7110 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007111
Colin Crossaa255532020-07-03 13:18:24 -07007112 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007113 var builder strings.Builder
7114 data.Custom(&builder, name, "TARGET_", "", data)
7115 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007116 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7117 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
7118 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007119 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007120 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007121 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007122 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007123 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007124 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
7125 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007126}
7127
Albert Martineefabcf2022-03-21 20:11:16 +00007128func TestMinSdkVersionOverride(t *testing.T) {
7129 // Override from 29 to 31
7130 minSdkOverride31 := "31"
7131 ctx := testApex(t, `
7132 apex {
7133 name: "myapex",
7134 key: "myapex.key",
7135 native_shared_libs: ["mylib"],
7136 updatable: true,
7137 min_sdk_version: "29"
7138 }
7139
7140 override_apex {
7141 name: "override_myapex",
7142 base: "myapex",
7143 logging_parent: "com.foo.bar",
7144 package_name: "test.overridden.package"
7145 }
7146
7147 apex_key {
7148 name: "myapex.key",
7149 public_key: "testkey.avbpubkey",
7150 private_key: "testkey.pem",
7151 }
7152
7153 cc_library {
7154 name: "mylib",
7155 srcs: ["mylib.cpp"],
7156 runtime_libs: ["libbar"],
7157 system_shared_libs: [],
7158 stl: "none",
7159 apex_available: [ "myapex" ],
7160 min_sdk_version: "apex_inherit"
7161 }
7162
7163 cc_library {
7164 name: "libbar",
7165 srcs: ["mylib.cpp"],
7166 system_shared_libs: [],
7167 stl: "none",
7168 apex_available: [ "myapex" ],
7169 min_sdk_version: "apex_inherit"
7170 }
7171
7172 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7173
7174 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
7175 copyCmds := apexRule.Args["copy_commands"]
7176
7177 // Ensure that direct non-stubs dep is always included
7178 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7179
7180 // Ensure that runtime_libs dep in included
7181 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7182
7183 // Ensure libraries target overridden min_sdk_version value
7184 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7185}
7186
7187func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7188 // Attempt to override from 31 to 29, should be a NOOP
7189 minSdkOverride29 := "29"
7190 ctx := testApex(t, `
7191 apex {
7192 name: "myapex",
7193 key: "myapex.key",
7194 native_shared_libs: ["mylib"],
7195 updatable: true,
7196 min_sdk_version: "31"
7197 }
7198
7199 override_apex {
7200 name: "override_myapex",
7201 base: "myapex",
7202 logging_parent: "com.foo.bar",
7203 package_name: "test.overridden.package"
7204 }
7205
7206 apex_key {
7207 name: "myapex.key",
7208 public_key: "testkey.avbpubkey",
7209 private_key: "testkey.pem",
7210 }
7211
7212 cc_library {
7213 name: "mylib",
7214 srcs: ["mylib.cpp"],
7215 runtime_libs: ["libbar"],
7216 system_shared_libs: [],
7217 stl: "none",
7218 apex_available: [ "myapex" ],
7219 min_sdk_version: "apex_inherit"
7220 }
7221
7222 cc_library {
7223 name: "libbar",
7224 srcs: ["mylib.cpp"],
7225 system_shared_libs: [],
7226 stl: "none",
7227 apex_available: [ "myapex" ],
7228 min_sdk_version: "apex_inherit"
7229 }
7230
7231 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7232
7233 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
7234 copyCmds := apexRule.Args["copy_commands"]
7235
7236 // Ensure that direct non-stubs dep is always included
7237 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7238
7239 // Ensure that runtime_libs dep in included
7240 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7241
7242 // Ensure libraries target the original min_sdk_version value rather than the overridden
7243 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7244}
7245
Jooyung Han214bf372019-11-12 13:03:50 +09007246func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007247 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007248 apex {
7249 name: "myapex",
7250 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007251 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007252 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007253 }
7254
7255 apex_key {
7256 name: "myapex.key",
7257 public_key: "testkey.avbpubkey",
7258 private_key: "testkey.pem",
7259 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007260
7261 cc_library {
7262 name: "mylib",
7263 srcs: ["mylib.cpp"],
7264 stl: "libc++",
7265 system_shared_libs: [],
7266 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007267 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007268 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007269 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007270
7271 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
7272 args := module.Rule("apexRule").Args
7273 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007274 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007275
7276 // The copies of the libraries in the apex should have one more dependency than
7277 // the ones outside the apex, namely the unwinder. Ideally we should check
7278 // the dependency names directly here but for some reason the names are blank in
7279 // this test.
7280 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007281 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007282 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7283 if len(apexImplicits) != len(nonApexImplicits)+1 {
7284 t.Errorf("%q missing unwinder dep", lib)
7285 }
7286 }
Jooyung Han214bf372019-11-12 13:03:50 +09007287}
7288
Paul Duffine05480a2021-03-08 15:07:14 +00007289var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007290 "api/current.txt": nil,
7291 "api/removed.txt": nil,
7292 "api/system-current.txt": nil,
7293 "api/system-removed.txt": nil,
7294 "api/test-current.txt": nil,
7295 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007296
Anton Hanssondff2c782020-12-21 17:10:01 +00007297 "100/public/api/foo.txt": nil,
7298 "100/public/api/foo-removed.txt": nil,
7299 "100/system/api/foo.txt": nil,
7300 "100/system/api/foo-removed.txt": nil,
7301
Paul Duffineedc5d52020-06-12 17:46:39 +01007302 // For java_sdk_library_import
7303 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007304}
7305
Jooyung Han58f26ab2019-12-18 15:34:32 +09007306func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007307 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007308 apex {
7309 name: "myapex",
7310 key: "myapex.key",
7311 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007312 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007313 }
7314
7315 apex_key {
7316 name: "myapex.key",
7317 public_key: "testkey.avbpubkey",
7318 private_key: "testkey.pem",
7319 }
7320
7321 java_sdk_library {
7322 name: "foo",
7323 srcs: ["a.java"],
7324 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007325 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007326 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007327
7328 prebuilt_apis {
7329 name: "sdk",
7330 api_dirs: ["100"],
7331 }
Paul Duffin9b879592020-05-26 13:21:35 +01007332 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007333
7334 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00007335 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007336 "javalib/foo.jar",
7337 "etc/permissions/foo.xml",
7338 })
7339 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007340 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007341 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 +09007342}
7343
Paul Duffin9b879592020-05-26 13:21:35 +01007344func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007345 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007346 apex {
7347 name: "myapex",
7348 key: "myapex.key",
7349 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007350 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007351 }
7352
7353 apex_key {
7354 name: "myapex.key",
7355 public_key: "testkey.avbpubkey",
7356 private_key: "testkey.pem",
7357 }
7358
7359 java_sdk_library {
7360 name: "foo",
7361 srcs: ["a.java"],
7362 api_packages: ["foo"],
7363 apex_available: ["myapex"],
7364 sdk_version: "none",
7365 system_modules: "none",
7366 }
7367
7368 java_library {
7369 name: "bar",
7370 srcs: ["a.java"],
7371 libs: ["foo"],
7372 apex_available: ["myapex"],
7373 sdk_version: "none",
7374 system_modules: "none",
7375 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007376
7377 prebuilt_apis {
7378 name: "sdk",
7379 api_dirs: ["100"],
7380 }
Paul Duffin9b879592020-05-26 13:21:35 +01007381 `, withFiles(filesForSdkLibrary))
7382
7383 // java_sdk_library installs both impl jar and permission XML
7384 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7385 "javalib/bar.jar",
7386 "javalib/foo.jar",
7387 "etc/permissions/foo.xml",
7388 })
7389
7390 // The bar library should depend on the implementation jar.
7391 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007392 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007393 t.Errorf("expected %q, found %#q", expected, actual)
7394 }
7395}
7396
7397func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007398 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007399 apex {
7400 name: "myapex",
7401 key: "myapex.key",
7402 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007403 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007404 }
7405
7406 apex_key {
7407 name: "myapex.key",
7408 public_key: "testkey.avbpubkey",
7409 private_key: "testkey.pem",
7410 }
7411
7412 java_sdk_library {
7413 name: "foo",
7414 srcs: ["a.java"],
7415 api_packages: ["foo"],
7416 apex_available: ["myapex"],
7417 sdk_version: "none",
7418 system_modules: "none",
7419 }
7420
7421 java_library {
7422 name: "bar",
7423 srcs: ["a.java"],
7424 libs: ["foo"],
7425 sdk_version: "none",
7426 system_modules: "none",
7427 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007428
7429 prebuilt_apis {
7430 name: "sdk",
7431 api_dirs: ["100"],
7432 }
Paul Duffin9b879592020-05-26 13:21:35 +01007433 `, withFiles(filesForSdkLibrary))
7434
7435 // java_sdk_library installs both impl jar and permission XML
7436 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7437 "javalib/foo.jar",
7438 "etc/permissions/foo.xml",
7439 })
7440
7441 // The bar library should depend on the stubs jar.
7442 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007443 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007444 t.Errorf("expected %q, found %#q", expected, actual)
7445 }
7446}
7447
Paul Duffineedc5d52020-06-12 17:46:39 +01007448func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007449 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007450 prebuilt_apis {
7451 name: "sdk",
7452 api_dirs: ["100"],
7453 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007454 withFiles(map[string][]byte{
7455 "apex/a.java": nil,
7456 "apex/apex_manifest.json": nil,
7457 "apex/Android.bp": []byte(`
7458 package {
7459 default_visibility: ["//visibility:private"],
7460 }
7461
7462 apex {
7463 name: "myapex",
7464 key: "myapex.key",
7465 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007466 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007467 }
7468
7469 apex_key {
7470 name: "myapex.key",
7471 public_key: "testkey.avbpubkey",
7472 private_key: "testkey.pem",
7473 }
7474
7475 java_library {
7476 name: "bar",
7477 srcs: ["a.java"],
7478 libs: ["foo"],
7479 apex_available: ["myapex"],
7480 sdk_version: "none",
7481 system_modules: "none",
7482 }
7483`),
7484 "source/a.java": nil,
7485 "source/api/current.txt": nil,
7486 "source/api/removed.txt": nil,
7487 "source/Android.bp": []byte(`
7488 package {
7489 default_visibility: ["//visibility:private"],
7490 }
7491
7492 java_sdk_library {
7493 name: "foo",
7494 visibility: ["//apex"],
7495 srcs: ["a.java"],
7496 api_packages: ["foo"],
7497 apex_available: ["myapex"],
7498 sdk_version: "none",
7499 system_modules: "none",
7500 public: {
7501 enabled: true,
7502 },
7503 }
7504`),
7505 "prebuilt/a.jar": nil,
7506 "prebuilt/Android.bp": []byte(`
7507 package {
7508 default_visibility: ["//visibility:private"],
7509 }
7510
7511 java_sdk_library_import {
7512 name: "foo",
7513 visibility: ["//apex", "//source"],
7514 apex_available: ["myapex"],
7515 prefer: true,
7516 public: {
7517 jars: ["a.jar"],
7518 },
7519 }
7520`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007521 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007522 )
7523
7524 // java_sdk_library installs both impl jar and permission XML
7525 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7526 "javalib/bar.jar",
7527 "javalib/foo.jar",
7528 "etc/permissions/foo.xml",
7529 })
7530
7531 // The bar library should depend on the implementation jar.
7532 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007533 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007534 t.Errorf("expected %q, found %#q", expected, actual)
7535 }
7536}
7537
7538func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7539 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7540 apex {
7541 name: "myapex",
7542 key: "myapex.key",
7543 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007544 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007545 }
7546
7547 apex_key {
7548 name: "myapex.key",
7549 public_key: "testkey.avbpubkey",
7550 private_key: "testkey.pem",
7551 }
7552
7553 java_sdk_library_import {
7554 name: "foo",
7555 apex_available: ["myapex"],
7556 prefer: true,
7557 public: {
7558 jars: ["a.jar"],
7559 },
7560 }
7561
7562 `, withFiles(filesForSdkLibrary))
7563}
7564
atrost6e126252020-01-27 17:01:16 +00007565func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007566 result := android.GroupFixturePreparers(
7567 prepareForApexTest,
7568 java.PrepareForTestWithPlatformCompatConfig,
7569 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007570 apex {
7571 name: "myapex",
7572 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007573 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007574 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007575 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007576 }
7577
7578 apex_key {
7579 name: "myapex.key",
7580 public_key: "testkey.avbpubkey",
7581 private_key: "testkey.pem",
7582 }
7583
7584 platform_compat_config {
7585 name: "myjar-platform-compat-config",
7586 src: ":myjar",
7587 }
7588
7589 java_library {
7590 name: "myjar",
7591 srcs: ["foo/bar/MyClass.java"],
7592 sdk_version: "none",
7593 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007594 apex_available: [ "myapex" ],
7595 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007596
7597 // Make sure that a preferred prebuilt does not affect the apex contents.
7598 prebuilt_platform_compat_config {
7599 name: "myjar-platform-compat-config",
7600 metadata: "compat-config/metadata.xml",
7601 prefer: true,
7602 }
atrost6e126252020-01-27 17:01:16 +00007603 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007604 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007605 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7606 "etc/compatconfig/myjar-platform-compat-config.xml",
7607 "javalib/myjar.jar",
7608 })
7609}
7610
Jooyung Han862c0d62022-12-21 10:15:37 +09007611func TestNoDupeApexFiles(t *testing.T) {
7612 android.GroupFixturePreparers(
7613 android.PrepareForTestWithAndroidBuildComponents,
7614 PrepareForTestWithApexBuildComponents,
7615 prepareForTestWithMyapex,
7616 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7617 ).
7618 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7619 RunTestWithBp(t, `
7620 apex {
7621 name: "myapex",
7622 key: "myapex.key",
7623 prebuilts: ["foo", "bar"],
7624 updatable: false,
7625 }
7626
7627 apex_key {
7628 name: "myapex.key",
7629 public_key: "testkey.avbpubkey",
7630 private_key: "testkey.pem",
7631 }
7632
7633 prebuilt_etc {
7634 name: "foo",
7635 src: "myprebuilt",
7636 filename_from_src: true,
7637 }
7638
7639 prebuilt_etc {
7640 name: "bar",
7641 src: "myprebuilt",
7642 filename_from_src: true,
7643 }
7644 `)
7645}
7646
Jiyong Park479321d2019-12-16 11:47:12 +09007647func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7648 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7649 apex {
7650 name: "myapex",
7651 key: "myapex.key",
7652 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007653 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007654 }
7655
7656 apex_key {
7657 name: "myapex.key",
7658 public_key: "testkey.avbpubkey",
7659 private_key: "testkey.pem",
7660 }
7661
7662 java_library {
7663 name: "myjar",
7664 srcs: ["foo/bar/MyClass.java"],
7665 sdk_version: "none",
7666 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007667 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007668 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007669 }
7670 `)
7671}
7672
Jiyong Park7afd1072019-12-30 16:56:33 +09007673func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007674 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007675 apex {
7676 name: "myapex",
7677 key: "myapex.key",
7678 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007679 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007680 }
7681
7682 apex_key {
7683 name: "myapex.key",
7684 public_key: "testkey.avbpubkey",
7685 private_key: "testkey.pem",
7686 }
7687
7688 cc_library {
7689 name: "mylib",
7690 srcs: ["mylib.cpp"],
7691 system_shared_libs: [],
7692 stl: "none",
7693 required: ["a", "b"],
7694 host_required: ["c", "d"],
7695 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007696 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007697 }
7698 `)
7699
7700 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007701 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007702 name := apexBundle.BaseModuleName()
7703 prefix := "TARGET_"
7704 var builder strings.Builder
7705 data.Custom(&builder, name, prefix, "", data)
7706 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007707 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007708 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7709 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007710}
7711
Jiyong Park7cd10e32020-01-14 09:22:18 +09007712func TestSymlinksFromApexToSystem(t *testing.T) {
7713 bp := `
7714 apex {
7715 name: "myapex",
7716 key: "myapex.key",
7717 native_shared_libs: ["mylib"],
7718 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007719 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007720 }
7721
Jiyong Park9d677202020-02-19 16:29:35 +09007722 apex {
7723 name: "myapex.updatable",
7724 key: "myapex.key",
7725 native_shared_libs: ["mylib"],
7726 java_libs: ["myjar"],
7727 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007728 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007729 }
7730
Jiyong Park7cd10e32020-01-14 09:22:18 +09007731 apex_key {
7732 name: "myapex.key",
7733 public_key: "testkey.avbpubkey",
7734 private_key: "testkey.pem",
7735 }
7736
7737 cc_library {
7738 name: "mylib",
7739 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007740 shared_libs: [
7741 "myotherlib",
7742 "myotherlib_ext",
7743 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007744 system_shared_libs: [],
7745 stl: "none",
7746 apex_available: [
7747 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007748 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007749 "//apex_available:platform",
7750 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007751 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007752 }
7753
7754 cc_library {
7755 name: "myotherlib",
7756 srcs: ["mylib.cpp"],
7757 system_shared_libs: [],
7758 stl: "none",
7759 apex_available: [
7760 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007761 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007762 "//apex_available:platform",
7763 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007764 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007765 }
7766
Jiyong Parkce243632023-02-17 18:22:25 +09007767 cc_library {
7768 name: "myotherlib_ext",
7769 srcs: ["mylib.cpp"],
7770 system_shared_libs: [],
7771 system_ext_specific: true,
7772 stl: "none",
7773 apex_available: [
7774 "myapex",
7775 "myapex.updatable",
7776 "//apex_available:platform",
7777 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007778 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007779 }
7780
Jiyong Park7cd10e32020-01-14 09:22:18 +09007781 java_library {
7782 name: "myjar",
7783 srcs: ["foo/bar/MyClass.java"],
7784 sdk_version: "none",
7785 system_modules: "none",
7786 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007787 apex_available: [
7788 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007789 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007790 "//apex_available:platform",
7791 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007792 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007793 }
7794
7795 java_library {
7796 name: "myotherjar",
7797 srcs: ["foo/bar/MyClass.java"],
7798 sdk_version: "none",
7799 system_modules: "none",
7800 apex_available: [
7801 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007802 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007803 "//apex_available:platform",
7804 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007805 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007806 }
7807 `
7808
7809 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7810 for _, f := range files {
7811 if f.path == file {
7812 if f.isLink {
7813 t.Errorf("%q is not a real file", file)
7814 }
7815 return
7816 }
7817 }
7818 t.Errorf("%q is not found", file)
7819 }
7820
Jiyong Parkce243632023-02-17 18:22:25 +09007821 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007822 for _, f := range files {
7823 if f.path == file {
7824 if !f.isLink {
7825 t.Errorf("%q is not a symlink", file)
7826 }
Jiyong Parkce243632023-02-17 18:22:25 +09007827 if f.src != target {
7828 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7829 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007830 return
7831 }
7832 }
7833 t.Errorf("%q is not found", file)
7834 }
7835
Jiyong Park9d677202020-02-19 16:29:35 +09007836 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7837 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007838 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007839 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007840 ensureRealfileExists(t, files, "javalib/myjar.jar")
7841 ensureRealfileExists(t, files, "lib64/mylib.so")
7842 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007843 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007844
Jiyong Park9d677202020-02-19 16:29:35 +09007845 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7846 ensureRealfileExists(t, files, "javalib/myjar.jar")
7847 ensureRealfileExists(t, files, "lib64/mylib.so")
7848 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007849 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007850
7851 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007852 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007853 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007854 ensureRealfileExists(t, files, "javalib/myjar.jar")
7855 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007856 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7857 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007858
7859 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7860 ensureRealfileExists(t, files, "javalib/myjar.jar")
7861 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007862 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7863 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007864}
7865
Yo Chiange8128052020-07-23 20:09:18 +08007866func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007867 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007868 apex {
7869 name: "myapex",
7870 key: "myapex.key",
7871 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007872 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007873 }
7874
7875 apex_key {
7876 name: "myapex.key",
7877 public_key: "testkey.avbpubkey",
7878 private_key: "testkey.pem",
7879 }
7880
7881 cc_library_shared {
7882 name: "mylib",
7883 srcs: ["mylib.cpp"],
7884 shared_libs: ["myotherlib"],
7885 system_shared_libs: [],
7886 stl: "none",
7887 apex_available: [
7888 "myapex",
7889 "//apex_available:platform",
7890 ],
7891 }
7892
7893 cc_prebuilt_library_shared {
7894 name: "myotherlib",
7895 srcs: ["prebuilt.so"],
7896 system_shared_libs: [],
7897 stl: "none",
7898 apex_available: [
7899 "myapex",
7900 "//apex_available:platform",
7901 ],
7902 }
7903 `)
7904
Prerana Patilb1896c82022-11-09 18:14:34 +00007905 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007906 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007907 var builder strings.Builder
7908 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7909 androidMk := builder.String()
7910 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007911 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007912 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7913 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7914 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007915 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64 apex_manifest.pb.myapex apex_pubkey.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007916}
7917
Jooyung Han643adc42020-02-27 13:50:06 +09007918func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007919 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007920 apex {
7921 name: "myapex",
7922 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007923 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007924 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007925 }
7926
7927 apex_key {
7928 name: "myapex.key",
7929 public_key: "testkey.avbpubkey",
7930 private_key: "testkey.pem",
7931 }
7932
7933 cc_library {
7934 name: "mylib",
7935 srcs: ["mylib.cpp"],
7936 shared_libs: ["mylib2"],
7937 system_shared_libs: [],
7938 stl: "none",
7939 apex_available: [ "myapex" ],
7940 }
7941
7942 cc_library {
7943 name: "mylib2",
7944 srcs: ["mylib.cpp"],
7945 system_shared_libs: [],
7946 stl: "none",
7947 apex_available: [ "myapex" ],
7948 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007949
7950 rust_ffi_shared {
7951 name: "libfoo.rust",
7952 crate_name: "foo",
7953 srcs: ["foo.rs"],
7954 shared_libs: ["libfoo.shared_from_rust"],
7955 prefer_rlib: true,
7956 apex_available: ["myapex"],
7957 }
7958
7959 cc_library_shared {
7960 name: "libfoo.shared_from_rust",
7961 srcs: ["mylib.cpp"],
7962 system_shared_libs: [],
7963 stl: "none",
7964 stubs: {
7965 versions: ["10", "11", "12"],
7966 },
7967 }
7968
Jooyung Han643adc42020-02-27 13:50:06 +09007969 `)
7970
7971 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7972 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007973 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007974 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7975 "lib64/mylib.so",
7976 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007977 "lib64/libfoo.rust.so",
7978 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7979 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007980 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007981
7982 // b/220397949
7983 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007984}
7985
Jooyung Han49f67012020-04-17 13:43:10 +09007986func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007987 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007988 apex {
7989 name: "myapex",
7990 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007991 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007992 }
7993 apex_key {
7994 name: "myapex.key",
7995 public_key: "testkey.avbpubkey",
7996 private_key: "testkey.pem",
7997 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007998 `,
7999 android.FixtureModifyConfig(func(config android.Config) {
8000 delete(config.Targets, android.Android)
8001 config.AndroidCommonTarget = android.Target{}
8002 }),
8003 )
Jooyung Han49f67012020-04-17 13:43:10 +09008004
8005 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8006 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8007 }
8008}
8009
Jiyong Parkbd159612020-02-28 15:22:21 +09008010func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008011 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008012 apex {
8013 name: "myapex",
8014 key: "myapex.key",
8015 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008016 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008017 }
8018
8019 apex_key {
8020 name: "myapex.key",
8021 public_key: "testkey.avbpubkey",
8022 private_key: "testkey.pem",
8023 }
8024
8025 android_app {
8026 name: "AppFoo",
8027 srcs: ["foo/bar/MyClass.java"],
8028 sdk_version: "none",
8029 system_modules: "none",
8030 apex_available: [ "myapex" ],
8031 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008032 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008033
Colin Crosscf371cc2020-11-13 11:48:42 -08008034 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09008035 content := bundleConfigRule.Args["content"]
8036
8037 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008038 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 +09008039}
8040
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008041func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008042 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008043 apex {
8044 name: "myapex",
8045 key: "myapex.key",
8046 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008047 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008048 }
8049
8050 apex_key {
8051 name: "myapex.key",
8052 public_key: "testkey.avbpubkey",
8053 private_key: "testkey.pem",
8054 }
8055
8056 android_app_set {
8057 name: "AppSet",
8058 set: "AppSet.apks",
8059 }`)
8060 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08008061 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008062 content := bundleConfigRule.Args["content"]
8063 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8064 s := mod.Rule("apexRule").Args["copy_commands"]
8065 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008066 if len(copyCmds) != 4 {
8067 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008068 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008069 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8070 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008071 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8072 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008073
8074 // Ensure that canned_fs_config has an entry for the app set zip file
8075 generateFsRule := mod.Rule("generateFsConfig")
8076 cmd := generateFsRule.RuleParams.Command
8077 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008078}
8079
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008080func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008081 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008082 apex_set {
8083 name: "myapex",
8084 filename: "foo_v2.apex",
8085 sanitized: {
8086 none: { set: "myapex.apks", },
8087 hwaddress: { set: "myapex.hwasan.apks", },
8088 },
Paul Duffin24704672021-04-06 16:09:30 +01008089 }
8090 `
8091 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008092
Paul Duffin24704672021-04-06 16:09:30 +01008093 // Check that the extractor produces the correct output file from the correct input file.
8094 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008095
Paul Duffin24704672021-04-06 16:09:30 +01008096 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8097 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008098
Paul Duffin24704672021-04-06 16:09:30 +01008099 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8100
8101 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008102 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8103 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008104
8105 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008106}
8107
Pranav Guptaeba03b02022-09-27 00:27:08 +00008108func TestApexSetApksModuleAssignment(t *testing.T) {
8109 ctx := testApex(t, `
8110 apex_set {
8111 name: "myapex",
8112 set: ":myapex_apks_file",
8113 }
8114
8115 filegroup {
8116 name: "myapex_apks_file",
8117 srcs: ["myapex.apks"],
8118 }
8119 `)
8120
8121 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8122
8123 // Check that the extractor produces the correct apks file from the input module
8124 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
8125 extractedApex := m.Output(extractorOutput)
8126
8127 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8128}
8129
Paul Duffin89f570a2021-06-16 01:42:33 +01008130func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008131 t.Helper()
8132
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008133 bp := `
8134 java_library {
8135 name: "some-updatable-apex-lib",
8136 srcs: ["a.java"],
8137 sdk_version: "current",
8138 apex_available: [
8139 "some-updatable-apex",
8140 ],
satayevabcd5972021-08-06 17:49:46 +01008141 permitted_packages: ["some.updatable.apex.lib"],
Spandan Dascc9d9422023-04-06 18:07:43 +00008142 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008143 }
8144
8145 java_library {
8146 name: "some-non-updatable-apex-lib",
8147 srcs: ["a.java"],
8148 apex_available: [
8149 "some-non-updatable-apex",
8150 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01008151 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01008152 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008153 }
8154
8155 bootclasspath_fragment {
8156 name: "some-non-updatable-fragment",
8157 contents: ["some-non-updatable-apex-lib"],
8158 apex_available: [
8159 "some-non-updatable-apex",
8160 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01008161 hidden_api: {
8162 split_packages: ["*"],
8163 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008164 }
8165
8166 java_library {
8167 name: "some-platform-lib",
8168 srcs: ["a.java"],
8169 sdk_version: "current",
8170 installable: true,
8171 }
8172
8173 java_library {
8174 name: "some-art-lib",
8175 srcs: ["a.java"],
8176 sdk_version: "current",
8177 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00008178 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008179 ],
8180 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01008181 compile_dex: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00008182 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008183 }
8184
8185 apex {
8186 name: "some-updatable-apex",
8187 key: "some-updatable-apex.key",
8188 java_libs: ["some-updatable-apex-lib"],
8189 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00008190 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008191 }
8192
8193 apex {
8194 name: "some-non-updatable-apex",
8195 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01008196 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008197 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008198 }
8199
8200 apex_key {
8201 name: "some-updatable-apex.key",
8202 }
8203
8204 apex_key {
8205 name: "some-non-updatable-apex.key",
8206 }
8207
8208 apex {
Paul Duffind376f792021-01-26 11:59:35 +00008209 name: "com.android.art.debug",
8210 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01008211 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008212 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00008213 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008214 }
8215
Paul Duffinf23bc472021-04-27 12:42:20 +01008216 bootclasspath_fragment {
8217 name: "art-bootclasspath-fragment",
8218 image_name: "art",
8219 contents: ["some-art-lib"],
8220 apex_available: [
8221 "com.android.art.debug",
8222 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01008223 hidden_api: {
8224 split_packages: ["*"],
8225 },
Paul Duffinf23bc472021-04-27 12:42:20 +01008226 }
8227
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008228 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00008229 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008230 }
8231
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008232 filegroup {
8233 name: "some-updatable-apex-file_contexts",
8234 srcs: [
8235 "system/sepolicy/apex/some-updatable-apex-file_contexts",
8236 ],
8237 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008238
8239 filegroup {
8240 name: "some-non-updatable-apex-file_contexts",
8241 srcs: [
8242 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
8243 ],
8244 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008245 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00008246
Paul Duffin89f570a2021-06-16 01:42:33 +01008247 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00008248}
8249
Paul Duffin89f570a2021-06-16 01:42:33 +01008250func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008251 t.Helper()
8252
Paul Duffin55607122021-03-30 23:32:51 +01008253 fs := android.MockFS{
8254 "a.java": nil,
8255 "a.jar": nil,
8256 "apex_manifest.json": nil,
8257 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008258 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008259 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8260 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8261 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008262 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008263 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008264
Paul Duffin55607122021-03-30 23:32:51 +01008265 errorHandler := android.FixtureExpectsNoErrors
8266 if errmsg != "" {
8267 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008268 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008269
Paul Duffin55607122021-03-30 23:32:51 +01008270 result := android.GroupFixturePreparers(
8271 cc.PrepareForTestWithCcDefaultModules,
8272 java.PrepareForTestWithHiddenApiBuildComponents,
8273 java.PrepareForTestWithJavaDefaultModules,
8274 java.PrepareForTestWithJavaSdkLibraryFiles,
8275 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008276 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008277 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008278 android.FixtureModifyMockFS(func(fs android.MockFS) {
8279 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8280 insert := ""
8281 for _, fragment := range fragments {
8282 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8283 }
8284 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8285 platform_bootclasspath {
8286 name: "platform-bootclasspath",
8287 fragments: [
8288 %s
8289 ],
8290 }
8291 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008292 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008293 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008294 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008295 ).
8296 ExtendWithErrorHandler(errorHandler).
8297 RunTestWithBp(t, bp)
8298
8299 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008300}
8301
Paul Duffin5556c5f2022-06-09 17:32:21 +00008302func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008303 preparers := android.GroupFixturePreparers(
8304 java.PrepareForTestWithJavaDefaultModules,
8305 PrepareForTestWithApexBuildComponents,
8306 ).
8307 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
8308 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
8309
8310 bpBase := `
8311 apex_set {
8312 name: "com.android.myapex",
8313 installable: true,
8314 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8315 set: "myapex.apks",
8316 }
8317
8318 apex_set {
8319 name: "com.mycompany.android.myapex",
8320 apex_name: "com.android.myapex",
8321 installable: true,
8322 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8323 set: "company-myapex.apks",
8324 }
8325
8326 prebuilt_bootclasspath_fragment {
8327 name: "my-bootclasspath-fragment",
8328 apex_available: ["com.android.myapex"],
8329 %s
8330 }
8331 `
8332
8333 t.Run("java_import", func(t *testing.T) {
8334 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8335 java_import {
8336 name: "libfoo",
8337 jars: ["libfoo.jar"],
8338 apex_available: ["com.android.myapex"],
8339 }
8340 `)
8341 })
8342
8343 t.Run("java_sdk_library_import", func(t *testing.T) {
8344 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8345 java_sdk_library_import {
8346 name: "libfoo",
8347 public: {
8348 jars: ["libbar.jar"],
8349 },
8350 apex_available: ["com.android.myapex"],
8351 }
8352 `)
8353 })
8354
8355 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8356 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8357 image_name: "art",
8358 contents: ["libfoo"],
8359 `)+`
8360 java_sdk_library_import {
8361 name: "libfoo",
8362 public: {
8363 jars: ["libbar.jar"],
8364 },
8365 apex_available: ["com.android.myapex"],
8366 }
8367 `)
8368 })
8369}
8370
Paul Duffin5556c5f2022-06-09 17:32:21 +00008371func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8372 preparers := android.GroupFixturePreparers(
8373 java.PrepareForTestWithJavaDefaultModules,
8374 PrepareForTestWithApexBuildComponents,
8375 )
8376
8377 bpBase := `
8378 apex_set {
8379 name: "com.android.myapex",
8380 installable: true,
8381 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8382 set: "myapex.apks",
8383 }
8384
8385 apex_set {
8386 name: "com.android.myapex_compressed",
8387 apex_name: "com.android.myapex",
8388 installable: true,
8389 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8390 set: "myapex_compressed.apks",
8391 }
8392
8393 prebuilt_bootclasspath_fragment {
8394 name: "my-bootclasspath-fragment",
8395 apex_available: [
8396 "com.android.myapex",
8397 "com.android.myapex_compressed",
8398 ],
8399 hidden_api: {
8400 annotation_flags: "annotation-flags.csv",
8401 metadata: "metadata.csv",
8402 index: "index.csv",
8403 signature_patterns: "signature_patterns.csv",
8404 },
8405 %s
8406 }
8407 `
8408
8409 t.Run("java_import", func(t *testing.T) {
8410 result := preparers.RunTestWithBp(t,
8411 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8412 java_import {
8413 name: "libfoo",
8414 jars: ["libfoo.jar"],
8415 apex_available: [
8416 "com.android.myapex",
8417 "com.android.myapex_compressed",
8418 ],
8419 }
8420 `)
8421
8422 module := result.Module("libfoo", "android_common_com.android.myapex")
8423 usesLibraryDep := module.(java.UsesLibraryDependency)
8424 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8425 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8426 usesLibraryDep.DexJarBuildPath().Path())
8427 })
8428
8429 t.Run("java_sdk_library_import", func(t *testing.T) {
8430 result := preparers.RunTestWithBp(t,
8431 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8432 java_sdk_library_import {
8433 name: "libfoo",
8434 public: {
8435 jars: ["libbar.jar"],
8436 },
8437 apex_available: [
8438 "com.android.myapex",
8439 "com.android.myapex_compressed",
8440 ],
8441 compile_dex: true,
8442 }
8443 `)
8444
8445 module := result.Module("libfoo", "android_common_com.android.myapex")
8446 usesLibraryDep := module.(java.UsesLibraryDependency)
8447 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8448 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8449 usesLibraryDep.DexJarBuildPath().Path())
8450 })
8451
8452 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8453 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8454 image_name: "art",
8455 contents: ["libfoo"],
8456 `)+`
8457 java_sdk_library_import {
8458 name: "libfoo",
8459 public: {
8460 jars: ["libbar.jar"],
8461 },
8462 apex_available: [
8463 "com.android.myapex",
8464 "com.android.myapex_compressed",
8465 ],
8466 compile_dex: true,
8467 }
8468 `)
8469 })
8470}
8471
Jooyung Han548640b2020-04-27 12:10:30 +09008472func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8473 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8474 apex {
8475 name: "myapex",
8476 key: "myapex.key",
8477 updatable: true,
8478 }
8479
8480 apex_key {
8481 name: "myapex.key",
8482 public_key: "testkey.avbpubkey",
8483 private_key: "testkey.pem",
8484 }
8485 `)
8486}
8487
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008488func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8489 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8490 apex {
8491 name: "myapex",
8492 key: "myapex.key",
8493 }
8494
8495 apex_key {
8496 name: "myapex.key",
8497 public_key: "testkey.avbpubkey",
8498 private_key: "testkey.pem",
8499 }
8500 `)
8501}
8502
Jooyung Handfc864c2023-03-20 18:19:07 +09008503func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8504 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008505 apex {
8506 name: "myapex",
8507 key: "myapex.key",
8508 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008509 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008510 soc_specific: true,
8511 }
8512
8513 apex_key {
8514 name: "myapex.key",
8515 public_key: "testkey.avbpubkey",
8516 private_key: "testkey.pem",
8517 }
8518 `)
8519}
8520
Jooyung Han02873da2023-03-22 17:41:03 +09008521func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8522 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8523 apex {
8524 name: "myapex",
8525 key: "myapex.key",
8526 updatable: false,
8527 min_sdk_version: "29",
8528 use_vndk_as_stable: true,
8529 vendor: true,
8530 }
8531
8532 apex_key {
8533 name: "myapex.key",
8534 public_key: "testkey.avbpubkey",
8535 private_key: "testkey.pem",
8536 }
8537 `)
8538}
8539
Jooyung Handfc864c2023-03-20 18:19:07 +09008540func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8541 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8542 apex {
8543 name: "myapex",
8544 key: "myapex.key",
8545 updatable: false,
8546 use_vndk_as_stable: true,
8547 }
8548
8549 apex_key {
8550 name: "myapex.key",
8551 public_key: "testkey.avbpubkey",
8552 private_key: "testkey.pem",
8553 }
8554 `)
8555}
8556
satayevb98371c2021-06-15 16:49:50 +01008557func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8558 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8559 apex {
8560 name: "myapex",
8561 key: "myapex.key",
8562 systemserverclasspath_fragments: [
8563 "mysystemserverclasspathfragment",
8564 ],
8565 min_sdk_version: "29",
8566 updatable: true,
8567 }
8568
8569 apex_key {
8570 name: "myapex.key",
8571 public_key: "testkey.avbpubkey",
8572 private_key: "testkey.pem",
8573 }
8574
8575 java_library {
8576 name: "foo",
8577 srcs: ["b.java"],
8578 min_sdk_version: "29",
8579 installable: true,
8580 apex_available: [
8581 "myapex",
8582 ],
8583 }
8584
8585 systemserverclasspath_fragment {
8586 name: "mysystemserverclasspathfragment",
8587 generate_classpaths_proto: false,
8588 contents: [
8589 "foo",
8590 ],
8591 apex_available: [
8592 "myapex",
8593 ],
8594 }
satayevabcd5972021-08-06 17:49:46 +01008595 `,
8596 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8597 )
satayevb98371c2021-06-15 16:49:50 +01008598}
8599
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008600func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008601 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
8602 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
8603 // modules to be included in the BootJars.
8604 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
8605 return android.GroupFixturePreparers(
8606 dexpreopt.FixtureSetBootJars(bootJars...),
8607 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8608 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8609 }),
8610 )
8611 }
8612
8613 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
8614 // same value. This can result in an invalid configuration as it allows non art apex jars to be
8615 // specified in the ArtApexJars configuration.
8616 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
8617 return android.GroupFixturePreparers(
8618 dexpreopt.FixtureSetArtBootJars(bootJars...),
8619 dexpreopt.FixtureSetBootJars(bootJars...),
8620 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8621 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8622 }),
8623 )
8624 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008625
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008626 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008627 preparer := android.GroupFixturePreparers(
8628 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
8629 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8630 )
8631 fragments := []java.ApexVariantReference{
8632 {
8633 Apex: proptools.StringPtr("com.android.art.debug"),
8634 Module: proptools.StringPtr("art-bootclasspath-fragment"),
8635 },
8636 {
8637 Apex: proptools.StringPtr("some-non-updatable-apex"),
8638 Module: proptools.StringPtr("some-non-updatable-fragment"),
8639 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008640 }
satayevabcd5972021-08-06 17:49:46 +01008641 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008642 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008643
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008644 t.Run("updatable jar from ART apex in the platform bootclasspath => error", func(t *testing.T) {
8645 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the platform bootclasspath`
Paul Duffin60264a02021-04-12 20:02:36 +01008646 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01008647 preparer := android.GroupFixturePreparers(
8648 prepareSetBootJars("com.android.art.debug:some-art-lib"),
8649 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8650 )
Paul Duffin60264a02021-04-12 20:02:36 +01008651 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008652 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008653
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008654 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008655 err := `ArtApexJars expects this to be in apex "some-updatable-apex" but this is only in apexes.*"com.android.art.debug"`
Paul Duffin60264a02021-04-12 20:02:36 +01008656 // Update the dexpreopt ArtApexJars directly.
8657 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
8658 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008659 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008660
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008661 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008662 err := `ArtApexJars expects this to be in apex "some-non-updatable-apex" but this is only in apexes.*"com.android.art.debug"`
Paul Duffin60264a02021-04-12 20:02:36 +01008663 // Update the dexpreopt ArtApexJars directly.
8664 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
8665 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008666 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008667
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008668 t.Run("updatable jar from some other apex in the platform bootclasspath => error", func(t *testing.T) {
8669 err := `module "some-updatable-apex-lib" from updatable apexes \["some-updatable-apex"\] is not allowed in the platform bootclasspath`
satayevabcd5972021-08-06 17:49:46 +01008670 preparer := android.GroupFixturePreparers(
8671 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
8672 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8673 )
Paul Duffin60264a02021-04-12 20:02:36 +01008674 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008675 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008676
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008677 t.Run("non-updatable jar from some other apex in the platform bootclasspath => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008678 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01008679 fragment := java.ApexVariantReference{
8680 Apex: proptools.StringPtr("some-non-updatable-apex"),
8681 Module: proptools.StringPtr("some-non-updatable-fragment"),
8682 }
8683 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008684 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008685
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008686 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008687 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008688 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8689 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008690 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008691
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008692 t.Run("nonexistent jar in the platform bootclasspath => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008693 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008694 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8695 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008696 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008697
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008698 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008699 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01008700 // Update the dexpreopt ArtApexJars directly.
8701 preparer := prepareSetArtJars("platform:some-platform-lib")
8702 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008703 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008704
Jiakai Zhangc08c1622023-05-10 18:38:34 +01008705 t.Run("platform jar in the platform bootclasspath => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008706 preparer := android.GroupFixturePreparers(
8707 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8708 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8709 )
8710 fragments := []java.ApexVariantReference{
8711 {
8712 Apex: proptools.StringPtr("some-non-updatable-apex"),
8713 Module: proptools.StringPtr("some-non-updatable-fragment"),
8714 },
8715 }
8716 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008717 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008718}
8719
8720func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008721 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008722 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008723 fragment := java.ApexVariantReference{
8724 Apex: proptools.StringPtr("myapex"),
8725 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8726 }
8727
Paul Duffin064b70c2020-11-02 17:32:38 +00008728 testDexpreoptWithApexes(t, `
8729 prebuilt_apex {
8730 name: "myapex" ,
8731 arch: {
8732 arm64: {
8733 src: "myapex-arm64.apex",
8734 },
8735 arm: {
8736 src: "myapex-arm.apex",
8737 },
8738 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008739 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8740 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008741
Paul Duffin89f570a2021-06-16 01:42:33 +01008742 prebuilt_bootclasspath_fragment {
8743 name: "my-bootclasspath-fragment",
8744 contents: ["libfoo"],
8745 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008746 hidden_api: {
8747 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8748 metadata: "my-bootclasspath-fragment/metadata.csv",
8749 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008750 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8751 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8752 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008753 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008754 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008755
Paul Duffin89f570a2021-06-16 01:42:33 +01008756 java_import {
8757 name: "libfoo",
8758 jars: ["libfoo.jar"],
8759 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008760 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008761 }
8762 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008763 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008764}
8765
Spandan Dasf14e2542021-11-12 00:01:37 +00008766func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008767 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008768 bp += `
8769 apex_key {
8770 name: "myapex.key",
8771 public_key: "testkey.avbpubkey",
8772 private_key: "testkey.pem",
8773 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008774 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008775 "lib1/src/A.java": nil,
8776 "lib2/src/B.java": nil,
8777 "system/sepolicy/apex/myapex-file_contexts": nil,
8778 }
8779
Paul Duffin45338f02021-03-30 23:07:52 +01008780 errorHandler := android.FixtureExpectsNoErrors
8781 if errmsg != "" {
8782 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008783 }
Colin Crossae8600b2020-10-29 17:09:13 -07008784
Paul Duffin45338f02021-03-30 23:07:52 +01008785 android.GroupFixturePreparers(
8786 android.PrepareForTestWithAndroidBuildComponents,
8787 java.PrepareForTestWithJavaBuildComponents,
8788 PrepareForTestWithApexBuildComponents,
8789 android.PrepareForTestWithNeverallowRules(rules),
8790 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008791 apexBootJars := make([]string, 0, len(bootJars))
8792 for _, apexBootJar := range bootJars {
8793 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008794 }
satayevd604b212021-07-21 14:23:52 +01008795 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008796 }),
8797 fs.AddToFixture(),
8798 ).
8799 ExtendWithErrorHandler(errorHandler).
8800 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008801}
8802
8803func TestApexPermittedPackagesRules(t *testing.T) {
8804 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008805 name string
8806 expectedError string
8807 bp string
8808 bootJars []string
8809 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008810 }{
8811
8812 {
8813 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8814 expectedError: "",
8815 bp: `
8816 java_library {
8817 name: "bcp_lib1",
8818 srcs: ["lib1/src/*.java"],
8819 permitted_packages: ["foo.bar"],
8820 apex_available: ["myapex"],
8821 sdk_version: "none",
8822 system_modules: "none",
8823 }
8824 java_library {
8825 name: "nonbcp_lib2",
8826 srcs: ["lib2/src/*.java"],
8827 apex_available: ["myapex"],
8828 permitted_packages: ["a.b"],
8829 sdk_version: "none",
8830 system_modules: "none",
8831 }
8832 apex {
8833 name: "myapex",
8834 key: "myapex.key",
8835 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008836 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008837 }`,
8838 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008839 bcpPermittedPackages: map[string][]string{
8840 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008841 "foo.bar",
8842 },
8843 },
8844 },
8845 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008846 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008847 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 +01008848 bp: `
8849 java_library {
8850 name: "bcp_lib1",
8851 srcs: ["lib1/src/*.java"],
8852 apex_available: ["myapex"],
8853 permitted_packages: ["foo.bar"],
8854 sdk_version: "none",
8855 system_modules: "none",
8856 }
8857 java_library {
8858 name: "bcp_lib2",
8859 srcs: ["lib2/src/*.java"],
8860 apex_available: ["myapex"],
8861 permitted_packages: ["foo.bar", "bar.baz"],
8862 sdk_version: "none",
8863 system_modules: "none",
8864 }
8865 apex {
8866 name: "myapex",
8867 key: "myapex.key",
8868 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008869 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008870 }
8871 `,
8872 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008873 bcpPermittedPackages: map[string][]string{
8874 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008875 "foo.bar",
8876 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008877 "bcp_lib2": []string{
8878 "foo.bar",
8879 },
8880 },
8881 },
8882 {
8883 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8884 expectedError: "",
8885 bp: `
8886 java_library {
8887 name: "bcp_lib_restricted",
8888 srcs: ["lib1/src/*.java"],
8889 apex_available: ["myapex"],
8890 permitted_packages: ["foo.bar"],
8891 sdk_version: "none",
8892 min_sdk_version: "29",
8893 system_modules: "none",
8894 }
8895 java_library {
8896 name: "bcp_lib_unrestricted",
8897 srcs: ["lib2/src/*.java"],
8898 apex_available: ["myapex"],
8899 permitted_packages: ["foo.bar", "bar.baz"],
8900 sdk_version: "none",
8901 min_sdk_version: "29",
8902 system_modules: "none",
8903 }
8904 apex {
8905 name: "myapex",
8906 key: "myapex.key",
8907 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8908 updatable: true,
8909 min_sdk_version: "29",
8910 }
8911 `,
8912 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8913 bcpPermittedPackages: map[string][]string{
8914 "bcp_lib1_non_updateable": []string{
8915 "foo.bar",
8916 },
8917 // 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 +01008918 },
8919 },
8920 }
8921 for _, tc := range testcases {
8922 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008923 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8924 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008925 })
8926 }
8927}
8928
Jiyong Park62304bb2020-04-13 16:19:48 +09008929func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008930 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008931 apex {
8932 name: "myapex",
8933 key: "myapex.key",
8934 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008935 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008936 }
8937
8938 apex_key {
8939 name: "myapex.key",
8940 public_key: "testkey.avbpubkey",
8941 private_key: "testkey.pem",
8942 }
8943
8944 cc_library {
8945 name: "mylib",
8946 srcs: ["mylib.cpp"],
8947 system_shared_libs: [],
8948 stl: "none",
8949 stubs: {
8950 versions: ["1"],
8951 },
8952 apex_available: ["myapex"],
8953 }
8954
8955 cc_library {
8956 name: "myprivlib",
8957 srcs: ["mylib.cpp"],
8958 system_shared_libs: [],
8959 stl: "none",
8960 apex_available: ["myapex"],
8961 }
8962
8963
8964 cc_test {
8965 name: "mytest",
8966 gtest: false,
8967 srcs: ["mylib.cpp"],
8968 system_shared_libs: [],
8969 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008970 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008971 test_for: ["myapex"]
8972 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008973
8974 cc_library {
8975 name: "mytestlib",
8976 srcs: ["mylib.cpp"],
8977 system_shared_libs: [],
8978 shared_libs: ["mylib", "myprivlib"],
8979 stl: "none",
8980 test_for: ["myapex"],
8981 }
8982
8983 cc_benchmark {
8984 name: "mybench",
8985 srcs: ["mylib.cpp"],
8986 system_shared_libs: [],
8987 shared_libs: ["mylib", "myprivlib"],
8988 stl: "none",
8989 test_for: ["myapex"],
8990 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008991 `)
8992
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008993 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008994 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008995 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8996 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8997 }
8998
8999 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09009000 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009001 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9002 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9003 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9004}
Jiyong Park46a512f2020-12-04 18:02:13 +09009005
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009006func TestIndirectTestFor(t *testing.T) {
9007 ctx := testApex(t, `
9008 apex {
9009 name: "myapex",
9010 key: "myapex.key",
9011 native_shared_libs: ["mylib", "myprivlib"],
9012 updatable: false,
9013 }
Jiyong Park46a512f2020-12-04 18:02:13 +09009014
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009015 apex_key {
9016 name: "myapex.key",
9017 public_key: "testkey.avbpubkey",
9018 private_key: "testkey.pem",
9019 }
9020
9021 cc_library {
9022 name: "mylib",
9023 srcs: ["mylib.cpp"],
9024 system_shared_libs: [],
9025 stl: "none",
9026 stubs: {
9027 versions: ["1"],
9028 },
9029 apex_available: ["myapex"],
9030 }
9031
9032 cc_library {
9033 name: "myprivlib",
9034 srcs: ["mylib.cpp"],
9035 system_shared_libs: [],
9036 stl: "none",
9037 shared_libs: ["mylib"],
9038 apex_available: ["myapex"],
9039 }
9040
9041 cc_library {
9042 name: "mytestlib",
9043 srcs: ["mylib.cpp"],
9044 system_shared_libs: [],
9045 shared_libs: ["myprivlib"],
9046 stl: "none",
9047 test_for: ["myapex"],
9048 }
9049 `)
9050
9051 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009052 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009053 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9054 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9055 }
9056
9057 // The platform variant of mytestlib links to the platform variant of the
9058 // internal myprivlib.
9059 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
9060
9061 // The platform variant of myprivlib links to the platform variant of mylib
9062 // and bypasses its stubs.
9063 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 +09009064}
9065
Martin Stjernholmec009002021-03-27 15:18:31 +00009066func TestTestForForLibInOtherApex(t *testing.T) {
9067 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
9068 _ = testApex(t, `
9069 apex {
9070 name: "com.android.art",
9071 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009072 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009073 updatable: false,
9074 }
9075
9076 apex {
9077 name: "com.android.art.debug",
9078 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009079 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009080 updatable: false,
9081 }
9082
9083 apex_key {
9084 name: "myapex.key",
9085 public_key: "testkey.avbpubkey",
9086 private_key: "testkey.pem",
9087 }
9088
9089 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009090 name: "libnativebridge",
9091 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009092 system_shared_libs: [],
9093 stl: "none",
9094 stubs: {
9095 versions: ["1"],
9096 },
9097 apex_available: ["com.android.art", "com.android.art.debug"],
9098 }
9099
9100 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009101 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00009102 srcs: ["mylib.cpp"],
9103 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00009104 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009105 stl: "none",
9106 apex_available: ["com.android.art.debug"],
9107 test_for: ["com.android.art"],
9108 }
9109 `,
9110 android.MockFS{
9111 "system/sepolicy/apex/com.android.art-file_contexts": nil,
9112 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
9113 }.AddToFixture())
9114}
9115
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009116// TODO(jungjw): Move this to proptools
9117func intPtr(i int) *int {
9118 return &i
9119}
9120
9121func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009122 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009123 apex_set {
9124 name: "myapex",
9125 set: "myapex.apks",
9126 filename: "foo_v2.apex",
9127 overrides: ["foo"],
9128 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009129 `,
9130 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9131 variables.Platform_sdk_version = intPtr(30)
9132 }),
9133 android.FixtureModifyConfig(func(config android.Config) {
9134 config.Targets[android.Android] = []android.Target{
9135 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9136 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9137 }
9138 }),
9139 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009140
Paul Duffin24704672021-04-06 16:09:30 +01009141 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009142
9143 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009144 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009145 actual := extractedApex.Args["abis"]
9146 expected := "ARMEABI_V7A,ARM64_V8A"
9147 if actual != expected {
9148 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9149 }
9150 actual = extractedApex.Args["sdk-version"]
9151 expected = "30"
9152 if actual != expected {
9153 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9154 }
9155
Paul Duffin6717d882021-06-15 19:09:41 +01009156 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009157 a := m.Module().(*ApexSet)
9158 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009159 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009160 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9161 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9162 }
9163}
9164
Anton Hansson805e0a52022-11-25 14:06:46 +00009165func TestApexSet_NativeBridge(t *testing.T) {
9166 ctx := testApex(t, `
9167 apex_set {
9168 name: "myapex",
9169 set: "myapex.apks",
9170 filename: "foo_v2.apex",
9171 overrides: ["foo"],
9172 }
9173 `,
9174 android.FixtureModifyConfig(func(config android.Config) {
9175 config.Targets[android.Android] = []android.Target{
9176 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9177 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9178 }
9179 }),
9180 )
9181
9182 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
9183
9184 // Check extract_apks tool parameters. No native bridge arch expected
9185 extractedApex := m.Output("extracted/myapex.apks")
9186 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9187}
9188
Jiyong Park7d95a512020-05-10 15:16:24 +09009189func TestNoStaticLinkingToStubsLib(t *testing.T) {
9190 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9191 apex {
9192 name: "myapex",
9193 key: "myapex.key",
9194 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009195 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009196 }
9197
9198 apex_key {
9199 name: "myapex.key",
9200 public_key: "testkey.avbpubkey",
9201 private_key: "testkey.pem",
9202 }
9203
9204 cc_library {
9205 name: "mylib",
9206 srcs: ["mylib.cpp"],
9207 static_libs: ["otherlib"],
9208 system_shared_libs: [],
9209 stl: "none",
9210 apex_available: [ "myapex" ],
9211 }
9212
9213 cc_library {
9214 name: "otherlib",
9215 srcs: ["mylib.cpp"],
9216 system_shared_libs: [],
9217 stl: "none",
9218 stubs: {
9219 versions: ["1", "2", "3"],
9220 },
9221 apex_available: [ "myapex" ],
9222 }
9223 `)
9224}
9225
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009226func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009227 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009228 apex {
9229 name: "myapex",
9230 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009231 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009232 custom_sign_tool: "sign_myapex",
9233 }
9234
9235 apex_key {
9236 name: "myapex.key",
9237 public_key: "testkey.avbpubkey",
9238 private_key: "testkey.pem",
9239 }
9240 `)
9241
9242 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9243 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
9244 ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system_ext" sign_tool="sign_myapex"`)
9245}
9246
9247func TestApexKeysTxtOverrides(t *testing.T) {
9248 ctx := testApex(t, `
9249 apex {
9250 name: "myapex",
9251 key: "myapex.key",
9252 updatable: false,
9253 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009254 }
9255
9256 apex_key {
9257 name: "myapex.key",
9258 public_key: "testkey.avbpubkey",
9259 private_key: "testkey.pem",
9260 }
9261
9262 prebuilt_apex {
9263 name: "myapex",
9264 prefer: true,
9265 arch: {
9266 arm64: {
9267 src: "myapex-arm64.apex",
9268 },
9269 arm: {
9270 src: "myapex-arm.apex",
9271 },
9272 },
9273 }
9274
9275 apex_set {
9276 name: "myapex_set",
9277 set: "myapex.apks",
9278 filename: "myapex_set.apex",
9279 overrides: ["myapex"],
9280 }
9281 `)
9282
9283 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9284 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
9285 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 +09009286 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 +09009287}
9288
Jooyung Han938b5932020-06-20 12:47:47 +09009289func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009290 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009291 apex {
9292 name: "myapex",
9293 key: "myapex.key",
9294 apps: ["app"],
9295 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009296 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009297 }
9298
9299 apex_key {
9300 name: "myapex.key",
9301 public_key: "testkey.avbpubkey",
9302 private_key: "testkey.pem",
9303 }
9304
9305 android_app {
9306 name: "app",
9307 srcs: ["foo/bar/MyClass.java"],
9308 package_name: "foo",
9309 sdk_version: "none",
9310 system_modules: "none",
9311 apex_available: [ "myapex" ],
9312 }
9313 `, withFiles(map[string][]byte{
9314 "sub/Android.bp": []byte(`
9315 override_apex {
9316 name: "override_myapex",
9317 base: "myapex",
9318 apps: ["override_app"],
9319 allowed_files: ":allowed",
9320 }
9321 // Overridable "path" property should be referenced indirectly
9322 filegroup {
9323 name: "allowed",
9324 srcs: ["allowed.txt"],
9325 }
9326 override_android_app {
9327 name: "override_app",
9328 base: "app",
9329 package_name: "bar",
9330 }
9331 `),
9332 }))
9333
9334 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
9335 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9336 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9337 }
9338
9339 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
9340 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9341 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9342 }
9343}
9344
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009345func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009346 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009347 apex {
9348 name: "myapex",
9349 key: "myapex.key",
9350 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009351 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009352 }
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 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009364 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009365 },
9366 apex_available: ["myapex"],
9367 }
9368
9369 cc_prebuilt_library_shared {
9370 name: "mylib",
9371 prefer: false,
9372 srcs: ["prebuilt.so"],
9373 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009374 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009375 },
9376 apex_available: ["myapex"],
9377 }
9378 `)
9379}
9380
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009381func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009382 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009383 apex {
9384 name: "myapex",
9385 key: "myapex.key",
9386 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009387 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009388 }
9389 apex_key {
9390 name: "myapex.key",
9391 public_key: "testkey.avbpubkey",
9392 private_key: "testkey.pem",
9393 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009394 `,
9395 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9396 variables.CompressedApex = proptools.BoolPtr(true)
9397 }),
9398 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009399
9400 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
9401 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9402
9403 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
9404 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9405
9406 // Make sure output of bundle is .capex
9407 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9408 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9409
9410 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009411 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009412 var builder strings.Builder
9413 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9414 androidMk := builder.String()
9415 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9416}
9417
Martin Stjernholm2856c662020-12-02 15:03:42 +00009418func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009419 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009420 apex {
9421 name: "myapex",
9422 key: "myapex.key",
9423 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009424 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009425 }
9426
9427 apex_key {
9428 name: "myapex.key",
9429 public_key: "testkey.avbpubkey",
9430 private_key: "testkey.pem",
9431 }
9432
9433 cc_library {
9434 name: "mylib",
9435 srcs: ["mylib.cpp"],
9436 apex_available: ["myapex"],
9437 shared_libs: ["otherlib"],
9438 system_shared_libs: [],
9439 }
9440
9441 cc_library {
9442 name: "otherlib",
9443 srcs: ["mylib.cpp"],
9444 stubs: {
9445 versions: ["current"],
9446 },
9447 }
9448
9449 cc_prebuilt_library_shared {
9450 name: "otherlib",
9451 prefer: true,
9452 srcs: ["prebuilt.so"],
9453 stubs: {
9454 versions: ["current"],
9455 },
9456 }
9457 `)
9458
9459 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009460 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009461 var builder strings.Builder
9462 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9463 androidMk := builder.String()
9464
9465 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9466 // a thing there.
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009467 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009468}
9469
Jiyong Parke3867542020-12-03 17:28:25 +09009470func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009471 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009472 apex {
9473 name: "myapex",
9474 key: "myapex.key",
9475 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009476 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009477 }
9478
9479 apex_key {
9480 name: "myapex.key",
9481 public_key: "testkey.avbpubkey",
9482 private_key: "testkey.pem",
9483 }
9484
9485 cc_library {
9486 name: "mylib",
9487 srcs: ["mylib.cpp"],
9488 system_shared_libs: [],
9489 stl: "none",
9490 apex_available: ["myapex"],
9491 shared_libs: ["mylib2"],
9492 target: {
9493 apex: {
9494 exclude_shared_libs: ["mylib2"],
9495 },
9496 },
9497 }
9498
9499 cc_library {
9500 name: "mylib2",
9501 srcs: ["mylib.cpp"],
9502 system_shared_libs: [],
9503 stl: "none",
9504 }
9505 `)
9506
9507 // Check if mylib is linked to mylib2 for the non-apex target
9508 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9509 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9510
9511 // Make sure that the link doesn't occur for the apex target
9512 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9513 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9514
9515 // It shouldn't appear in the copy cmd as well.
9516 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
9517 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9518}
9519
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009520func TestPrebuiltStubLibDep(t *testing.T) {
9521 bpBase := `
9522 apex {
9523 name: "myapex",
9524 key: "myapex.key",
9525 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009526 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009527 }
9528 apex_key {
9529 name: "myapex.key",
9530 public_key: "testkey.avbpubkey",
9531 private_key: "testkey.pem",
9532 }
9533 cc_library {
9534 name: "mylib",
9535 srcs: ["mylib.cpp"],
9536 apex_available: ["myapex"],
9537 shared_libs: ["stublib"],
9538 system_shared_libs: [],
9539 }
9540 apex {
9541 name: "otherapex",
9542 enabled: %s,
9543 key: "myapex.key",
9544 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009545 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009546 }
9547 `
9548
9549 stublibSourceBp := `
9550 cc_library {
9551 name: "stublib",
9552 srcs: ["mylib.cpp"],
9553 apex_available: ["otherapex"],
9554 system_shared_libs: [],
9555 stl: "none",
9556 stubs: {
9557 versions: ["1"],
9558 },
9559 }
9560 `
9561
9562 stublibPrebuiltBp := `
9563 cc_prebuilt_library_shared {
9564 name: "stublib",
9565 srcs: ["prebuilt.so"],
9566 apex_available: ["otherapex"],
9567 stubs: {
9568 versions: ["1"],
9569 },
9570 %s
9571 }
9572 `
9573
9574 tests := []struct {
9575 name string
9576 stublibBp string
9577 usePrebuilt bool
9578 modNames []string // Modules to collect AndroidMkEntries for
9579 otherApexEnabled []string
9580 }{
9581 {
9582 name: "only_source",
9583 stublibBp: stublibSourceBp,
9584 usePrebuilt: false,
9585 modNames: []string{"stublib"},
9586 otherApexEnabled: []string{"true", "false"},
9587 },
9588 {
9589 name: "source_preferred",
9590 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9591 usePrebuilt: false,
9592 modNames: []string{"stublib", "prebuilt_stublib"},
9593 otherApexEnabled: []string{"true", "false"},
9594 },
9595 {
9596 name: "prebuilt_preferred",
9597 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9598 usePrebuilt: true,
9599 modNames: []string{"stublib", "prebuilt_stublib"},
9600 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9601 },
9602 {
9603 name: "only_prebuilt",
9604 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9605 usePrebuilt: true,
9606 modNames: []string{"stublib"},
9607 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9608 },
9609 }
9610
9611 for _, test := range tests {
9612 t.Run(test.name, func(t *testing.T) {
9613 for _, otherApexEnabled := range test.otherApexEnabled {
9614 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009615 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009616
9617 type modAndMkEntries struct {
9618 mod *cc.Module
9619 mkEntries android.AndroidMkEntries
9620 }
9621 entries := []*modAndMkEntries{}
9622
9623 // Gather shared lib modules that are installable
9624 for _, modName := range test.modNames {
9625 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9626 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9627 continue
9628 }
9629 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009630 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009631 continue
9632 }
Colin Crossaa255532020-07-03 13:18:24 -07009633 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009634 if ent.Disabled {
9635 continue
9636 }
9637 entries = append(entries, &modAndMkEntries{
9638 mod: mod,
9639 mkEntries: ent,
9640 })
9641 }
9642 }
9643 }
9644
9645 var entry *modAndMkEntries = nil
9646 for _, ent := range entries {
9647 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9648 if entry != nil {
9649 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9650 } else {
9651 entry = ent
9652 }
9653 }
9654 }
9655
9656 if entry == nil {
9657 t.Errorf("AndroidMk entry for \"stublib\" missing")
9658 } else {
9659 isPrebuilt := entry.mod.Prebuilt() != nil
9660 if isPrebuilt != test.usePrebuilt {
9661 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9662 }
9663 if !entry.mod.IsStubs() {
9664 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9665 }
9666 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9667 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9668 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009669 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009670 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009671 if !android.InList(expected, cflags) {
9672 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9673 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009674 }
9675 })
9676 }
9677 })
9678 }
9679}
9680
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009681func TestHostApexInHostOnlyBuild(t *testing.T) {
9682 testApex(t, `
9683 apex {
9684 name: "myapex",
9685 host_supported: true,
9686 key: "myapex.key",
9687 updatable: false,
9688 payload_type: "zip",
9689 }
9690 apex_key {
9691 name: "myapex.key",
9692 public_key: "testkey.avbpubkey",
9693 private_key: "testkey.pem",
9694 }
9695 `,
9696 android.FixtureModifyConfig(func(config android.Config) {
9697 // We may not have device targets in all builds, e.g. in
9698 // prebuilts/build-tools/build-prebuilts.sh
9699 config.Targets[android.Android] = []android.Target{}
9700 }))
9701}
9702
Colin Crossc33e5212021-05-25 18:16:02 -07009703func TestApexJavaCoverage(t *testing.T) {
9704 bp := `
9705 apex {
9706 name: "myapex",
9707 key: "myapex.key",
9708 java_libs: ["mylib"],
9709 bootclasspath_fragments: ["mybootclasspathfragment"],
9710 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9711 updatable: false,
9712 }
9713
9714 apex_key {
9715 name: "myapex.key",
9716 public_key: "testkey.avbpubkey",
9717 private_key: "testkey.pem",
9718 }
9719
9720 java_library {
9721 name: "mylib",
9722 srcs: ["mylib.java"],
9723 apex_available: ["myapex"],
9724 compile_dex: true,
9725 }
9726
9727 bootclasspath_fragment {
9728 name: "mybootclasspathfragment",
9729 contents: ["mybootclasspathlib"],
9730 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009731 hidden_api: {
9732 split_packages: ["*"],
9733 },
Colin Crossc33e5212021-05-25 18:16:02 -07009734 }
9735
9736 java_library {
9737 name: "mybootclasspathlib",
9738 srcs: ["mybootclasspathlib.java"],
9739 apex_available: ["myapex"],
9740 compile_dex: true,
9741 }
9742
9743 systemserverclasspath_fragment {
9744 name: "mysystemserverclasspathfragment",
9745 contents: ["mysystemserverclasspathlib"],
9746 apex_available: ["myapex"],
9747 }
9748
9749 java_library {
9750 name: "mysystemserverclasspathlib",
9751 srcs: ["mysystemserverclasspathlib.java"],
9752 apex_available: ["myapex"],
9753 compile_dex: true,
9754 }
9755 `
9756
9757 result := android.GroupFixturePreparers(
9758 PrepareForTestWithApexBuildComponents,
9759 prepareForTestWithMyapex,
9760 java.PrepareForTestWithJavaDefaultModules,
9761 android.PrepareForTestWithAndroidBuildComponents,
9762 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009763 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9764 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009765 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009766 ).RunTest(t)
9767
9768 // Make sure jacoco ran on both mylib and mybootclasspathlib
9769 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9770 t.Errorf("Failed to find jacoco rule for mylib")
9771 }
9772 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9773 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9774 }
9775 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9776 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9777 }
9778}
9779
Jiyong Park192600a2021-08-03 07:52:17 +00009780func TestProhibitStaticExecutable(t *testing.T) {
9781 testApexError(t, `executable mybin is static`, `
9782 apex {
9783 name: "myapex",
9784 key: "myapex.key",
9785 binaries: ["mybin"],
9786 min_sdk_version: "29",
9787 }
9788
9789 apex_key {
9790 name: "myapex.key",
9791 public_key: "testkey.avbpubkey",
9792 private_key: "testkey.pem",
9793 }
9794
9795 cc_binary {
9796 name: "mybin",
9797 srcs: ["mylib.cpp"],
9798 relative_install_path: "foo/bar",
9799 static_executable: true,
9800 system_shared_libs: [],
9801 stl: "none",
9802 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009803 min_sdk_version: "29",
9804 }
9805 `)
9806
9807 testApexError(t, `executable mybin.rust is static`, `
9808 apex {
9809 name: "myapex",
9810 key: "myapex.key",
9811 binaries: ["mybin.rust"],
9812 min_sdk_version: "29",
9813 }
9814
9815 apex_key {
9816 name: "myapex.key",
9817 public_key: "testkey.avbpubkey",
9818 private_key: "testkey.pem",
9819 }
9820
9821 rust_binary {
9822 name: "mybin.rust",
9823 srcs: ["foo.rs"],
9824 static_executable: true,
9825 apex_available: ["myapex"],
9826 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009827 }
9828 `)
9829}
9830
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009831func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9832 ctx := testApex(t, `
9833 apex {
9834 name: "myapex",
9835 key: "myapex.key",
9836 updatable: false,
9837 java_libs: ["foo"],
9838 }
9839
9840 apex_key {
9841 name: "myapex.key",
9842 public_key: "testkey.avbpubkey",
9843 private_key: "testkey.pem",
9844 }
9845
9846 java_library {
9847 name: "foo",
9848 srcs: ["foo.java"],
9849 apex_available: ["myapex"],
9850 installable: true,
9851 }
9852 `,
9853 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9854 )
9855
9856 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9857 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9858 var builder strings.Builder
9859 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9860 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009861 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex\n")
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009862}
9863
9864func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9865 ctx := testApex(t, `
9866 prebuilt_apex {
9867 name: "myapex",
9868 arch: {
9869 arm64: {
9870 src: "myapex-arm64.apex",
9871 },
9872 arm: {
9873 src: "myapex-arm.apex",
9874 },
9875 },
9876 exported_java_libs: ["foo"],
9877 }
9878
9879 java_import {
9880 name: "foo",
9881 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009882 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009883 }
9884 `,
9885 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9886 )
9887
9888 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9889 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9890 mainModuleEntries := entriesList[0]
9891 android.AssertArrayString(t,
9892 "LOCAL_REQUIRED_MODULES",
9893 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9894 []string{
9895 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9896 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9897 })
9898}
9899
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009900func TestAndroidMk_RequiredModules(t *testing.T) {
9901 ctx := testApex(t, `
9902 apex {
9903 name: "myapex",
9904 key: "myapex.key",
9905 updatable: false,
9906 java_libs: ["foo"],
9907 required: ["otherapex"],
9908 }
9909
9910 apex {
9911 name: "otherapex",
9912 key: "myapex.key",
9913 updatable: false,
9914 java_libs: ["foo"],
9915 required: ["otherapex"],
9916 }
9917
9918 apex_key {
9919 name: "myapex.key",
9920 public_key: "testkey.avbpubkey",
9921 private_key: "testkey.pem",
9922 }
9923
9924 java_library {
9925 name: "foo",
9926 srcs: ["foo.java"],
9927 apex_available: ["myapex", "otherapex"],
9928 installable: true,
9929 }
9930 `)
9931
9932 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9933 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9934 var builder strings.Builder
9935 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9936 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009937 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009938}
9939
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009940func TestAndroidMk_RequiredDeps(t *testing.T) {
9941 ctx := testApex(t, `
9942 apex {
9943 name: "myapex",
9944 key: "myapex.key",
9945 updatable: false,
9946 }
9947
9948 apex_key {
9949 name: "myapex.key",
9950 public_key: "testkey.avbpubkey",
9951 private_key: "testkey.pem",
9952 }
9953 `)
9954
9955 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009956 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009957 data := android.AndroidMkDataForTest(t, ctx, bundle)
9958 var builder strings.Builder
9959 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9960 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009961 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009962
9963 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009964 flattenedBundle.makeModulesToInstall = append(flattenedBundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009965 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9966 var flattenedBuilder strings.Builder
9967 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9968 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009969 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009970}
9971
Jooyung Hana6d36672022-02-24 13:58:07 +09009972func TestApexOutputFileProducer(t *testing.T) {
9973 for _, tc := range []struct {
9974 name string
9975 ref string
9976 expected_data []string
9977 }{
9978 {
9979 name: "test_using_output",
9980 ref: ":myapex",
9981 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9982 },
9983 {
9984 name: "test_using_apex",
9985 ref: ":myapex{.apex}",
9986 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9987 },
9988 } {
9989 t.Run(tc.name, func(t *testing.T) {
9990 ctx := testApex(t, `
9991 apex {
9992 name: "myapex",
9993 key: "myapex.key",
9994 compressible: true,
9995 updatable: false,
9996 }
9997
9998 apex_key {
9999 name: "myapex.key",
10000 public_key: "testkey.avbpubkey",
10001 private_key: "testkey.pem",
10002 }
10003
10004 java_test {
10005 name: "`+tc.name+`",
10006 srcs: ["a.java"],
10007 data: ["`+tc.ref+`"],
10008 }
10009 `,
10010 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
10011 variables.CompressedApex = proptools.BoolPtr(true)
10012 }))
10013 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
10014 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
10015 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
10016 })
10017 }
10018}
10019
satayev758968a2021-12-06 11:42:40 +000010020func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
10021 preparer := android.GroupFixturePreparers(
10022 PrepareForTestWithApexBuildComponents,
10023 prepareForTestWithMyapex,
10024 java.PrepareForTestWithJavaSdkLibraryFiles,
10025 java.PrepareForTestWithJavaDefaultModules,
10026 android.PrepareForTestWithAndroidBuildComponents,
10027 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
10028 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
10029 )
10030
10031 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
10032 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10033 preparer.RunTestWithBp(t, `
10034 apex {
10035 name: "myapex",
10036 key: "myapex.key",
10037 bootclasspath_fragments: ["mybootclasspathfragment"],
10038 min_sdk_version: "30",
10039 updatable: false,
10040 }
10041
10042 apex_key {
10043 name: "myapex.key",
10044 public_key: "testkey.avbpubkey",
10045 private_key: "testkey.pem",
10046 }
10047
10048 bootclasspath_fragment {
10049 name: "mybootclasspathfragment",
10050 contents: ["mybootclasspathlib"],
10051 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010052 hidden_api: {
10053 split_packages: ["*"],
10054 },
satayev758968a2021-12-06 11:42:40 +000010055 }
10056
10057 java_sdk_library {
10058 name: "mybootclasspathlib",
10059 srcs: ["mybootclasspathlib.java"],
10060 apex_available: ["myapex"],
10061 compile_dex: true,
10062 unsafe_ignore_missing_latest_api: true,
10063 min_sdk_version: "31",
10064 static_libs: ["util"],
10065 }
10066
10067 java_library {
10068 name: "util",
10069 srcs: ["a.java"],
10070 apex_available: ["myapex"],
10071 min_sdk_version: "31",
10072 static_libs: ["another_util"],
10073 }
10074
10075 java_library {
10076 name: "another_util",
10077 srcs: ["a.java"],
10078 min_sdk_version: "31",
10079 apex_available: ["myapex"],
10080 }
10081 `)
10082 })
10083
10084 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
10085 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10086 preparer.RunTestWithBp(t, `
10087 apex {
10088 name: "myapex",
10089 key: "myapex.key",
10090 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10091 min_sdk_version: "30",
10092 updatable: false,
10093 }
10094
10095 apex_key {
10096 name: "myapex.key",
10097 public_key: "testkey.avbpubkey",
10098 private_key: "testkey.pem",
10099 }
10100
10101 systemserverclasspath_fragment {
10102 name: "mysystemserverclasspathfragment",
10103 contents: ["mysystemserverclasspathlib"],
10104 apex_available: ["myapex"],
10105 }
10106
10107 java_sdk_library {
10108 name: "mysystemserverclasspathlib",
10109 srcs: ["mysystemserverclasspathlib.java"],
10110 apex_available: ["myapex"],
10111 compile_dex: true,
10112 min_sdk_version: "32",
10113 unsafe_ignore_missing_latest_api: true,
10114 static_libs: ["util"],
10115 }
10116
10117 java_library {
10118 name: "util",
10119 srcs: ["a.java"],
10120 apex_available: ["myapex"],
10121 min_sdk_version: "31",
10122 static_libs: ["another_util"],
10123 }
10124
10125 java_library {
10126 name: "another_util",
10127 srcs: ["a.java"],
10128 min_sdk_version: "31",
10129 apex_available: ["myapex"],
10130 }
10131 `)
10132 })
10133
10134 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10135 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
10136 RunTestWithBp(t, `
10137 apex {
10138 name: "myapex",
10139 key: "myapex.key",
10140 bootclasspath_fragments: ["mybootclasspathfragment"],
10141 min_sdk_version: "30",
10142 updatable: false,
10143 }
10144
10145 apex_key {
10146 name: "myapex.key",
10147 public_key: "testkey.avbpubkey",
10148 private_key: "testkey.pem",
10149 }
10150
10151 bootclasspath_fragment {
10152 name: "mybootclasspathfragment",
10153 contents: ["mybootclasspathlib"],
10154 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010155 hidden_api: {
10156 split_packages: ["*"],
10157 },
satayev758968a2021-12-06 11:42:40 +000010158 }
10159
10160 java_sdk_library {
10161 name: "mybootclasspathlib",
10162 srcs: ["mybootclasspathlib.java"],
10163 apex_available: ["myapex"],
10164 compile_dex: true,
10165 unsafe_ignore_missing_latest_api: true,
10166 }
10167 `)
10168 })
10169
10170 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10171 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10172 RunTestWithBp(t, `
10173 apex {
10174 name: "myapex",
10175 key: "myapex.key",
10176 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10177 min_sdk_version: "30",
10178 updatable: false,
10179 }
10180
10181 apex_key {
10182 name: "myapex.key",
10183 public_key: "testkey.avbpubkey",
10184 private_key: "testkey.pem",
10185 }
10186
10187 systemserverclasspath_fragment {
10188 name: "mysystemserverclasspathfragment",
10189 contents: ["mysystemserverclasspathlib"],
10190 apex_available: ["myapex"],
10191 }
10192
10193 java_sdk_library {
10194 name: "mysystemserverclasspathlib",
10195 srcs: ["mysystemserverclasspathlib.java"],
10196 apex_available: ["myapex"],
10197 compile_dex: true,
10198 unsafe_ignore_missing_latest_api: true,
10199 }
10200 `)
10201 })
10202}
10203
Jiakai Zhang6decef92022-01-12 17:56:19 +000010204// Verifies that the APEX depends on all the Make modules in the list.
10205func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10206 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10207 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010208 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010209 }
10210}
10211
10212// Verifies that the APEX does not depend on any of the Make modules in the list.
10213func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10214 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10215 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010216 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010217 }
10218}
10219
Cole Faust1021ccd2023-02-26 21:15:25 -080010220// TODO(b/193460475): Re-enable this test
10221//func TestApexStrictUpdtabilityLint(t *testing.T) {
10222// bpTemplate := `
10223// apex {
10224// name: "myapex",
10225// key: "myapex.key",
10226// java_libs: ["myjavalib"],
10227// updatable: %v,
10228// min_sdk_version: "29",
10229// }
10230// apex_key {
10231// name: "myapex.key",
10232// }
10233// java_library {
10234// name: "myjavalib",
10235// srcs: ["MyClass.java"],
10236// apex_available: [ "myapex" ],
10237// lint: {
10238// strict_updatability_linting: %v,
10239// },
10240// sdk_version: "current",
10241// min_sdk_version: "29",
10242// }
10243// `
10244// fs := android.MockFS{
10245// "lint-baseline.xml": nil,
10246// }
10247//
10248// testCases := []struct {
10249// testCaseName string
10250// apexUpdatable bool
10251// javaStrictUpdtabilityLint bool
10252// lintFileExists bool
10253// disallowedFlagExpected bool
10254// }{
10255// {
10256// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10257// apexUpdatable: true,
10258// javaStrictUpdtabilityLint: true,
10259// lintFileExists: false,
10260// disallowedFlagExpected: false,
10261// },
10262// {
10263// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10264// apexUpdatable: false,
10265// javaStrictUpdtabilityLint: false,
10266// lintFileExists: true,
10267// disallowedFlagExpected: false,
10268// },
10269// {
10270// testCaseName: "non-updatable apex respects strict updatability of javalib",
10271// apexUpdatable: false,
10272// javaStrictUpdtabilityLint: true,
10273// lintFileExists: true,
10274// disallowedFlagExpected: true,
10275// },
10276// {
10277// testCaseName: "updatable apex sets strict updatability of javalib to true",
10278// apexUpdatable: true,
10279// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10280// lintFileExists: true,
10281// disallowedFlagExpected: true,
10282// },
10283// }
10284//
10285// for _, testCase := range testCases {
10286// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10287// fixtures := []android.FixturePreparer{}
10288// if testCase.lintFileExists {
10289// fixtures = append(fixtures, fs.AddToFixture())
10290// }
10291//
10292// result := testApex(t, bp, fixtures...)
10293// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10294// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10295// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10296//
10297// if disallowedFlagActual != testCase.disallowedFlagExpected {
10298// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10299// }
10300// }
10301//}
10302//
10303//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10304// bp := `
10305// apex {
10306// name: "myapex",
10307// key: "myapex.key",
10308// java_libs: ["myjavalib"],
10309// updatable: true,
10310// min_sdk_version: "29",
10311// }
10312// apex_key {
10313// name: "myapex.key",
10314// }
10315// java_library {
10316// name: "myjavalib",
10317// srcs: ["MyClass.java"],
10318// apex_available: [ "myapex" ],
10319// sdk_version: "current",
10320// min_sdk_version: "29",
10321// }
10322// `
10323//
10324// testCases := []struct {
10325// testCaseName string
10326// moduleDirectory string
10327// disallowedFlagExpected bool
10328// }{
10329// {
10330// testCaseName: "lintable module defined outside libcore",
10331// moduleDirectory: "",
10332// disallowedFlagExpected: true,
10333// },
10334// {
10335// testCaseName: "lintable module defined in libcore root directory",
10336// moduleDirectory: "libcore/",
10337// disallowedFlagExpected: false,
10338// },
10339// {
10340// testCaseName: "lintable module defined in libcore child directory",
10341// moduleDirectory: "libcore/childdir/",
10342// disallowedFlagExpected: true,
10343// },
10344// }
10345//
10346// for _, testCase := range testCases {
10347// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10348// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10349// result := testApex(t, "", lintFileCreator, bpFileCreator)
10350// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10351// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10352// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10353// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10354//
10355// if disallowedFlagActual != testCase.disallowedFlagExpected {
10356// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10357// }
10358// }
10359//}
10360//
10361//// checks transtive deps of an apex coming from bootclasspath_fragment
10362//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10363// bp := `
10364// apex {
10365// name: "myapex",
10366// key: "myapex.key",
10367// bootclasspath_fragments: ["mybootclasspathfragment"],
10368// updatable: true,
10369// min_sdk_version: "29",
10370// }
10371// apex_key {
10372// name: "myapex.key",
10373// }
10374// bootclasspath_fragment {
10375// name: "mybootclasspathfragment",
10376// contents: ["myjavalib"],
10377// apex_available: ["myapex"],
10378// hidden_api: {
10379// split_packages: ["*"],
10380// },
10381// }
10382// java_library {
10383// name: "myjavalib",
10384// srcs: ["MyClass.java"],
10385// apex_available: [ "myapex" ],
10386// sdk_version: "current",
10387// min_sdk_version: "29",
10388// compile_dex: true,
10389// }
10390// `
10391// fs := android.MockFS{
10392// "lint-baseline.xml": nil,
10393// }
10394//
10395// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10396// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10397// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10398// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10399// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10400// }
10401//}
Spandan Das66773252022-01-15 00:23:18 +000010402
Spandan Das42e89502022-05-06 22:12:55 +000010403// updatable apexes should propagate updatable=true to its apps
10404func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10405 bp := `
10406 apex {
10407 name: "myapex",
10408 key: "myapex.key",
10409 updatable: %v,
10410 apps: [
10411 "myapp",
10412 ],
10413 min_sdk_version: "30",
10414 }
10415 apex_key {
10416 name: "myapex.key",
10417 }
10418 android_app {
10419 name: "myapp",
10420 updatable: %v,
10421 apex_available: [
10422 "myapex",
10423 ],
10424 sdk_version: "current",
10425 min_sdk_version: "30",
10426 }
10427 `
10428 testCases := []struct {
10429 name string
10430 apex_is_updatable_bp bool
10431 app_is_updatable_bp bool
10432 app_is_updatable_expected bool
10433 }{
10434 {
10435 name: "Non-updatable apex respects updatable property of non-updatable app",
10436 apex_is_updatable_bp: false,
10437 app_is_updatable_bp: false,
10438 app_is_updatable_expected: false,
10439 },
10440 {
10441 name: "Non-updatable apex respects updatable property of updatable app",
10442 apex_is_updatable_bp: false,
10443 app_is_updatable_bp: true,
10444 app_is_updatable_expected: true,
10445 },
10446 {
10447 name: "Updatable apex respects updatable property of updatable app",
10448 apex_is_updatable_bp: true,
10449 app_is_updatable_bp: true,
10450 app_is_updatable_expected: true,
10451 },
10452 {
10453 name: "Updatable apex sets updatable=true on non-updatable app",
10454 apex_is_updatable_bp: true,
10455 app_is_updatable_bp: false,
10456 app_is_updatable_expected: true,
10457 },
10458 }
10459 for _, testCase := range testCases {
10460 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10461 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10462 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10463 }
10464}
10465
Kiyoung Kim487689e2022-07-26 09:48:22 +090010466func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10467 bp := `
10468 apex {
10469 name: "myapex",
10470 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010471 native_shared_libs: ["libbaz"],
10472 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010473 min_sdk_version: "29",
10474 }
10475 apex_key {
10476 name: "myapex.key",
10477 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010478 cc_binary {
10479 name: "binfoo",
10480 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010481 apex_available: ["myapex"],
10482 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010483 recovery_available: false,
10484 }
10485 cc_library {
10486 name: "libbar",
10487 srcs: ["libbar.cc"],
10488 stubs: {
10489 symbol_file: "libbar.map.txt",
10490 versions: [
10491 "29",
10492 ],
10493 },
10494 }
10495 cc_library {
10496 name: "libbaz",
10497 srcs: ["libbaz.cc"],
10498 apex_available: ["myapex"],
10499 min_sdk_version: "29",
10500 stubs: {
10501 symbol_file: "libbaz.map.txt",
10502 versions: [
10503 "29",
10504 ],
10505 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010506 }
10507 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010508 name: "libbar",
10509 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010510 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010511 variants: ["apex.29"],
10512 }
10513 cc_api_variant {
10514 name: "libbar",
10515 variant: "apex",
10516 version: "29",
10517 src: "libbar_apex_29.so",
10518 }
10519 cc_api_library {
10520 name: "libbaz",
10521 src: "libbaz_stub.so",
10522 min_sdk_version: "29",
10523 variants: ["apex.29"],
10524 }
10525 cc_api_variant {
10526 name: "libbaz",
10527 variant: "apex",
10528 version: "29",
10529 src: "libbaz_apex_29.so",
10530 }
10531 cc_api_library {
10532 name: "libqux",
10533 src: "libqux_stub.so",
10534 min_sdk_version: "29",
10535 variants: ["apex.29"],
10536 }
10537 cc_api_variant {
10538 name: "libqux",
10539 variant: "apex",
10540 version: "29",
10541 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010542 }
10543 api_imports {
10544 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010545 apex_shared_libs: [
10546 "libbar",
10547 "libbaz",
10548 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010549 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010550 }
10551 `
10552 result := testApex(t, bp)
10553
10554 hasDep := func(m android.Module, wantDep android.Module) bool {
10555 t.Helper()
10556 var found bool
10557 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10558 if dep == wantDep {
10559 found = true
10560 }
10561 })
10562 return found
10563 }
10564
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010565 // Library defines stubs and cc_api_library should be used with cc_api_library
10566 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10567 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10568 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010569
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010570 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10571 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010572
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010573 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10574 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10575 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10576 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10577
10578 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10579 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10580 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10581 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10582 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10583
10584 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10585 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10586 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10587
10588 // cc_api_library defined without original library should be linked with cc_api_library
10589 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10590 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10591 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10592}
10593
10594func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10595 bp := `
10596 apex {
10597 name: "myapex",
10598 key: "myapex.key",
10599 native_shared_libs: ["libbar"],
10600 min_sdk_version: "29",
10601 }
10602 apex_key {
10603 name: "myapex.key",
10604 }
10605 cc_binary {
10606 name: "binfoo",
10607 shared_libs: ["libbar"],
10608 recovery_available: false,
10609 }
10610 cc_library {
10611 name: "libbar",
10612 srcs: ["libbar.cc"],
10613 apex_available: ["myapex"],
10614 min_sdk_version: "29",
10615 stubs: {
10616 symbol_file: "libbar.map.txt",
10617 versions: [
10618 "29",
10619 ],
10620 },
10621 }
10622 cc_api_library {
10623 name: "libbar",
10624 src: "libbar_stub.so",
10625 variants: ["apex.29"],
10626 }
10627 cc_api_variant {
10628 name: "libbar",
10629 variant: "apex",
10630 version: "29",
10631 src: "libbar_apex_29.so",
10632 }
10633 api_imports {
10634 name: "api_imports",
10635 apex_shared_libs: [
10636 "libbar",
10637 ],
10638 }
10639 `
10640
10641 result := testApex(t, bp)
10642
10643 hasDep := func(m android.Module, wantDep android.Module) bool {
10644 t.Helper()
10645 var found bool
10646 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10647 if dep == wantDep {
10648 found = true
10649 }
10650 })
10651 return found
10652 }
10653
10654 // Library defines stubs and cc_api_library should be used with cc_api_library
10655 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10656 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10657 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10658
10659 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10660 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10661
10662 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10663 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10664 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10665 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010666}
Dennis Shend4f5d932023-01-31 20:27:21 +000010667
10668func TestTrimmedApex(t *testing.T) {
10669 bp := `
10670 apex {
10671 name: "myapex",
10672 key: "myapex.key",
10673 native_shared_libs: ["libfoo","libbaz"],
10674 min_sdk_version: "29",
10675 trim_against: "mydcla",
10676 }
10677 apex {
10678 name: "mydcla",
10679 key: "myapex.key",
10680 native_shared_libs: ["libfoo","libbar"],
10681 min_sdk_version: "29",
10682 file_contexts: ":myapex-file_contexts",
10683 dynamic_common_lib_apex: true,
10684 }
10685 apex_key {
10686 name: "myapex.key",
10687 }
10688 cc_library {
10689 name: "libfoo",
10690 shared_libs: ["libc"],
10691 apex_available: ["myapex","mydcla"],
10692 min_sdk_version: "29",
10693 }
10694 cc_library {
10695 name: "libbar",
10696 shared_libs: ["libc"],
10697 apex_available: ["myapex","mydcla"],
10698 min_sdk_version: "29",
10699 }
10700 cc_library {
10701 name: "libbaz",
10702 shared_libs: ["libc"],
10703 apex_available: ["myapex","mydcla"],
10704 min_sdk_version: "29",
10705 }
10706 cc_api_library {
10707 name: "libc",
10708 src: "libc.so",
10709 min_sdk_version: "29",
10710 recovery_available: true,
10711 }
10712 api_imports {
10713 name: "api_imports",
10714 shared_libs: [
10715 "libc",
10716 ],
10717 header_libs: [],
10718 }
10719 `
10720 ctx := testApex(t, bp)
10721 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10722 apexRule := module.MaybeRule("apexRule")
10723 if apexRule.Rule == nil {
10724 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10725 }
10726
10727 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
10728 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
10729 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10730 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10731 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10732 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10733}
Jingwen Chendea7a642023-03-28 11:30:50 +000010734
10735func TestCannedFsConfig(t *testing.T) {
10736 ctx := testApex(t, `
10737 apex {
10738 name: "myapex",
10739 key: "myapex.key",
10740 updatable: false,
10741 }
10742
10743 apex_key {
10744 name: "myapex.key",
10745 public_key: "testkey.avbpubkey",
10746 private_key: "testkey.pem",
10747 }`)
10748 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10749 generateFsRule := mod.Rule("generateFsConfig")
10750 cmd := generateFsRule.RuleParams.Command
10751
10752 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10753}
10754
10755func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10756 ctx := testApex(t, `
10757 apex {
10758 name: "myapex",
10759 key: "myapex.key",
10760 canned_fs_config: "my_config",
10761 updatable: false,
10762 }
10763
10764 apex_key {
10765 name: "myapex.key",
10766 public_key: "testkey.avbpubkey",
10767 private_key: "testkey.pem",
10768 }`)
10769 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10770 generateFsRule := mod.Rule("generateFsConfig")
10771 cmd := generateFsRule.RuleParams.Command
10772
10773 // Ensure that canned_fs_config has "cat my_config" at the end
10774 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10775}
Spandan Das20fce2d2023-04-12 17:21:39 +000010776
10777func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10778 testCases := []struct {
10779 desc string
10780 hasStubs bool
10781 apexAvailable string
10782 expectedError string
10783 }{
10784 {
10785 desc: "non-stub library can have multiple apex_available",
10786 hasStubs: false,
10787 apexAvailable: `["myapex", "otherapex"]`,
10788 },
10789 {
10790 desc: "stub library should not be available to anyapex",
10791 hasStubs: true,
10792 apexAvailable: `["//apex_available:anyapex"]`,
10793 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10794 },
10795 {
10796 desc: "stub library should not be available to multiple apexes",
10797 hasStubs: true,
10798 apexAvailable: `["myapex", "otherapex"]`,
10799 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10800 },
10801 {
10802 desc: "stub library can be available to a core apex and a test apex",
10803 hasStubs: true,
10804 apexAvailable: `["myapex", "test_myapex"]`,
10805 },
10806 }
10807 bpTemplate := `
10808 cc_library {
10809 name: "libfoo",
10810 %v
10811 apex_available: %v,
10812 }
10813 apex {
10814 name: "myapex",
10815 key: "apex.key",
10816 updatable: false,
10817 native_shared_libs: ["libfoo"],
10818 }
10819 apex {
10820 name: "otherapex",
10821 key: "apex.key",
10822 updatable: false,
10823 }
10824 apex_test {
10825 name: "test_myapex",
10826 key: "apex.key",
10827 updatable: false,
10828 native_shared_libs: ["libfoo"],
10829 }
10830 apex_key {
10831 name: "apex.key",
10832 }
10833 `
10834 for _, tc := range testCases {
10835 stubs := ""
10836 if tc.hasStubs {
10837 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10838 }
10839 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10840 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10841 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10842 })
10843 if tc.expectedError == "" {
10844 testApex(t, bp, mockFsFixturePreparer)
10845 } else {
10846 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10847 }
10848 }
10849}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010850
10851func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10852 context := android.GroupFixturePreparers(
10853 android.PrepareForIntegrationTestWithAndroid,
10854 cc.PrepareForIntegrationTestWithCc,
10855 PrepareForTestWithApexBuildComponents,
10856 prepareForTestWithMyapex,
10857 filesystem.PrepareForTestWithFilesystemBuildComponents,
10858 )
10859 result := context.RunTestWithBp(t, `
10860 android_system_image {
10861 name: "myfilesystem",
10862 deps: [
10863 "libfoo",
10864 ],
10865 linker_config_src: "linker.config.json",
10866 }
10867
10868 cc_library {
10869 name: "libfoo",
10870 shared_libs: [
10871 "libbar",
10872 ],
10873 stl: "none",
10874 }
10875
10876 cc_library {
10877 name: "libbar",
10878 stl: "none",
10879 apex_available: ["myapex"],
10880 }
10881
10882 apex {
10883 name: "myapex",
10884 native_shared_libs: ["libbar"],
10885 key: "myapex.key",
10886 updatable: false,
10887 }
10888
10889 apex_key {
10890 name: "myapex.key",
10891 public_key: "testkey.avbpubkey",
10892 private_key: "testkey.pem",
10893 }
10894 `)
10895
10896 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10897 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10898 inputs.Strings(),
10899 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10900}